Showing the changes to python (1 of 1 file). Show all
Unified · Split
| @@ -1,19 +1,17 @@ | |||
| 1 | #! /usr/bin/env python | 1 | #! /usr/bin/env python |
| 2 | 2 | ||
| 3 | from numpy import random, sin, arange, zeros | 3 | import numpy as np |
| 4 | from math import pi | 4 | import aubio |
| 5 | from aubio import fvec, pitch | ||
| 6 | 5 | ||
| 7 | def build_sinusoid(length, freqs, samplerate): | 6 | def build_sinusoid(length, freqs, samplerate): |
| 8 | return sin( 2. * pi * arange(length) * freqs / samplerate) | 7 | return np.sin( 2. * np.pi * np.arange(length) * freqs / samplerate).astype(aubio.float_type) |
| 9 | 8 | ||
| 10 | def run_pitch(p, input_vec): | 9 | def run_pitch(p, input_vec): |
| 11 | f = fvec (p.hop_size) | 10 | cands = [] |
| 12 | cands = [] | 11 | for vec_slice in input_vec.reshape((-1, p.hop_size)): |
| 13 | for vec_slice in input_vec.reshape((-1, p.hop_size)): | 12 | a = p(vec_slice)[0] |
| 14 | f[:] = vec_slice | 13 | cands.append(a) |
| 15 | cands.append(p(f)) | 14 | return cands |
| 16 | return cands | ||
| 17 | 15 | ||
| 18 | methods = ['default', 'schmitt', 'fcomb', 'mcomb', 'yin', 'yinfft'] | 16 | methods = ['default', 'schmitt', 'fcomb', 'mcomb', 'yin', 'yinfft'] |
| 19 | 17 | ||
| @@ -22,7 +20,7 @@ buf_size = 2048 · 2 unmodified lines | |||
| 22 | hop_size = 512 | 20 | hop_size = 512 |
| 23 | samplerate = 44100 | 21 | samplerate = 44100 |
| 24 | sin_length = (samplerate * 10) % 512 * 512 | 22 | sin_length = (samplerate * 10) % 512 * 512 |
| 25 | freqs = zeros(sin_length) | 23 | freqs = np.zeros(sin_length) |
| 26 | 24 | ||
| 27 | partition = sin_length / 8 | 25 | partition = sin_length / 8 |
| 28 | pointer = 0 | 26 | pointer = 0 |
| @@ -39,29 +37,34 @@ freqs[ pointer : pointer + partition ] = 1480 · 10 unmodified lines | |||
| 39 | 37 | ||
| 40 | pointer += partition | 38 | pointer += partition |
| 41 | pointer += partition | 39 | pointer += partition |
| 42 | freqs[ pointer : pointer + partition ] = 400 + 5 * random.random(sin_length/8) | 40 | freqs[ pointer : pointer + partition ] = 400 + 5 * np.random.random(sin_length/8) |
| 43 | 41 | ||
| 44 | a = build_sinusoid(sin_length, freqs, samplerate) | 42 | a = build_sinusoid(sin_length, freqs, samplerate) |
| 45 | 43 | ||
| 46 | for method in methods: | 44 | for method in methods: |
| 47 | p = pitch(method, buf_size, hop_size, samplerate) | 45 | p = aubio.pitch(method, buf_size, hop_size, samplerate) |
| 48 | cands[method] = run_pitch(p, a) | 46 | cands[method] = run_pitch(p, a) |
| 47 | print cands[method] | ||
| 49 | 48 | ||
| 50 | print "done computing" | 49 | print "done computing" |
| 51 | 50 | ||
| 52 | if 1: | 51 | if 1: |
| 53 | from pylab import plot, show, xlabel, ylabel, legend, ylim | 52 | import matplotlib.pyplot as plt |
| 54 | ramp = arange(0, sin_length / hop_size).astype('float') * hop_size / samplerate | ||
| 55 | for method in methods: | ||
| 56 | plot(ramp, cands[method],'.-') | ||
| 57 | 53 | ||
| 58 | # plot ground truth | 54 | # times |
| 59 | ramp = arange(0, sin_length).astype('float') / samplerate | 55 | ramp = np.arange(0, sin_length / hop_size).astype('float') * hop_size / samplerate |
| 60 | plot(ramp, freqs, ':') | ||
| 61 | 56 | ||
| 62 | legend(methods+['ground truth'], 'upper right') | 57 | # plot each result |
| 63 | xlabel('time (s)') | 58 | for method in methods: |
| 64 | ylabel('frequency (Hz)') | 59 | plt.plot(ramp, cands[method], '.-', label=method) |
| 65 | ylim([0,2000]) | ||
| 66 | show() | ||
| 67 | 60 | ||
| 61 | # plot ground truth | ||
| 62 | ramp = np.arange(0, sin_length).astype('float') / samplerate | ||
| 63 | plt.plot(ramp, freqs, ':', label = 'ground truth') | ||
| 64 | |||
| 65 | plt.legend(loc='upper left') | ||
| 66 | |||
| 67 | plt.xlabel('time (s)') | ||
| 68 | plt.ylabel('frequency (Hz)') | ||
| 69 | plt.ylim([0,2000]) | ||
| 70 | plt.show() | ||