shithub: aubio

ref: 4e3723d3d90422d034d7fb88bbe9467bf9fbfe54
dir: /tests/python/src/pitch/pitchdetection.py/

View raw version
from template import aubio_unit_template
from localaubio import *

buf_size = 4096
hop_size = 512
channels = 1
samplerate = 44100.

class pitch_test_case(unittest.TestCase):

  def setUp(self, type = aubio_pitch_yinfft, mode = aubio_pitchm_freq):
    self.create(type=type)
  
  def create(self, type = aubio_pitch_yinfft,
      mode = aubio_pitchm_freq):
    self.type = type
    self.o = new_aubio_pitch(buf_size, hop_size,
        channels, int(samplerate), type, mode)

  def tearDown(self):
    del_aubio_pitch(self.o)

  def test_pitch(self):
    """ create and delete pitch """
    pass

  def test_pitch_run_zeroes(self):
    """ run pitch on an empty buffer """
    vec = new_fvec(buf_size, channels)
    out = new_fvec(1, channels)
    for i in range(100):
      aubio_pitch_do(self.o,vec, out)
      self.assertEqual(fvec_read_sample(out, 0, 0),0.)
    del vec

  def test_pitch_run_4_impulses(self):
    """ run pitch on a train of 4 impulses """
    vec = new_fvec(buf_size, channels)
    out = new_fvec(1, channels)
    fvec_write_sample(vec,-1.,0,  0)
    fvec_write_sample(vec, 1.,0,  buf_size/4)
    fvec_write_sample(vec,-1.,0,  buf_size/2)
    fvec_write_sample(vec, 1.,0,3*buf_size/4)
    frequency = samplerate/2*4/buf_size
    for i in range(100):
      aubio_pitch_do(self.o,vec, out)
      self.assertEqual(fvec_read_sample(out, 0, 0),frequency)
    del vec

  def test_pitch_run_4_positive_impulses(self):
    """ run pitch on a train of 4 positive impulses of arbitrary size """
    vec = new_fvec(buf_size, channels)
    out = new_fvec(1, channels)
    frequency = samplerate/2*8/buf_size
    for i in range(100):
      fvec_write_sample(vec, 2.-.01*i,0,  0)
      fvec_write_sample(vec, 2.-.01*i,0,  buf_size/4)
      fvec_write_sample(vec, 2.-.01*i,0,  buf_size/2)
      fvec_write_sample(vec, 2.-.01*i,0,3*buf_size/4)
      aubio_pitch_do(self.o,vec, out)
      self.assertAlmostEqual(fvec_read_sample(out, 0, 0),frequency,1)
    del vec

  def test_pitch_run_4_negative_impulses(self):
    """ run pitch on a train of 4 negative impulses of arbitrary size """
    vec = new_fvec(buf_size, channels)
    out = new_fvec(1, channels)
    frequency = samplerate/2*8/buf_size
    for i in range(1,100):
      fvec_write_sample(vec,-.01*i,0,  0)
      fvec_write_sample(vec,-.01*i,0,  buf_size/4)
      fvec_write_sample(vec,-.01*i,0,  buf_size/2)
      fvec_write_sample(vec,-.01*i,0,3*buf_size/4)
      aubio_pitch_do(self.o,vec, out)
      self.assertAlmostEqual(fvec_read_sample(out, 0, 0),frequency,1)
    del vec

  def test_pitch_run_8_impulses(self):
    """ run pitch on a train of 8 impulses """
    vec = new_fvec(buf_size, channels)
    out = new_fvec(1, channels)
    fvec_write_sample(vec, 1.,0,  0)
    fvec_write_sample(vec,-1.,0,  buf_size/8)
    fvec_write_sample(vec, 1.,0,  buf_size/4)
    fvec_write_sample(vec,-1.,0,3*buf_size/8)
    fvec_write_sample(vec, 1.,0,  buf_size/2)
    fvec_write_sample(vec,-1.,0,5*buf_size/8)
    fvec_write_sample(vec, 1.,0,3*buf_size/4)
    fvec_write_sample(vec,-1.,0,7*buf_size/8)
    for i in range(100):
      aubio_pitch_do(self.o,vec, out)
      self.assertAlmostEqual(fvec_read_sample(out, 0, 0),
        samplerate/2/buf_size*8, 1) 
    del vec

"""
class pitch_yin_test_case(pitch_test_case):
  def setUp(self, type = aubio_pitch_yin):
    self.create(type=type)

class pitch_fcomb_test_case(pitch_test_case):
  def setUp(self, type = aubio_pitch_fcomb):
    self.create(type=type)

class pitch_mcomb_test_case(pitch_test_case):
  def setUp(self, type = aubio_pitch_mcomb):
    self.create(type=type)

class pitch_schmitt_test_case(pitch_test_case):
  def setUp(self, type = aubio_pitch_schmitt):
    self.create(type=type)
"""

if __name__ == '__main__':
  unittest.main()