From c997036f26496bfa22e4ded4955dacdd38c71b9a Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Fri, 13 Jul 2012 00:28:26 -0600 Subject: [PATCH] test_pitch.py: added simple tests for pitch --- interfaces/python/test_pitch.py | 101 ++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 interfaces/python/test_pitch.py diff --git a/interfaces/python/test_pitch.py b/interfaces/python/test_pitch.py new file mode 100755 index 00000000..d00328c1 --- /dev/null +++ b/interfaces/python/test_pitch.py @@ -0,0 +1,101 @@ +#! /usr/bin/python + +from numpy.testing import TestCase +from numpy.testing import assert_equal, assert_almost_equal +from numpy import random, sin, arange, mean, median +from math import pi +from aubio import fvec, pitch + +class aubio_mathutils_test_case(TestCase): + + def test_members(self): + p = pitch() + assert_equal ( [p.method, p.buf_size, p.hop_size, p.samplerate], + ['default', 1024, 512, 44100]) + + def test_members_not_default(self): + p = pitch('mcomb', 2048, 512, 32000) + assert_equal ( [p.method, p.buf_size, p.hop_size, p.samplerate], + ['mcomb', 2048, 512, 32000]) + + def test_run_on_zeros(self): + p = pitch('mcomb', 2048, 512, 32000) + f = fvec (512) + assert_equal ( p(f), 0. ) + + def test_run_on_ones(self): + p = pitch('mcomb', 2048, 512, 32000) + f = fvec (512) + f[:] = 1 + assert( p(f) != 0. ) + + def test_run_default_on_sinusoid(self): + method = 'default' + buf_size = 2048 + hop_size = 512 + samplerate = 32000 + freq = 450. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def test_run_schmitt_on_sinusoid(self): + method = 'schmitt' + buf_size = 4096 + hop_size = 512 + samplerate = 44100 + freq = 800. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def test_run_mcomb_on_sinusoid(self): + method = 'mcomb' + buf_size = 2048 + hop_size = 512 + samplerate = 44100 + freq = 10000. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def test_run_fcomb_on_sinusoid(self): + method = 'fcomb' + buf_size = 2048 + hop_size = 512 + samplerate = 32000 + freq = 440. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def test_run_yin_on_sinusoid(self): + method = 'yin' + buf_size = 4096 + hop_size = 512 + samplerate = 32000 + freq = 880. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def test_run_yinfft_on_sinusoid(self): + method = 'yinfft' + buf_size = 2048 + hop_size = 512 + samplerate = 32000 + freq = 640. + self.run_pitch_on_sinusoid(method, buf_size, hop_size, samplerate, freq) + + def run_pitch_on_sinusoid(self, method, buf_size, hop_size, samplerate, freq): + p = pitch(method, buf_size, hop_size, samplerate) + sinvec = self.build_sinusoid(hop_size * 100, freq, samplerate) + self.run_pitch(p, sinvec, freq) + + def build_sinusoid(self, length, freq, samplerate): + return sin( 2. * pi * arange(length).astype('float32') * freq / samplerate) + + def run_pitch(self, p, input_vec, freq): + count = 0 + pitches, errors = [], [] + for vec_slice in input_vec.reshape((-1, p.hop_size)): + pitch = p(vec_slice) + pitches.append(pitch) + errors.append(1. - pitch / freq) + # check that the mean of all relative errors is less than 10% + assert_almost_equal (mean(errors), 0., decimal = 2) + +if __name__ == '__main__': + from unittest import main + main() + -- 2.26.2