shithub: aubio

Download patch

ref: c721874779073106425b8c883f3c27879665d108
parent: 1da7e08d47b21afa4d9ce791a38211c0efdfe1e6
parent: 2d8880d5099451bcd23f551f7327df74067567fb
author: Paul Brossier <piem@piem.org>
date: Sat Nov 3 15:03:04 EDT 2007

merge changes from banane, more fixes

--- a/src/aubio_priv.h
+++ b/src/aubio_priv.h
@@ -1,20 +1,20 @@
 /*
-	 Copyright (C) 2003 Paul Brossier
+   Copyright (C) 2003-2007 Paul Brossier
 
-	 This program is free software; you can redistribute it and/or modify
-	 it under the terms of the GNU General Public License as published by
-	 the Free Software Foundation; either version 2 of the License, or
-	 (at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-	 This program is distributed in the hope that it will be useful,
-	 but WITHOUT ANY WARRANTY; without even the implied warranty of
-	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	 GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-	 You should have received a copy of the GNU General Public License
-	 along with this program; if not, write to the Free Software
-	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-	 
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   
 */
 
 /** @file
@@ -70,13 +70,13 @@
  */
 
 /* Memory management */
-#define AUBIO_MALLOC(_n)		malloc(_n)
-#define AUBIO_REALLOC(_p,_n)		realloc(_p,_n)
-#define AUBIO_NEW(_t)			(_t*)malloc(sizeof(_t))
-#define AUBIO_ARRAY(_t,_n)		(_t*)malloc((_n)*sizeof(_t))
-#define AUBIO_MEMCPY(_dst,_src,_n)	memcpy(_dst,_src,_n)
-#define AUBIO_MEMSET(_dst,_src,_t)	memset(_dst,_src,_t)
-#define AUBIO_FREE(_p)			free(_p)	
+#define AUBIO_MALLOC(_n)             malloc(_n)
+#define AUBIO_REALLOC(_p,_n)         realloc(_p,_n)
+#define AUBIO_NEW(_t)                (_t*)malloc(sizeof(_t))
+#define AUBIO_ARRAY(_t,_n)           (_t*)malloc((_n)*sizeof(_t))
+#define AUBIO_MEMCPY(_dst,_src,_n)   memcpy(_dst,_src,_n)
+#define AUBIO_MEMSET(_dst,_src,_t)   memset(_dst,_src,_t)
+#define AUBIO_FREE(_p)               free(_p)
 
 
 /* file interface */
--- a/src/fft.c
+++ b/src/fft.c
@@ -23,14 +23,14 @@
 #include "fft.h"
 
 #if FFTW3F_SUPPORT
-#define fftw_malloc 		fftwf_malloc
-#define fftw_free 		fftwf_free
-#define fftw_execute 		fftwf_execute
-#define fftw_plan_dft_r2c_1d 	fftwf_plan_dft_r2c_1d
-#define fftw_plan_dft_c2r_1d 	fftwf_plan_dft_c2r_1d
-#define fftw_plan_r2r_1d      fftwf_plan_r2r_1d
-#define fftw_plan		fftwf_plan
-#define fftw_destroy_plan	fftwf_destroy_plan
+#define fftw_malloc            fftwf_malloc
+#define fftw_free              fftwf_free
+#define fftw_execute           fftwf_execute
+#define fftw_plan_dft_r2c_1d   fftwf_plan_dft_r2c_1d
+#define fftw_plan_dft_c2r_1d   fftwf_plan_dft_c2r_1d
+#define fftw_plan_r2r_1d       fftwf_plan_r2r_1d
+#define fftw_plan              fftwf_plan
+#define fftw_destroy_plan      fftwf_destroy_plan
 #endif
 
 #if FFTW3F_SUPPORT
@@ -40,74 +40,72 @@
 #endif
 
 struct _aubio_fft_t {
-	uint_t fft_size;
-	uint_t channels;
-	real_t  	*in, *out;
-	fft_data_t 	*specdata;
-	fftw_plan 	pfw, pbw;
+  uint_t fft_size;
+  uint_t channels;
+  real_t    *in, *out;
+  fft_data_t   *specdata;
+  fftw_plan   pfw, pbw;
 };
 
 static void aubio_fft_getspectrum(fft_data_t * spectrum, smpl_t *norm, smpl_t * phas, uint_t size);
 
 aubio_fft_t * new_aubio_fft(uint_t size) {
-	aubio_fft_t * s = AUBIO_NEW(aubio_fft_t);
-	/* allocate memory */
-	s->in       = AUBIO_ARRAY(real_t,size);
-	s->out      = AUBIO_ARRAY(real_t,size);
-	s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*size);
-	/* create plans */
+  aubio_fft_t * s = AUBIO_NEW(aubio_fft_t);
+  /* allocate memory */
+  s->in       = AUBIO_ARRAY(real_t,size);
+  s->out      = AUBIO_ARRAY(real_t,size);
+  /* create plans */
 #ifdef HAVE_COMPLEX_H
-	s->pfw = fftw_plan_dft_r2c_1d(size, s->in,  s->specdata, FFTW_ESTIMATE);
-	s->pbw = fftw_plan_dft_c2r_1d(size, s->specdata, s->out, FFTW_ESTIMATE);
+  s->fft_size = size/2+1;
+  s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
+  s->pfw = fftw_plan_dft_r2c_1d(size, s->in,  s->specdata, FFTW_ESTIMATE);
+  s->pbw = fftw_plan_dft_c2r_1d(size, s->specdata, s->out, FFTW_ESTIMATE);
 #else
-	s->pfw = fftw_plan_r2r_1d(size, s->in,  s->specdata, FFTW_R2HC, FFTW_ESTIMATE);
-	s->pbw = fftw_plan_r2r_1d(size, s->specdata, s->out, FFTW_HC2R, FFTW_ESTIMATE);
+  s->fft_size = size;
+  s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
+  s->pfw = fftw_plan_r2r_1d(size, s->in,  s->specdata, FFTW_R2HC, FFTW_ESTIMATE);
+  s->pbw = fftw_plan_r2r_1d(size, s->specdata, s->out, FFTW_HC2R, FFTW_ESTIMATE);
 #endif
