diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2003-01-07 00:28:39 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2003-01-07 00:28:39 +0000 |
commit | 0182bbff2871114a4e93cc97942da621491f0e02 (patch) | |
tree | 039da4b12120b8481391c0fc904664c3dcbe7449 /externals/grill/fftease/src/makewindows.c | |
parent | ea175e0b95f848dcd203e7fbc1941c20616ec4f5 (diff) |
""
svn path=/trunk/; revision=325
Diffstat (limited to 'externals/grill/fftease/src/makewindows.c')
-rw-r--r-- | externals/grill/fftease/src/makewindows.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/externals/grill/fftease/src/makewindows.c b/externals/grill/fftease/src/makewindows.c new file mode 100644 index 00000000..1287390e --- /dev/null +++ b/externals/grill/fftease/src/makewindows.c @@ -0,0 +1,202 @@ +#include "pv.h" +#include "math.h" + +/* + * make balanced pair of analysis (A) and synthesis (S) windows; + * window lengths are Nw, FFT length is N, synthesis interpolation + * factor is I, and osc is true (1) if oscillator bank resynthesis + * is specified + */ +void makewindows( float *H, float *A, float *S, int Nw, int N, int I, int osc ) +{ + int i ; + float sum ; +float PI, TWOPI; + +PI = 3.141592653589793115997963468544185161590576171875; +TWOPI = 6.28318530717958623199592693708837032318115234375; + +/* + * basic Hamming windows + */ + for ( i = 0 ; i < Nw ; i++ ) + H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ) ; +/* + * when Nw > N, also apply interpolating (sinc) windows to + * ensure that window are 0 at increments of N (the FFT length) + * away from the center of the analysis window and of I away + * from the center of the synthesis window + */ + if ( Nw > N ) { + float x ; + +/* + * take care to create symmetrical windows + */ + x = -(Nw - 1)/2. ; + for ( i = 0 ; i < Nw ; i++, x += 1. ) + if ( x != 0. ) { + A[i] *= N*sin( PI*x/N )/(PI*x) ; + if ( I ) + S[i] *= I*sin( PI*x/I )/(PI*x) ; + } + } +/* + * normalize windows for unity gain across unmodified + * analysis-synthesis procedure + */ + for ( sum = i = 0 ; i < Nw ; i++ ) + sum += A[i] ; + + for ( i = 0 ; i < Nw ; i++ ) { + float afac = 2./sum ; + float sfac = Nw > N ? 1./afac : afac ; + A[i] *= afac ; + S[i] *= sfac ; + } + + if ( Nw <= N && I ) { + for ( sum = i = 0 ; i < Nw ; i += I ) + sum += S[i]*S[i] ; + for ( sum = 1./sum, i = 0 ; i < Nw ; i++ ) + S[i] *= sum ; + } +} + +void makehamming( float *H, float *A, float *S, int Nw, int N, int I, int osc,int odd ) +{ + int i; + float sum ; +float PI, TWOPI; + +PI = 3.141592653589793115997963468544185161590576171875; +TWOPI = 6.28318530717958623199592693708837032318115234375; + +/* + * basic Hamming windows + */ + + + if (odd) { + for ( i = 0 ; i < Nw ; i++ ) + H[i] = A[i] = S[i] = sqrt(0.54 - 0.46*cos( TWOPI*i/(Nw - 1) )); + } + + else { + + for ( i = 0 ; i < Nw ; i++ ) + H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ); + + } + +/* + * when Nw > N, also apply interpolating (sinc) windows to + * ensure that window are 0 at increments of N (the FFT length) + * away from the center of the analysis window and of I away + * from the center of the synthesis window + */ + if ( Nw > N ) { + float x ; + +/* + * take care to create symmetrical windows + */ + x = -(Nw - 1)/2. ; + for ( i = 0 ; i < Nw ; i++, x += 1. ) + if ( x != 0. ) { + A[i] *= N*sin( PI*x/N )/(PI*x) ; + if ( I ) + S[i] *= I*sin( PI*x/I )/(PI*x) ; + } + } +/* + * normalize windows for unity gain across unmodified + * analysis-synthesis procedure + */ + for ( sum = i = 0 ; i < Nw ; i++ ) + sum += A[i] ; + + for ( i = 0 ; i < Nw ; i++ ) { + float afac = 2./sum ; + float sfac = Nw > N ? 1./afac : afac ; + A[i] *= afac ; + S[i] *= sfac ; + } + + if ( Nw <= N && I ) { + for ( sum = i = 0 ; i < Nw ; i += I ) + sum += S[i]*S[i] ; + for ( sum = 1./sum, i = 0 ; i < Nw ; i++ ) + S[i] *= sum ; + } +} + + +void makehanning( float *H, float *A, float *S, int Nw, int N, int I, int osc, int odd ) +{ + int i; + float sum ; +float PI, TWOPI; + +PI = 3.141592653589793115997963468544185161590576171875; +TWOPI = 6.28318530717958623199592693708837032318115234375; + +/* + * basic Hanning windows + */ + + + if (odd) { + for ( i = 0 ; i < Nw ; i++ ) + H[i] = A[i] = S[i] = sqrt(0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1)))); + } + + else { + + for ( i = 0 ; i < Nw ; i++ ) + H[i] = A[i] = S[i] = 0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1))); + + } + +/* + * when Nw > N, also apply interpolating (sinc) windows to + * ensure that window are 0 at increments of N (the FFT length) + * away from the center of the analysis window and of I away + * from the center of the synthesis window + */ + if ( Nw > N ) { + float x ; + +/* + * take care to create symmetrical windows + */ + x = -(Nw - 1)/2. ; + for ( i = 0 ; i < Nw ; i++, x += 1. ) + if ( x != 0. ) { + A[i] *= N*sin( PI*x/N )/(PI*x) ; + if ( I ) + S[i] *= I*sin( PI*x/I )/(PI*x) ; + } + } +/* + * normalize windows for unity gain across unmodified + * analysis-synthesis procedure + */ + for ( sum = i = 0 ; i < Nw ; i++ ) + sum += A[i] ; + + for ( i = 0 ; i < Nw ; i++ ) { + float afac = 2./sum ; + float sfac = Nw > N ? 1./afac : afac ; + A[i] *= afac ; + S[i] *= sfac ; + } + + if ( Nw <= N && I ) { + for ( sum = i = 0 ; i < Nw ; i += I ) + sum += S[i]*S[i] ; + for ( sum = 1./sum, i = 0 ; i < Nw ; i++ ) + S[i] *= sum ; + } +} + |