diff options
Diffstat (limited to 'lib/makewindows.c')
-rw-r--r-- | lib/makewindows.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/lib/makewindows.c b/lib/makewindows.c new file mode 100644 index 0000000..81a80f0 --- /dev/null +++ b/lib/makewindows.c @@ -0,0 +1 @@ +#include "fftease.h"
void makewindows( float *H, float *A, float *S, int Nw, int N, int I )
{
int i ;
float sum ;
for ( i = 0 ; i < Nw ; i++ )
H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ) ;
if ( Nw > N ) {
float x ;
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) ;
}
}
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 odd )
{
int i;
float sum ;
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) );
}
if ( Nw > N ) {
float x ;
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) ;
}
}
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 odd )
{
int i;
float sum ;
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)));
}
if ( Nw > N ) {
float x ;
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) ;
}
}
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 ;
}
}
\ No newline at end of file |