-	return s;
+  return s;
 }
 
 void del_aubio_fft(aubio_fft_t * s) {
-	/* destroy data */
-	fftw_destroy_plan(s->pfw);
-	fftw_destroy_plan(s->pbw);
-	fftw_free(s->specdata);
-	AUBIO_FREE(s->out);
-	AUBIO_FREE(s->in );
-	AUBIO_FREE(s);
+  /* destroy data */
+  fftw_destroy_plan(s->pfw);
+  fftw_destroy_plan(s->pbw);
+  fftw_free(s->specdata);
+  AUBIO_FREE(s->out);
+  AUBIO_FREE(s->in );
+  AUBIO_FREE(s);
 }
 
 void aubio_fft_do(const aubio_fft_t * s, 
-		const smpl_t * data, fft_data_t * spectrum, 
-		const uint_t size) {
-	uint_t i;
-	for (i=0;i<size;i++) s->in[i] = data[i];
-	fftw_execute(s->pfw);
-	for (i=0;i<size;i++) spectrum[i] = s->specdata[i];
+    const smpl_t * data, fft_data_t * spectrum, const uint_t size) {
+  uint_t i;
+  for (i=0;i<size;i++) s->in[i] = data[i];
+  fftw_execute(s->pfw);
+  for (i=0; i < s->fft_size; i++) spectrum[i] = s->specdata[i];
 }
 
 void aubio_fft_rdo(const aubio_fft_t * s, 
-		const fft_data_t * spectrum, 
-		smpl_t * data, 
-		const uint_t size) {
-	uint_t i;
-	const smpl_t renorm = 1./(smpl_t)size;
-	for (i=0;i<size;i++) s->specdata[i] = spectrum[i];
-	fftw_execute(s->pbw);
-	for (i=0;i<size;i++) data[i] = s->out[i]*renorm;
+    const fft_data_t * spectrum, smpl_t * data, const uint_t size) {
+  uint_t i;
+  const smpl_t renorm = 1./(smpl_t)size;
+  for (i=0; i < s->fft_size; i++) s->specdata[i] = spectrum[i];
+  fftw_execute(s->pbw);
+  for (i=0;i<size;i++) data[i] = s->out[i]*renorm;
 }
 
 #ifdef HAVE_COMPLEX_H
 
 void aubio_fft_getnorm(smpl_t * norm, fft_data_t * spectrum, uint_t size) {
-	uint_t i;
-	for (i=0;i<size/2+1;i++) norm[i] = ABSC(spectrum[i]);
-	//for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", norm[i]);
+  uint_t i;
+  for (i=0;i<size/2+1;i++) norm[i] = ABSC(spectrum[i]);
 }
 
 void aubio_fft_getphas(smpl_t * phas, fft_data_t * spectrum, uint_t size) {
-	uint_t i;
-	for (i=0;i<size/2+1;i++) phas[i] = ARGC(spectrum[i]);
-	//for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", phas[i]);
+  uint_t i;
+  for (i=0;i<size/2+1;i++) phas[i] = ARGC(spectrum[i]);
 }
 
 void aubio_fft_getspectrum(fft_data_t * spectrum, smpl_t *norm, smpl_t * phas, uint_t size) {
@@ -121,17 +119,17 @@
 #else
 
 void aubio_fft_getnorm(smpl_t * norm, fft_data_t * spectrum, uint_t size) {
-	uint_t i;
-  norm[0] = -spectrum[0];
-	for (i=1;i<size/2+1;i++) norm[i] = SQRT(SQR(spectrum[i]) + SQR(spectrum[size-i]));
-	//for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", norm[i]);
+  uint_t i;
+  norm[0] = SQR(spectrum[0]);
+  for (i=1;i<size/2;i++) norm[i] = (SQR(spectrum[i]) + SQR(spectrum[size-i]));
+  norm[size/2] = SQR(spectrum[size/2]);
 }
 
 void aubio_fft_getphas(smpl_t * phas, fft_data_t * spectrum, uint_t size) {
-	uint_t i;
-  phas[0] = PI;
-	for (i=1;i<size/2+1;i++) phas[i] = atan2f(spectrum[size-i] , spectrum[i]);
-	//for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", phas[i]);
+  uint_t i;
+  phas[0] = 0;
+  for (i=1;i<size/2+1;i++) phas[i] = atan2f(spectrum[size-i] , spectrum[i]);
+  phas[size/2] = 0;
 }
 
 void aubio_fft_getspectrum(fft_data_t * spectrum, smpl_t *norm, smpl_t * phas, uint_t size) {
@@ -155,43 +153,43 @@
 };
 
 aubio_mfft_t * new_aubio_mfft(uint_t winsize, uint_t channels){
-        uint_t i;
-	aubio_mfft_t * fft = AUBIO_NEW(aubio_mfft_t);
-	fft->winsize       = winsize;
-	fft->channels      = channels;
-	fft->fft           = new_aubio_fft(winsize);
-	fft->spec          = AUBIO_ARRAY(fft_data_t*,channels);
-        for (i=0; i < channels; i++)
-                fft->spec[i] = AUBIO_ARRAY(fft_data_t,winsize);
-        return fft;
+  uint_t i;
+  aubio_mfft_t * fft = AUBIO_NEW(aubio_mfft_t);
+  fft->winsize       = winsize;
+  fft->channels      = channels;
+  fft->fft           = new_aubio_fft(winsize);
+  fft->spec          = AUBIO_ARRAY(fft_data_t*,channels);
+  for (i=0; i < channels; i++)
+    fft->spec[i] = AUBIO_ARRAY(fft_data_t,winsize);
+  return fft;
 }
 
 /* execute stft */
 void aubio_mfft_do (aubio_mfft_t * fft,fvec_t * in,cvec_t * fftgrain){
-        uint_t i=0;
-        /* execute stft */
-        for (i=0; i < fft->channels; i++) {
-                aubio_fft_do (fft->fft,in->data[i],fft->spec[i],fft->winsize);
-                /* put norm and phase into fftgrain */
-                aubio_fft_getnorm(fftgrain->norm[i], fft->spec[i], fft->winsize);
-                aubio_fft_getphas(fftgrain->phas[i], fft->spec[i], fft->winsize);
-        }
+  uint_t i=0;
+  /* execute stft */
+  for (i=0; i < fft->channels; i++) {
+    aubio_fft_do (fft->fft,in->data[i],fft->spec[i],fft->winsize);
+    /* put norm and phase into fftgrain */
+    aubio_fft_getnorm(fftgrain->norm[i], fft->spec[i], fft->winsize);
+    aubio_fft_getphas(fftgrain->phas[i], fft->spec[i], fft->winsize);
+  }
 }
 
 /* execute inverse fourier transform */
 void aubio_mfft_rdo(aubio_mfft_t * fft,cvec_t * fftgrain, fvec_t * out){
-        uint_t i=0;
-        for (i=0; i < fft->channels; i++) {
-                aubio_fft_getspectrum(fft->spec[i],fftgrain->norm[i],fftgrain->phas[i],fft->winsize);
-                aubio_fft_rdo(fft->fft,fft->spec[i],out->data[i],fft->winsize);
-        }
+  uint_t i=0;
+  for (i=0; i < fft->channels; i++) {
+    aubio_fft_getspectrum(fft->spec[i],fftgrain->norm[i],fftgrain->phas[i],fft->winsize);
+    aubio_fft_rdo(fft->fft,fft->spec[i],out->data[i],fft->winsize);
+  }
 }
 
 void del_aubio_mfft(aubio_mfft_t * fft) {
-        uint_t i;
-        for (i=0; i < fft->channels; i++)
-                AUBIO_FREE(fft->spec[i]);
-        AUBIO_FREE(fft->spec);
-        del_aubio_fft(fft->fft);
-        AUBIO_FREE(fft);        
+  uint_t i;
+  for (i=0; i < fft->channels; i++)
+    AUBIO_FREE(fft->spec[i]);
+  AUBIO_FREE(fft->spec);
+  del_aubio_fft(fft->fft);
+  AUBIO_FREE(fft);        
 }
--- a/src/fft.h
+++ b/src/fft.h
@@ -1,20 +1,20 @@
 /*
-	 Copyright (C) 2003 Paul Brossier
+   Copyright (C) 2003 Paul Brossier
 
-	 This program is free software; you can redistribute it and/or modify
-	 it under the terms of the GNU General Public License as published by
-	 the Free Software Foundation; either version 2 of the License, or
-	 (at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-	 This program is distributed in the hope that it will be useful,
-	 but WITHOUT ANY WARRANTY; without even the implied warranty of
-	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	 GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-	 You should have received a copy of the GNU General Public License
-	 along with this program; if not, write to the Free Software
-	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-	 
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   
 */
 
 /** \file 
--- a/src/phasevoc.c
+++ b/src/phasevoc.c
@@ -25,141 +25,125 @@
 
 /** phasevocoder internal object */
 struct _aubio_pvoc_t {
-	/** grain length */
-	uint_t win_s;
-	/** overlap step */
-	uint_t hop_s;
-	/** number of channels */
-	uint_t channels;
-	/** spectral data */
-	aubio_mfft_t * fft;
-	/**cur output grain 		[win_s] */
-	fvec_t * synth;		 
-	/**last input frame 		[win_s-hop_s] */
-	fvec_t * synthold; 
-	/**current input grain		[win_s] */
-	fvec_t * data;		 
-	/**last input frame 		[win_s-hop_s] */
-	fvec_t * dataold;  
-	/** grain window		[win_s] */
-	float * w;
+  uint_t win_s;       /** grain length */
+  uint_t hop_s;       /** overlap step */
+  uint_t channels;    /** number of channels */
+  aubio_mfft_t * fft; /** spectral data */
+  fvec_t * synth;     /**cur output grain [win_s] */
+  fvec_t * synthold;  /**last input frame [win_s-hop_s] */
+  fvec_t * data;      /**current input grain [win_s] */
+  fvec_t * dataold;   /**last input frame [win_s-hop_s] */
+  smpl_t * w;          /** grain window [win_s] */
 };
 
 
 /** returns data and dataold slided by hop_s */
-static void aubio_pvoc_swapbuffers(
-		smpl_t * data,
-		smpl_t * dataold,
-		const smpl_t * datanew,
-		uint_t win_s, uint_t hop_s);
+static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, const
+    smpl_t * datanew, uint_t win_s, uint_t hop_s);
+
 /** do additive synthesis from 'old' and 'cur' */
