source: python/demos/demo_pitch_sinusoid.py @ eef6335

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5sampleryinfft+
Last change on this file since eef6335 was 4120fbc, checked in by Paul Brossier <piem@piem.org>, 8 years ago

python/demos: python3 and double precision compatibility

  • Property mode set to 100755
File size: 1.7 KB
Line 
1#! /usr/bin/env python
2
3import numpy as np
4import aubio
5
6def build_sinusoid(length, freqs, samplerate):
7    return np.sin( 2. * np.pi * np.arange(length) * freqs / samplerate).astype(aubio.float_type)
8
9def run_pitch(p, input_vec):
10    cands = []
11    for vec_slice in input_vec.reshape((-1, p.hop_size)):
12        a = p(vec_slice)[0]
13        cands.append(a)
14    return cands
15
16methods = ['default', 'schmitt', 'fcomb', 'mcomb', 'yin', 'yinfft']
17
18cands = {}
19buf_size = 2048
20hop_size = 512
21samplerate = 44100
22sin_length = (samplerate * 10) % 512 * 512
23freqs = np.zeros(sin_length)
24
25partition = sin_length // 8
26pointer = 0
27
28pointer += partition
29freqs[pointer: pointer + partition] = 440
30
31pointer += partition
32pointer += partition
33freqs[ pointer : pointer + partition ] = 740
34
35pointer += partition
36freqs[ pointer : pointer + partition ] = 1480
37
38pointer += partition
39pointer += partition
40freqs[ pointer : pointer + partition ] = 400 + 5 * np.random.random(sin_length/8)
41
42a = build_sinusoid(sin_length, freqs, samplerate)
43
44for method in methods:
45    p = aubio.pitch(method, buf_size, hop_size, samplerate)
46    cands[method] = run_pitch(p, a)
47    print(method)
48    print(cands[method])
49
50print("done computing")
51
52if 1:
53    import matplotlib.pyplot as plt
54
55    # times
56    ramp = np.arange(0, sin_length / hop_size).astype('float') * hop_size / samplerate
57
58    # plot each result
59    for method in methods:
60        plt.plot(ramp, cands[method], '.-', label=method)
61
62    # plot ground truth
63    ramp = np.arange(0, sin_length).astype('float') / samplerate
64    plt.plot(ramp, freqs, ':', label = 'ground truth')
65
66    plt.legend(loc='upper left')
67
68    plt.xlabel('time (s)')
69    plt.ylabel('frequency (Hz)')
70    plt.ylim([0,2000])
71    plt.show()
Note: See TracBrowser for help on using the repository browser.