Showing the changes to python (1 of 1 file). Show all
Unified · Split
| @@ -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() | |