History

python/demos/demo_bench_yin.py: add yin/yinfft benchmark on sine waves

Paul Brossier committed 9 years ago

Commit f98063b1 parent f131ba81 file · +50 −0Browse files

Showing the changes to python (1 of 1 file). Show all

Unified · Split

python/demos/demo_bench_yin.py+50−0
@@ -0,0 +1,50 @@
1+#! /usr/bin/env python
2+
3+import numpy as np
4+from aubio import pitch
5+import pylab as plt
6+
7+buf_size = 2048 * 1
8+hop_size = buf_size // 4
9+
10+samplerate = 44100
11+minfreq = 40
12+maxfreq = 6000
13+
14+def sinewave(freq, duration, samplerate = samplerate):
15+ """ generate a sinewave """
16+ length = hop_size
17+ while length < duration * samplerate:
18+ length += hop_size
19+ return np.sin( 2. * np.pi * np.arange(length) * freq / samplerate ).astype("float32")
20+
21+def get_stats_for_pitch_method(method, freqs, samplerate = samplerate):
22+ """ for a given pitch method and a list of frequency, generate a sinewave
23+ and get mean deviation """
24+ means = np.zeros(len(freqs))
25+ medians = np.zeros(len(freqs))
26+ for freq, fn in zip(freqs, range(len(freqs))):
27+ s = sinewave(freq, .50).reshape(-1, hop_size)
28+ #s = (sinewave(freq, .50) + .0*sinewave(freq/2., .50)).reshape(-1, hop_size)
29+ p = pitch(method, buf_size, hop_size, samplerate = samplerate)
30+ candidates = np.zeros(len(s))
31+ #samples = np.zeros(buf_size)
32+ for frame, i in zip(s, range(len(s))):
33+ candidates[i] = p(frame)[0]
34+ # skip first few candidates
35+ candidates = candidates[4:]
36+ means[fn] = np.mean(candidates[candidates != 0] - freq)
37+ medians[fn] = np.median(candidates[candidates != 0] - freq)
38+ print (freq, means[fn], medians[fn])
39+ return means, medians
40+
41+if __name__ == '__main__':
42+ freqs = np.arange(minfreq, maxfreq, 1.)
43+ modes = ["yin", "yinfft"]
44+ for mode in modes:
45+ means, medians = get_stats_for_pitch_method(mode, freqs)
46+ plt.figure()
47+ plt.plot(freqs, means, 'g-')
48+ plt.plot(freqs, medians, 'r--')
49+ #plt.savefig(mode + '_deviations_test.png', dpi=300)
50+ plt.show()

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t