-static void aubio_pvoc_addsynth(
-		const smpl_t * synth,
-		smpl_t * synthold,
-		smpl_t * synthnew, 
-		uint_t win_s, uint_t hop_s);
+static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold,
+    smpl_t * synthnew, uint_t win_s, uint_t hop_s);
 
-
 void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t * datanew, cvec_t *fftgrain) {
-	uint_t i,j;
-	for (i=0; i<pv->channels; i++) {
-		/* slide  */
-		aubio_pvoc_swapbuffers(pv->data->data[i],pv->dataold->data[i],
-				datanew->data[i],pv->win_s,pv->hop_s);
-		/* windowing */
-		for (j=0; j<pv->win_s; j++) pv->data->data[i][j] *= pv->w[j];
-        }
-        /* shift */
-        vec_shift(pv->data);
-	/* calculate fft */
-        aubio_mfft_do (pv->fft,pv->data,fftgrain);
+  uint_t i,j;
+  for (i=0; i<pv->channels; i++) {
+    /* slide  */
+    aubio_pvoc_swapbuffers(pv->data->data[i],pv->dataold->data[i],
+        datanew->data[i],pv->win_s,pv->hop_s);
+    /* windowing */
+    for (j=0; j<pv->win_s; j++) pv->data->data[i][j] *= pv->w[j];
+  }
+  /* shift */
+  vec_shift(pv->data);
+  /* calculate fft */
+  aubio_mfft_do (pv->fft,pv->data,fftgrain);
 }
 
 void aubio_pvoc_rdo(aubio_pvoc_t *pv,cvec_t * fftgrain, fvec_t * synthnew) {
-	uint_t i,j;
-	/* calculate rfft */
-        aubio_mfft_rdo(pv->fft,fftgrain,pv->synth);
-        /* unshift */
-        vec_shift(pv->synth);
-	for (i=0; i<pv->channels; i++) {
-		for (j=0; j<pv->win_s; j++) pv->synth->data[i][j] *= pv->w[j];
-		aubio_pvoc_addsynth(pv->synth->data[i],pv->synthold->data[i],
-				synthnew->data[i],pv->win_s,pv->hop_s);
-	}
+  uint_t i;
+  /* calculate rfft */
+  aubio_mfft_rdo(pv->fft,fftgrain,pv->synth);
+  /* unshift */
+  vec_shift(pv->synth);
+  for (i=0; i<pv->channels; i++) {
+    aubio_pvoc_addsynth(pv->synth->data[i],pv->synthold->data[i],
+        synthnew->data[i],pv->win_s,pv->hop_s);
+  }
 }
 
 aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels) {
-	aubio_pvoc_t * pv = AUBIO_NEW(aubio_pvoc_t);
+  aubio_pvoc_t * pv = AUBIO_NEW(aubio_pvoc_t);
 
-	if (win_s < 2*hop_s) {
-		AUBIO_ERR("Hop size bigger than half the window size!\n");
-		AUBIO_ERR("Resetting hop size to half the window size.\n");
-                hop_s = win_s / 2;
-	}
+  if (win_s < 2*hop_s) {
+    AUBIO_ERR("Hop size bigger than half the window size!\n");
+    AUBIO_ERR("Resetting hop size to half the window size.\n");
+    hop_s = win_s / 2;
+  }
 
-	if (hop_s < 1) {
-		AUBIO_ERR("Hop size is smaller than 1!\n");
-		AUBIO_ERR("Resetting hop size to half the window size.\n");
-                hop_s = win_s / 2;
-	}
-	
-	pv->fft      = new_aubio_mfft(win_s,channels);
+  if (hop_s < 1) {
+    AUBIO_ERR("Hop size is smaller than 1!\n");
+    AUBIO_ERR("Resetting hop size to half the window size.\n");
+    hop_s = win_s / 2;
+  }
 
-	/* remember old */
-	pv->data     = new_fvec (win_s, channels);
-	pv->synth    = new_fvec (win_s, channels);
+  pv->fft      = new_aubio_mfft(win_s,channels);
 
-	/* new input output */
-	pv->dataold  = new_fvec  (win_s-hop_s, channels);
-	pv->synthold = new_fvec (win_s-hop_s, channels);
-	pv->w        = AUBIO_ARRAY(smpl_t,win_s);
-	aubio_window(pv->w,win_s,aubio_win_hanningz);
+  /* remember old */
+  pv->data     = new_fvec (win_s, channels);
+  pv->synth    = new_fvec (win_s, channels);
 
-	pv->channels = channels;
-	pv->hop_s    = hop_s;
-	pv->win_s    = win_s;
+  /* new input output */
+  pv->dataold  = new_fvec  (win_s-hop_s, channels);
+  pv->synthold = new_fvec (win_s-hop_s, channels);
+  pv->w        = AUBIO_ARRAY(smpl_t,win_s);
+  aubio_window(pv->w,win_s,aubio_win_hanningz);
 
-	return pv;
+  pv->channels = channels;
+  pv->hop_s    = hop_s;
+  pv->win_s    = win_s;
+
+  return pv;
 }
 
 void del_aubio_pvoc(aubio_pvoc_t *pv) {
-	del_fvec(pv->data);
-	del_fvec(pv->synth);
-	del_fvec(pv->dataold);
-	del_fvec(pv->synthold);
-	del_aubio_mfft(pv->fft);
-	AUBIO_FREE(pv->w);
-	AUBIO_FREE(pv);
+  del_fvec(pv->data);
+  del_fvec(pv->synth);
+  del_fvec(pv->dataold);
+  del_fvec(pv->synthold);
+  del_aubio_mfft(pv->fft);
+  AUBIO_FREE(pv->w);
+  AUBIO_FREE(pv);
 }
 
 static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, 
