50 lines · 1.7 KB · Python
RawDownload
#! /usr/bin/env python import numpy as npfrom aubio import pitchimport pylab as plt buf_size = 2048 * 1hop_size = buf_size // 4 samplerate = 44100minfreq = 40maxfreq = 6000 def sinewave(freq, duration, samplerate = samplerate):    """ generate a sinewave """    length = hop_size    while length < duration * samplerate:        length += hop_size    return np.sin( 2. * np.pi * np.arange(length) * freq / samplerate ).astype("float32") def get_stats_for_pitch_method(method, freqs, samplerate = samplerate):    """ for a given pitch method and a list of frequency, generate a sinewave    and get mean deviation """    means = np.zeros(len(freqs))    medians = np.zeros(len(freqs))    for freq, fn in zip(freqs, range(len(freqs))):        s = sinewave(freq, .50).reshape(-1, hop_size)        #s = (sinewave(freq, .50) + .0*sinewave(freq/2., .50)).reshape(-1, hop_size)        p = pitch(method, buf_size, hop_size, samplerate = samplerate)        candidates = np.zeros(len(s))        #samples = np.zeros(buf_size)        for frame, i in zip(s, range(len(s))):            candidates[i] = p(frame)[0]        # skip first few candidates        candidates = candidates[4:]        means[fn] = np.mean(candidates[candidates != 0] - freq)        medians[fn] = np.median(candidates[candidates != 0] - freq)        print (freq, means[fn], medians[fn])    return means, medians if __name__ == '__main__':    freqs = np.arange(minfreq, maxfreq, 1.)    modes = ["yin", "yinfft"]    for mode in modes:        means, medians = get_stats_for_pitch_method(mode, freqs)        plt.figure()        plt.plot(freqs, means, 'g-')        plt.plot(freqs, medians, 'r--')        #plt.savefig(mode + '_deviations_test.png', dpi=300)        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