diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2009-04-01 21:13:09 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2009-04-01 21:13:09 +0000 |
commit | 0ed7a8b68dd73e2b0473b8127aeca99f3bac9061 (patch) | |
tree | 5c67818b38a5cc2f9caa5ca7f8640ca356adf02b /externals/grill/fftease/src/convert.c | |
parent | bb4c7f6a245394d09dac9adfb2efb093d3d98452 (diff) |
cleaned up grill externals - replaced with svn:externals to svn.grrrr.org/ext/trunk/
svn path=/trunk/; revision=10951
Diffstat (limited to 'externals/grill/fftease/src/convert.c')
-rw-r--r-- | externals/grill/fftease/src/convert.c | 134 |
1 files changed, 0 insertions, 134 deletions
diff --git a/externals/grill/fftease/src/convert.c b/externals/grill/fftease/src/convert.c deleted file mode 100644 index 006e4cf7..00000000 --- a/externals/grill/fftease/src/convert.c +++ /dev/null @@ -1,134 +0,0 @@ -#include "pv.h" - -/* S is a spectrum in rfft format, i.e., it contains N real values - arranged as real followed by imaginary values, except for first - two values, which are real parts of 0 and Nyquist frequencies; - convert first changes these into N/2+1 PAIRS of magnitude and - phase values to be stored in output array C; the phases are then - unwrapped and successive phase differences are used to compute - estimates of the instantaneous frequencies for each phase vocoder - analysis channel; decimation rate D and sampling rate R are used - to render these frequency values directly in Hz. */ - -void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor ) -{ -#if 1 - float phase,phasediff; - int even,odd; - float a,b; - int i; - - for ( i = 0; i <= N2; i++ ) { - odd = ( even = i<<1 ) + 1; - a = ( i == N2 ? S[1] : S[even] ); - b = ( i == 0 || i == N2 ? 0. : S[odd] ); - - C[even] = hypot( a, b ); - if ( C[even] == 0. ) - phasediff = 0.; - else { - phase = -atan2( b, a ); - phasediff = fmod(phase - lastphase[i] + (PV_2PI+PV_PI), PV_2PI)-PV_PI; - lastphase[i] = phase; - } - - C[odd] = phasediff*factor + i*fundamental; - } -#else - float phase, - phasediff; - int real, - imag, - amp, - freq; - float a, - b; - int i; - - float myTWOPI, myPI; - - myTWOPI = 8.*atan(1.); - myPI = 4.*atan(1.); - - - for ( i = 0; i <= N2; i++ ) { - imag = freq = ( real = amp = i<<1 ) + 1; - a = ( i == N2 ? S[1] : S[real] ); - b = ( i == 0 || i == N2 ? 0. : S[imag] ); - - C[amp] = hypot( a, b ); - if ( C[amp] == 0. ) - phasediff = 0.; - else { - phasediff = ( phase = -atan2( b, a ) ) - lastphase[i]; - lastphase[i] = phase; - - // TG: DANGEROUS!!!! (and slow, if lastphase not correctly initialized) - while ( phasediff > myPI ) - phasediff -= myTWOPI; - while ( phasediff < -myPI ) - phasediff += myTWOPI; - } - C[freq] = phasediff*factor + i*fundamental; - /* - if( i > 8 && i < 12 ) { - fprintf(stderr,"convert freq %d: %f\n",i, C[freq]); - } - */ - } -#endif -} - - -void unconvert(float *C, float *S, int N2, float *lastphase, float fundamental, float factor ) -{ -#if 1 - int i,even,odd; - float mag,phase; - - for ( i = 0; i <= N2; i++ ) { - odd = ( even = i<<1 ) + 1; - - mag = C[even]; - lastphase[i] += C[odd] - i*fundamental; - phase = lastphase[i]*factor; - - if(i != N2) { - S[even] = mag*cos( phase ); - S[odd] = -mag*sin( phase ); - } - else - S[1] = mag*cos( phase ); - } -#else - int i, - real, - imag, - amp, - freq; - float mag, - phase; - - for ( i = 0; i <= N2; i++ ) { - - imag = freq = ( real = amp = i<<1 ) + 1; - - if ( i == N2 ) - real = 1; - - mag = C[amp]; - lastphase[i] += C[freq] - i*fundamental; - phase = lastphase[i]*factor; - S[real] = mag*cos( phase ); - - if ( i != N2 ) - S[imag] = -mag*sin( phase ); - /* - if( i == 10 ) { - fprintf(stderr,"unconvert: amp: %f freq: %f funda %f fac %f\n", C[amp],C[freq],fundamental,factor); - } - */ - } - -#endif -} |