shithub: aubio

Download patch

ref: 2b3280abacda5f37518ee1579428fa9a4a908c68
parent: b1c948bece6ebed49f1906e2542edd8e7f05cea0
author: Paul Brossier <piem@piem.org>
date: Sat Nov 3 15:08:10 EDT 2007

fft.py: some more tests

--- a/tests/python/fft.py
+++ b/tests/python/fft.py
@@ -3,9 +3,11 @@
 
 from aubio.aubiowrapper import *
 
-buf_size = 2048 
-channels = 1
+buf_size = 8092 
+channels = 4
 
+precision = 6
+
 class aubio_mfft_test_case(unittest.TestCase):
 
   def setUp(self):
@@ -48,15 +50,16 @@
     del output
 
   def test_aubio_mfft_do_impulse(self):
-    """ test aubio_mfft_do on impulse one channel """
+    """ test aubio_mfft_do with an impulse on one channel """
     input    = new_fvec(buf_size, channels)
     fftgrain = new_cvec(buf_size, channels)
     # write impulse in channel 0, sample 0.
-    fvec_write_sample(input, 1., 0, 0)
+    some_constant = 0.3412432456
+    fvec_write_sample(input, some_constant, 0, 0)
     aubio_mfft_do(self.o, input, fftgrain)
     # check norm
     for index in range(buf_size/2+1):
-      self.assertEqual(1., cvec_read_norm(fftgrain, 0, index), index)
+      self.assertAlmostEqual(some_constant, cvec_read_norm(fftgrain, 0, index), precision)
     for index in range(buf_size/2+1):
       for channel in range(1, channels):
         self.assertEqual(0., cvec_read_norm(fftgrain, channel, index))
@@ -67,6 +70,31 @@
     del fftgrain
     del input
 
+  def test_aubio_mfft_do_constant(self):
+    """ test aubio_mfft_do with a constant on one channel """
+    input    = new_fvec(buf_size, channels)
+    fftgrain = new_cvec(buf_size, channels)
+    # write impulse in channel 0, sample 0.
+    some_constant = 0.003412432456
+    for index in range(1,buf_size):
+      fvec_write_sample(input, some_constant, 0, index)
+    aubio_mfft_do(self.o, input, fftgrain)
+    # check norm and phase == 0 in all other channels 
+    for index in range(buf_size/2+1):
+      for channel in range(1, channels):
+        self.assertEqual(0., cvec_read_norm(fftgrain, channel, index))
+    # check norm and phase == 0 in first first and last bin of first channel
+    self.assertAlmostEqual((buf_size-1)*some_constant, cvec_read_norm(fftgrain, 0, 0), precision)
+    self.assertEqual(0., cvec_read_phas(fftgrain, 0, 0))
+    self.assertEqual(0., cvec_read_norm(fftgrain, 0, buf_size/2+1))
+    self.assertEqual(0., cvec_read_phas(fftgrain, 0, buf_size/2+1))
+    # check unwrap2pi(phas) ~= pi everywhere but in first bin
+    for index in range(1,buf_size/2+1):
+       self.assertAlmostEqual ( math.pi, aubio_unwrap2pi(cvec_read_phas(fftgrain, 0, index)), precision)
+       self.assertAlmostEqual(some_constant, cvec_read_norm(fftgrain, 0, index), precision)
+    del fftgrain
+    del input
+
   def test_aubio_mfft_do_impulse_multichannel(self):
     " test aubio_mfft_do on impulse two channels "
     input    = new_fvec(buf_size, channels)
@@ -93,12 +121,13 @@
   def test_aubio_mfft_rdo_impulse(self):
     """ test aubio_mfft_rdo on impulse """
     fftgrain  = new_cvec(buf_size, channels)
-    cvec_write_norm(fftgrain, 1., 0, 0)
+    for channel in range(channels):
+      cvec_write_norm(fftgrain, 1., channel, 0)
     output    = new_fvec(buf_size, channels)
     aubio_mfft_rdo(self.o, fftgrain, output)
     for index in range(buf_size/2+1):
       for channel in range(channels):
-        self.assertEqual(fvec_read_sample(output, channel, index),1./buf_size)
+        self.assertAlmostEqual(fvec_read_sample(output, channel, index), 1./buf_size, precision)
     del fftgrain
     del output
 
@@ -114,7 +143,7 @@
     aubio_mfft_rdo(self.o, fftgrain, output)
     for index in range(buf_size/2+1):
       for channel in range(channels):
-        self.assertAlmostEqual(fvec_read_sample(output, channel, index), 0.67, 7)
+        self.assertAlmostEqual(fvec_read_sample(output, channel, index), 0.67, precision)
     del fftgrain
     del output