-                const smpl_t * datanew, uint_t win_s, uint_t hop_s)
+    const smpl_t * datanew, uint_t win_s, uint_t hop_s)
 {
-	uint_t i;
-	for (i=0;i<win_s-hop_s;i++)
-		data[i] = dataold[i];
-	for (i=0;i<hop_s;i++)
-		data[win_s-hop_s+i] = datanew[i];
-	for (i=0;i<win_s-hop_s;i++)
-		dataold[i] = data[i+hop_s];
+  uint_t i;
+  for (i=0;i<win_s-hop_s;i++)
+    data[i] = dataold[i];
+  for (i=0;i<hop_s;i++)
+    data[win_s-hop_s+i] = datanew[i];
+  for (i=0;i<win_s-hop_s;i++)
+    dataold[i] = data[i+hop_s];
 }
 
 static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold, 
                 smpl_t * synthnew, uint_t win_s, uint_t hop_s)
 {
-	uint_t i;
-	smpl_t scale = 2*hop_s/(win_s+.0);
-	/* add new synth to old one and put result in synthnew */
-	for (i=0;i<hop_s;i++) 						
-		synthnew[i] = synthold[i]+synth[i]*scale;
-	/* shift synthold */
-	for (i=0;i<win_s-2*hop_s;i++)	
-		synthold[i] = synthold[i+hop_s];
-	/* erase last frame in synthold */
-	for (i=win_s-hop_s;i<win_s;i++)	
-		synthold[i-hop_s]=0.;
-	/* additive synth */
-	for (i=0;i<win_s-hop_s;i++)	
-		synthold[i] += synth[i+hop_s]*scale;
+  uint_t i;
+  smpl_t scale = 2*hop_s/(win_s+.0);
+  /* add new synth to old one and put result in synthnew */
+  for (i=0;i<hop_s;i++)
+    synthnew[i] = synthold[i]+synth[i]*scale;
+  /* shift synthold */
+  for (i=0;i<win_s-2*hop_s;i++)
+    synthold[i] = synthold[i+hop_s];
+  /* erase last frame in synthold */
+  for (i=win_s-hop_s;i<win_s;i++)
+    synthold[i-hop_s]=0.;
+  /* additive synth */
+  for (i=0;i<win_s-hop_s;i++)
+    synthold[i] += synth[i+hop_s]*scale;
 }
 
--- a/src/types.h
+++ b/src/types.h
@@ -39,8 +39,8 @@
 #endif
 
 /** short sample format (32 or 64 bits) */
-typedef float        smpl_t;
-//typedef double       smpl_t;
+//typedef float        smpl_t;
+typedef double       smpl_t;
 /** long sample format (64 bits or more) */
 typedef double       lsmp_t;
 //typedef long        lsmp_t;
