This is makewindows.c in view mode; [Download] [Up]
#include "pv.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 ; /* * 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 ; float PI = 4.*atan(1.) ; /* * 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 ; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.