--- /dev/null
+++ b/tests/python/examples/aubiopitch.py
@@ -1,0 +1,58 @@
+from template import *
+
+import os.path
+
+class aubiopitch_test_case(program_test_case):
+
+  import os.path
+  filename = os.path.join('..','..','sounds','woodblock.aiff')
+  progname = "PYTHONPATH=../../python:../../python/aubio/.libs " + \
+              os.path.join('..','..','python','aubiopitch')
+
+  def test_aubiopitch(self):
+    """ test aubiopitch with default parameters """
+    self.getOutput()
+    # FIXME: useless check
+    self.assertEqual(len(self.output.split('\n')), 1)
+    #self.assertEqual(float(self.output.strip()), 0.)
+
+  def test_aubiopitch_verbose(self):
+    """ test aubiopitch with -v parameter """
+    self.command += " -v "
+    self.getOutput()
+    # FIXME: loose checking: make sure at least 8 lines are printed
+    assert len(self.output) >= 8
+
+  def test_aubiopitch_devnull(self):
+    """ test aubiopitch on /dev/null """
+    self.filename = "/dev/null"
+    # exit status should not be 0
+    self.getOutput(expected_status = 256)
+    # and there should be an error message
+    assert len(self.output) > 0
+    # that looks like this 
+    output_lines = self.output.split('\n')
+    #assert output_lines[0] == "Unable to open input file /dev/null."
+    #assert output_lines[1] == "Supported file format but file is malformed."
+    #assert output_lines[2] == "Could not open input file /dev/null."
+
+mode_names = ["yinfft", "yin", "fcomb", "mcomb", "schmitt"]
+for name in mode_names:
+  exec("class aubiopitch_test_case_" + name + "(aubiopitch_test_case):\n\
+    options = \" -m " + name + " \"")
+
+class aubiopitch_test_yinfft(program_test_case):
+
+  filename = os.path.join('..','..','sounds','16568_acclivity_TwoCows.wav')
+  progname = "PYTHONPATH=../../python:../../python/aubio/.libs " + \
+              os.path.join('..','..','python','aubiopitch')
+  options  = " -m yinfft -t 0.75 "
+
+  def test_aubiopitch(self):
+    """ test aubiopitch with default parameters """
+    self.getOutput()
+    expected_output = open(os.path.join('examples','aubiopitch','yinfft'+'.'+os.path.basename(self.filename)+'.txt')).read()
+    for line_out, line_exp in zip(self.output.split('\n'), expected_output.split('\n')):
+      assert line_out == line_exp, line_exp + " vs. " + line_out
+
+if __name__ == '__main__': unittest.main()
--- /dev/null
+++ b/tests/python/examples/aubiopitch/yinfft.16568_acclivity_TwoCows.wav.txt
@@ -1,0 +1,566 @@
+0.0232199546485	-1.0
+0.0464399092971	-1.0
+0.0696598639456	-1.0
+0.0928798185941	-1.0
+0.116099773243	-1.0
+0.139319727891	-1.0
+0.16253968254	-1.0
+0.185759637188	-1.0
+0.208979591837	-1.0
+0.232199546485	-1.0
+0.255419501134	-1.0
+0.278639455782	-1.0
+0.301859410431	-1.0
+0.325079365079	-1.0
+0.348299319728	-1.0
+0.371519274376	-1.0
+0.394739229025	-1.0
+0.417959183673	-1.0
+0.441179138322	-1.0
+0.464399092971	-1.0
+0.487619047619	-1.0
+0.510839002268	-1.0
+0.534058956916	-1.0
+0.557278911565	-1.0
+0.580498866213	-1.0
+0.603718820862	-1.0
+0.62693877551	-1.0
+0.650158730159	-1.0
+0.673378684807	-1.0
+0.696598639456	-1.0
+0.719818594104	-1.0
+0.743038548753	-1.0
+0.766258503401	-1.0
+0.78947845805	-1.0
+0.812698412698	-1.0
+0.835918367347	-1.0
+0.859138321995	-1.0
+0.882358276644	-1.0
+0.905578231293	-1.0
+0.928798185941	-1.0
+0.95201814059	-1.0
+0.975238095238	-1.0
+0.998458049887	-1.0
+1.02167800454	-1.0
+1.04489795918	-1.0
+1.06811791383	392.768096924
+1.09133786848	115.522140503
+1.11455782313	116.574150085
+1.13777777778	117.720863342
+1.16099773243	120.00163269
+1.18421768707	123.633300781
+1.20743764172	426.787963867
+1.23065759637	141.312179565
+1.25387755102	144.336975098
+1.27709750567	148.604934692
+1.30031746032	150.864654541
+1.32353741497	154.889007568
+1.34675736961	156.505081177
+1.36997732426	158.878829956
+1.39319727891	160.931289673
+1.41641723356	163.155059814
+1.43963718821	324.814025879
+1.46285714286	167.016983032
+1.48607709751	168.871704102
+1.50929705215	170.665634155
+1.5325170068	172.353149414
+1.55573696145	174.764205933
+1.5789569161	176.318893433
+1.60217687075	178.282669067
+1.6253968254	179.82383728
+1.64861678005	181.488952637
+1.67183673469	183.1927948
+1.69505668934	184.449371338
+1.71827664399	185.715484619
+1.74149659864	186.702224731
+1.76471655329	187.907455444
+1.78793650794	188.703475952
+1.81115646259	189.502182007
+1.83437641723	190.250213623
+1.85759637188	190.834747314
+1.88081632653	190.98348999
+1.90403628118	190.847137451
+1.92725623583	190.805847168
+1.95047619048	191.00831604
+1.97369614512	191.377182007
+1.99691609977	191.935241699
+2.02013605442	192.395782471
+2.04335600907	192.534378052
+2.06657596372	192.404174805
+2.08979591837	192.085708618
+2.11301587302	191.410400391
+2.13623582766	191.070388794
+2.15945578231	190.677963257
+2.18267573696	190.020675659
+2.20589569161	189.669265747
+2.22911564626	189.298828125
+2.25233560091	188.546142578
+2.27555555556	186.856491089
+2.2987755102	184.917297363
+2.32199546485	183.044509888
+2.3452154195	181.399368286
+2.36843537415	179.126312256
+2.3916553288	175.22946167
+2.41487528345	171.139190674
+2.4380952381	338.55368042
+2.46131519274	162.799713135
+2.48453514739	320.075500488
+2.50775510204	148.602432251
+2.53097505669	139.503982544
+2.55419501134	340.922271729
+2.57741496599	326.436950684
+2.60063492063	333.484558105
+2.62385487528	-1.0
+2.64707482993	-1.0
+2.67029478458	-1.0
+2.69351473923	-1.0
+2.71673469388	-1.0
+2.73995464853	-1.0
+2.76317460317	-1.0
+2.78639455782	-1.0
+2.80961451247	-1.0
+2.83283446712	-1.0
+2.85605442177	-1.0
+2.87927437642	-1.0
+2.90249433107	-1.0
+2.92571428571	-1.0
+2.94893424036	-1.0
+2.97215419501	-1.0
+2.99537414966	-1.0
+3.01859410431	-1.0
+3.04181405896	-1.0
+3.06503401361	-1.0
+3.08825396825	-1.0
+3.1114739229	-1.0
+3.13469387755	-1.0
+3.1579138322	-1.0
+3.18113378685	-1.0
+3.2043537415	-1.0
+3.22757369615	-1.0
+3.25079365079	-1.0
+3.27401360544	-1.0
+3.29723356009	-1.0
+3.32045351474	-1.0
+3.34367346939	-1.0
+3.36689342404	-1.0
+3.39011337868	-1.0
+3.41333333333	-1.0
+3.43655328798	-1.0
+3.45977324263	-1.0
+3.48299319728	-1.0
+3.50621315193	-1.0
+3.52943310658	-1.0
+3.55265306122	-1.0
+3.57587301587	-1.0
+3.59909297052	-1.0
+3.62231292517	-1.0
+3.64553287982	-1.0
+3.66875283447	-1.0
+3.69197278912	-1.0
+3.71519274376	-1.0
+3.73841269841	-1.0
+3.76163265306	-1.0
+3.78485260771	-1.0
+3.80807256236	-1.0
+3.83129251701	-1.0
+3.85451247166	-1.0
+3.8777324263	-1.0
+3.90095238095	-1.0
+3.9241723356	-1.0
+3.94739229025	-1.0
+3.9706122449	-1.0
+3.99383219955	-1.0
+4.0170521542	-1.0
+4.04027210884	-1.0
+4.06349206349	-1.0
+4.08671201814	-1.0
+4.10993197279	-1.0
+4.13315192744	-1.0
+4.15637188209	-1.0
+4.17959183673	-1.0
+4.20281179138	-1.0
+4.22603174603	-1.0
+4.24925170068	-1.0
+4.27247165533	-1.0
+4.29569160998	-1.0
+4.31891156463	-1.0
+4.34213151927	-1.0
+4.36535147392	-1.0
+4.38857142857	-1.0
+4.41179138322	-1.0
+4.43501133787	-1.0
+4.45823129252	-1.0
+4.48145124717	-1.0
+4.50467120181	-1.0
+4.52789115646	-1.0
+4.55111111111	-1.0
+4.57433106576	-1.0
+4.59755102041	-1.0
+4.62077097506	-1.0
+4.64399092971	-1.0
+4.66721088435	-1.0
+4.690430839	-1.0
+4.71365079365	-1.0
+4.7368707483	-1.0
+4.76009070295	-1.0
+4.7833106576	-1.0
+4.80653061224	-1.0
+4.82975056689	-1.0
+4.85297052154	-1.0
+4.87619047619	-1.0
+4.89941043084	-1.0
+4.92263038549	-1.0
+4.94585034014	-1.0
+4.96907029478	-1.0
+4.99229024943	-1.0
+5.01551020408	-1.0
+5.03873015873	-1.0
+5.06195011338	-1.0
+5.08517006803	-1.0
+5.10839002268	-1.0
+5.13160997732	-1.0
+5.15482993197	-1.0
+5.17804988662	-1.0
+5.20126984127	-1.0
+5.22448979592	-1.0
+5.24770975057	-1.0
+5.27092970522	-1.0
+5.29414965986	-1.0
+5.31736961451	-1.0
+5.34058956916	-1.0
+5.36380952381	-1.0
+5.38702947846	-1.0
+5.41024943311	-1.0
+5.43346938776	-1.0
+5.4566893424	-1.0
+5.47990929705	-1.0
+5.5031292517	-1.0
+5.52634920635	-1.0
+5.549569161	-1.0
+5.57278911565	-1.0
+5.59600907029	-1.0
+5.61922902494	-1.0
+5.64244897959	-1.0
+5.66566893424	-1.0
+5.68888888889	-1.0
+5.71210884354	-1.0
+5.73532879819	-1.0
+5.75854875283	-1.0
+5.78176870748	-1.0
+5.80498866213	-1.0
+5.82820861678	-1.0
+5.85142857143	-1.0
+5.87464852608	-1.0
+5.89786848073	-1.0
+5.92108843537	-1.0
+5.94430839002	-1.0
+5.96752834467	-1.0
+5.99074829932	-1.0
+6.01396825397	-1.0
+6.03718820862	-1.0
+6.06040816327	-1.0
+6.08362811791	-1.0
+6.10684807256	-1.0
+6.13006802721	-1.0
+6.15328798186	-1.0
+6.17650793651	-1.0
+6.19972789116	-1.0
+6.2229478458	-1.0
+6.24616780045	-1.0
+6.2693877551	-1.0
+6.29260770975	-1.0
+6.3158276644	-1.0
+6.33904761905	-1.0
+6.3622675737	-1.0
+6.38548752834	-1.0
+6.40870748299	-1.0
+6.43192743764	-1.0
+6.45514739229	-1.0
+6.47836734694	-1.0
+6.50158730159	187.887435913
+6.52480725624	143.988250732
+6.54802721088	147.904678345
+6.57124716553	151.674087524
+6.59446712018	3221.32983398
+6.61768707483	3159.02587891
+6.64090702948	160.395706177
+6.66412698413	162.535690308
+6.68734693878	164.282516479
+6.71056689342	166.054779053
+6.73378684807	167.578659058
+6.75700680272	169.234619141
+6.78022675737	171.029663086
+6.80344671202	173.257110596
+6.82666666667	174.64654541
+6.84988662132	175.149429321
+6.87310657596	175.456039429
+6.89632653061	176.283660889
+6.91954648526	177.318511963
+6.94276643991	178.066696167
+6.96598639456	178.517211914
+6.98920634921	179.053573608
+7.01242630385	179.549285889
+7.0356462585	180.029403687
+7.05886621315	180.64515686
+7.0820861678	180.8934021
+7.10530612245	180.952774048
+7.1285260771	181.48147583
+7.15174603175	182.092208862
+7.17496598639	183.082504272
+7.19818594104	183.907089233
+7.22140589569	184.607666016
+7.24462585034	185.0181427
+7.26784580499	185.282440186
+7.29106575964	185.946502686
+7.31428571429	186.74571228
+7.33750566893	187.205505371
+7.36072562358	187.595703125
+7.38394557823	187.939483643
+7.40716553288	188.01159668
+7.43038548753	187.807418823
+7.45360544218	187.751464844
+7.47682539683	187.811416626
+7.50004535147	187.951507568
+7.52326530612	188.168029785
+7.54648526077	188.630828857
+7.56970521542	188.946014404
+7.59292517007	189.095901489
+7.61614512472	189.302886963
+7.63936507937	189.673339844
+7.66258503401	189.881591797
+7.68580498866	189.865234375
+7.70902494331	189.865234375
+7.73224489796	189.595870972
+7.75546485261	188.954116821
+7.77868480726	188.192108154
+7.8019047619	187.352645874
+7.82512471655	186.524551392
+7.8483446712	184.967712402
+7.87156462585	183.589355469
+7.8947845805	182.828231812
+7.91800453515	181.968215942
+7.9412244898	180.796981812
+7.96444444444	180.0
+7.98766439909	179.184524536
+8.01088435374	178.799484253
+8.03410430839	178.29347229
+8.05732426304	178.088272095
+8.08054421769	177.894317627
+8.10376417234	177.693618774
+8.12698412698	177.905075073
+8.15020408163	178.041549683
+8.17342403628	178.045135498
+8.19664399093	177.650650024
+8.21986394558	177.32208252
+8.24308390023	176.611938477
+8.26630385488	175.525878906
+8.28952380952	172.121078491
+8.31274376417	584.997009277
+8.33596371882	575.042358398
+8.35918367347	465.681121826
+8.38240362812	447.307037354
+8.40562358277	-1.0
+8.42884353741	-1.0
+8.45206349206	-1.0
+8.47528344671	-1.0
+8.49850340136	-1.0
+8.52172335601	-1.0
+8.54494331066	-1.0
+8.56816326531	-1.0
+8.59138321995	-1.0
+8.6146031746	-1.0
+8.63782312925	-1.0
+8.6610430839	-1.0
+8.68426303855	-1.0
+8.7074829932	-1.0
+8.73070294785	-1.0
+8.75392290249	-1.0
+8.77714285714	-1.0
+8.80036281179	-1.0
+8.82358276644	-1.0
+8.84680272109	-1.0
+8.87002267574	-1.0
+8.89324263039	-1.0
+8.91646258503	-1.0
+8.93968253968	-1.0
+8.96290249433	-1.0
+8.98612244898	-1.0
+9.00934240363	-1.0
+9.03256235828	-1.0
+9.05578231293	-1.0
+9.07900226757	-1.0
+9.10222222222	-1.0
+9.12544217687	-1.0
+9.14866213152	-1.0
+9.17188208617	-1.0
+9.19510204082	-1.0
+9.21832199546	-1.0
+9.24154195011	-1.0
+9.26476190476	-1.0
+9.28798185941	-1.0
+9.31120181406	-1.0
+9.33442176871	-1.0
+9.35764172336	-1.0
+9.380861678	-1.0
+9.40408163265	-1.0
+9.4273015873	-1.0
+9.45052154195	-1.0
+9.4737414966	-1.0
+9.49696145125	-1.0
+9.5201814059	-1.0
+9.54340136054	-1.0
+9.56662131519	-1.0
+9.58984126984	-1.0
+9.61306122449	-1.0
+9.63628117914	-1.0
+9.65950113379	-1.0
+9.68272108844	-1.0
+9.70594104308	-1.0
+9.72916099773	-1.0
+9.75238095238	-1.0
+9.77560090703	-1.0
+9.79882086168	-1.0
+9.82204081633	-1.0
+9.84526077098	-1.0
+9.86848072562	-1.0
+9.89170068027	-1.0
+9.91492063492	-1.0
+9.93814058957	-1.0
+9.96136054422	-1.0
+9.98458049887	-1.0
+10.0078004535	-1.0
+10.0310204082	-1.0
+10.0542403628	-1.0
+10.0774603175	-1.0
+10.1006802721	-1.0
+10.1239002268	-1.0
+10.1471201814	-1.0
+10.1703401361	-1.0
+10.1935600907	-1.0
+10.2167800454	-1.0
+10.24	-1.0
+10.2632199546	-1.0
+10.2864399093	100.193115234
+10.3096598639	-1.0
+10.3328798186	326.038757324
+10.3560997732	104.222053528
+10.3793197279	105.370048523
+10.4025396825	106.595123291
+10.4257596372	107.893875122
+10.4489795918	108.992500305
+10.4721995465	109.93119812
+10.4954195011	110.819335938
+10.5186394558	112.031303406
+10.5418594104	113.389472961
+10.5650793651	114.239830017
+10.5882993197	116.827377319
+10.6115192744	119.250427246
+10.634739229	122.184356689
+10.6579591837	148.222839355
+10.6811791383	150.104660034
+10.704399093	153.361968994
+10.7276190476	155.115112305
+10.7508390023	158.433624268
+10.7740589569	161.372955322
+10.7972789116	163.421096802
+10.8204988662	167.165771484
+10.8437188209	170.329452515
+10.8669387755	173.311584473
+10.8901587302	175.445571899
+10.9133786848	177.304244995
+10.9365986395	179.024490356
+10.9598185941	180.073501587
+10.9830385488	180.826629639
+11.0062585034	181.559936523
+11.029478458	182.487792969
+11.0526984127	183.303192139
+11.0759183673	183.976135254
+11.099138322	184.650161743
+11.1223582766	185.613876343
+11.1455782313	186.123062134
+11.1687981859	186.852523804
+11.1920181406	187.531890869
+11.2152380952	188.232284546
+11.2384580499	189.20135498
+11.2616780045	189.485900879
+11.2848979592	190.094390869
+11.3081179138	190.636749268
+11.3313378685	191.252670288
+11.3545578231	191.647476196
+11.3777777778	192.673187256
+11.4009977324	193.018920898
+11.4242176871	193.641860962
+11.4474376417	194.307373047
+11.4706575964	194.234619141
+11.493877551	194.290252686
+11.5170975057	194.641845703
+11.5403174603	194.663314819
+11.563537415	194.719177246
+11.5867573696	194.149108887
+11.6099773243	194.166213989
+11.6331972789	194.136291504
+11.6564172336	193.786529541
+11.6796371882	192.605865479
+11.7028571429	190.785202026
+11.7260770975	188.578399658
+11.7492970522	182.544433594
+11.7725170068	173.676742554
+11.7957369615	415.019744873
+11.8189569161	417.989685059
+11.8421768707	333.699066162
+11.8653968254	415.058837891
+11.88861678	352.025543213
+11.9118367347	-1.0
+11.9350566893	-1.0
+11.958276644	-1.0
+11.9814965986	-1.0
+12.0047165533	-1.0
+12.0279365079	-1.0
+12.0511564626	-1.0
+12.0743764172	-1.0
+12.0975963719	-1.0
+12.1208163265	-1.0
+12.1440362812	-1.0
+12.1672562358	-1.0
+12.1904761905	-1.0
+12.2136961451	-1.0
+12.2369160998	-1.0
+12.2601360544	-1.0
+12.2833560091	-1.0
+12.3065759637	-1.0
+12.3297959184	-1.0
+12.353015873	-1.0
+12.3762358277	-1.0
+12.3994557823	-1.0
+12.422675737	-1.0
+12.4458956916	-1.0
+12.4691156463	-1.0
+12.4923356009	-1.0
+12.5155555556	-1.0
+12.5387755102	-1.0
+12.5619954649	-1.0
+12.5852154195	-1.0
+12.6084353741	-1.0
+12.6316553288	-1.0
+12.6548752834	-1.0
+12.6780952381	-1.0
+12.7013151927	-1.0
+12.7245351474	-1.0
+12.747755102	-1.0
+12.7709750567	-1.0
+12.7941950113	-1.0
+12.817414966	-1.0
+12.8406349206	-1.0
+12.8638548753	-1.0
+12.8870748299	-1.0
+12.9102947846	-1.0
+12.9335147392	-1.0
+12.9567346939	-1.0
+12.9799546485	-1.0
+13.0031746032	-1.0
+13.0263945578	-1.0
+13.0496145125	-1.0
+13.0728344671	-1.0
+13.0960544218	-1.0
+13.1192743764	-1.0
+13.1424943311	-1.0
--- /dev/null
+++ b/tests/python/fft.py
@@ -1,0 +1,150 @@
+import unittest
+import math
+
+from aubio.aubiowrapper import *
+
+buf_size = 8092 
+channels = 4
+
+precision = 6
+
+class aubio_mfft_test_case(unittest.TestCase):
+
+  def setUp(self):
+    self.o = new_aubio_mfft(buf_size, channels)
+
+  def tearDown(self):
+    del_aubio_mfft(self.o)
+
+  def test_create(self):
+    """ test creation and deletion of fft object """
+    pass
+
+  def test_aubio_mfft_do_zeroes(self):
+    """ test aubio_mfft_do on zeroes """
+    input    = new_fvec(buf_size, channels)
+    fftgrain = new_cvec(buf_size, channels)
+    for index in range(buf_size):
+      for channel in range(channels):
+        self.assertEqual(0., fvec_read_sample(input, channel, index))
+    aubio_mfft_do(self.o, input, fftgrain)
+    for index in range(buf_size/2+1):
+      for channel in range(channels):
+        self.assertEqual(0., cvec_read_norm(fftgrain, channel, index))
+    for index in range(buf_size/2+1):
+      for channel in range(channels):
+        self.assertEqual(0., cvec_read_phas(fftgrain, channel, index))
+    del fftgrain
+    del input
+
+  def test_aubio_mfft_rdo_zeroes(self):
+    """ test aubio_mfft_rdo on zeroes """
+    fftgrain = new_cvec(buf_size, channels)
+    output    = new_fvec(buf_size, channels)
+    aubio_mfft_rdo(self.o, fftgrain, output)
+    # check output
+    for index in range(buf_size):
+      for channel in range(channels):
+        self.assertEqual(0., fvec_read_sample(output, channel, index))
+    del fftgrain
+    del output
+
+  def test_aubio_mfft_do_impulse(self):
+    """ 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.
+    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.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))
+    # check phas
+    for index in range(buf_size/2+1):
+      for channel in range(channels):
+        self.assertEqual(0., cvec_read_phas(fftgrain, channel, index))
+    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)
+    fftgrain = new_cvec(buf_size, channels)
+    # put an impulse in first an last channel, at first and last index
+    fvec_write_sample(input, 1., 0, 0)
+    fvec_write_sample(input, 1., channels-1, 0)
+    aubio_mfft_do(self.o, input, fftgrain)
+    # check the norm
+    for index in range(buf_size/2+1):
+      self.assertEqual(1., cvec_read_norm(fftgrain, 0, index))
+    for index in range(buf_size/2+1):
+      for channel in range(1, channels-1):
+        self.assertEqual(0., cvec_read_norm(fftgrain, channel, index))
+    for index in range(buf_size/2+1):
+      self.assertEqual(1., cvec_read_norm(fftgrain, channels-1, index))
+    # check the phase
+    for index in range(buf_size/2+1):
+      for channel in range(channels):
+        self.assertEqual(0., cvec_read_phas(fftgrain, channel, index))
+    del fftgrain
+    del input
+
+  def test_aubio_mfft_rdo_impulse(self):
+    """ test aubio_mfft_rdo on impulse """
+    fftgrain  = new_cvec(buf_size, channels)
+    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.assertAlmostEqual(fvec_read_sample(output, channel, index), 1./buf_size, precision)
+    del fftgrain
+    del output
+
+  def test_aubio_mfft_do_back_and_forth(self):
+    """ test aubio_mfft_rdo on a constant """
+    input    = new_fvec(buf_size, channels)
+    output   = new_fvec(buf_size, channels)
+    fftgrain = new_cvec(buf_size, channels)
+    for index in range(buf_size/2+1):
+      for channel in range(channels):
+        fvec_write_sample(input, 0.67, channel, index)
+    aubio_mfft_do(self.o, input, fftgrain)
+    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, precision)
+    del fftgrain
+    del output
+
+if __name__ == '__main__': unittest.main()
--- a/tests/python/fvec.py
+++ b/tests/python/fvec.py
@@ -21,7 +21,7 @@
     """ check new fvec elements are set to 0. """
     for index in range(buf_size):
       for channel in range(channels):
-        self.assertEqual(fvec_read_sample(self.vector,channel,index),0.)
+        self.assertEqual(0., fvec_read_sample(self.vector,channel,index))
 
   def test_fvec_write_sample(self):
     """ check new fvec elements are set with fvec_write_sample """
@@ -30,7 +30,7 @@
         fvec_write_sample(self.vector,1.,channel,index)
     for index in range(buf_size):
       for channel in range(channels):
-        self.assertEqual(fvec_read_sample(self.vector,channel,index),1.)
+        self.assertEqual(1., fvec_read_sample(self.vector,channel,index))
 
 if __name__ == '__main__':
   unittest.main()
--- /dev/null
+++ b/tests/python/phasevoc.py
@@ -1,0 +1,62 @@
+import unittest
+
+from aubio.aubiowrapper import *
+
+buf_size = 1024
+hop_size = 256
+channels = 2
+
+precision = 6
+
+class aubio_phasevoc_test(unittest.TestCase):
+
+  def setUp(self):
+    self.o = new_aubio_pvoc(buf_size, hop_size, channels)
+
+  def tearDown(self):
+    del_aubio_pvoc(self.o)
+
+  def test_create(self):
+    """ create and delete phasevoc object """
+    pass
+
+  def test_zeroes(self):
+    """ run phasevoc object on zeroes """
+    input    = new_fvec(hop_size, channels)
+    fftgrain = new_cvec(buf_size, channels)
+    output   = new_fvec(hop_size, channels)
+    for index in range(hop_size):
+      for channel in range(channels):
+        self.assertEqual(0., fvec_read_sample(input, channel, index))
+    aubio_pvoc_do (self.o, input, fftgrain)
+    aubio_pvoc_rdo(self.o, fftgrain, output)
+    for index in range(hop_size):
+      for channel in range(channels):
+        self.assertEqual(0., fvec_read_sample(output, channel, index))
+    del input
+    del fftgrain
+
+  def test_ones(self):
+    """ run phasevoc object on ones """
+    input    = new_fvec(hop_size, channels)
+    fftgrain = new_cvec(buf_size, channels)
+    output   = new_fvec(hop_size, channels)
+    for index in range(hop_size):
+      for channel in range(channels):
+        fvec_write_sample(input, 1., channel, index)
+        self.assertEqual(1., fvec_read_sample(input, channel, index))
+    # make sure the first buf_size-hop_size samples are zeroes
+    for i in range(buf_size/hop_size - 1):
+      aubio_pvoc_do (self.o, input, fftgrain)
+      aubio_pvoc_rdo(self.o, fftgrain, output)
+      for index in range(hop_size):
+        for channel in range(channels):
+          self.assertAlmostEqual(0., fvec_read_sample(output, channel, index), precision)
+    # make sure the first non zero input is correctly resynthesised
+    aubio_pvoc_do (self.o, input, fftgrain)
+    aubio_pvoc_rdo(self.o, fftgrain, output)
+    for index in range(hop_size):
+      for channel in range(channels):
+        self.assertAlmostEqual(1., fvec_read_sample(output, channel, index), precision)
+    del input
+    del fftgrain
--- a/tests/src/Makefile.am
+++ b/tests/src/Makefile.am
@@ -9,7 +9,8 @@
 	test-mfft \
 	test-hist \
 	test-scale \
-	test-sample \
+	test-cvec \
+	test-fvec \
 	test-window \
 	test-filter \
 	test-biquad \
--- /dev/null
+++ b/tests/src/test-cvec.c
@@ -1,0 +1,12 @@
+#include <aubio.h>
+
+int main(){
+        /* allocate some memory */
+        uint_t win_s      = 1024;                       /* window size */
+        uint_t channels   = 1;                          /* number of channel */
+        cvec_t * sp       = new_cvec (win_s, channels); /* input buffer */
+        del_cvec(sp);
+
+        return 0;
+}
+
--- /dev/null
+++ b/tests/src/test-fvec.c
@@ -1,0 +1,12 @@
+#include <aubio.h>
+
+int main(){
+        /* allocate some memory */
+        uint_t win_s      = 1024;                       /* window size */
+        uint_t channels   = 1;                          /* number of channel */
+        fvec_t * in       = new_fvec (win_s, channels); /* input buffer */
+        del_fvec(in);
+
+        return 0;
+}
+
--- a/tests/src/test-sample.c
+++ /dev/null
@@ -1,14 +1,0 @@
-#include <aubio.h>
-
-int main(){
-        /* allocate some memory */
-        uint_t win_s      = 1024;                       /* window size */
-        uint_t channels   = 1;                          /* number of channel */
-        fvec_t * in       = new_fvec (win_s, channels); /* input buffer */
-        cvec_t * sp       = new_cvec (win_s, channels); /* input buffer */
-        del_fvec(in);
-        del_cvec(sp);
-
-        return 0;
-}
-