...ich habe das mal eben aus einem uralten Programm meiner selbst
rausge-
copy-pasted, ohne dass ich das Wochenende darauf verwenden will.
Du brauchst irgendwo
#define SQUARE 1
#define Parzen 2 usw...
Die Funktion erzeugt einen Buffer, dessen Inhalt mit dem Eingabevektor
der FFT multipliziert werden muss, Position für Position. Nach der
Vektor-Mul muss der Eingabepuffer für die FFT in der Mitte große
Zahlen haben & an Anfang & Ende kleine.
Der Buffer time_window muss natürlich genauso groß sein wie Deine
FFT-Daten.
Gruß, Gerhard
-----------------------------
/* Berechnen einer Fensterfunktion. Die Werte werden im Gleitkomma-Array
* window[0..npoints-1] abgelegt.
*/
void mk_window(int wtype, int win_size) {
double f;
int j;
switch(wtype){
case SQUARE:
/* statt 0.999 waere eigentlich 1.0 korrekt, so werden aber
* eventuelle Rundungsfehler beim Uebergang zu Integers harmlos
gemacht.
*/
for(j=0; j<win_size; j++) time_window[j] = 0.999;
break;
case PARZEN:
for(j=0; j<win_size; j++){
time_window[j] =
1.0 - ( fabs( (j - 0.5 * (win_size-1)) / ( 0.5 *
(win_size+1))));
}
break;
case WELCH:
for(j=0; j<win_size; j++){
f= j - 0.5 * (win_size-1);
f = f / ( 0.5 * (win_size + 1));
time_window[j] = 1 - f * f;
}
break;
case HANN:
for(j=0; j<win_size; j++){
time_window[j] = 0.5 * ( 1 - cos( 2 pi j / (win_size-1)));
}
break;
case HAMMING:
for(j=0; j<win_size; j++){
time_window[j] = 0.54 -0.46 * cos( 2 pi j / (win_size-1));
}
break;
case BLACKMAN:
for(j=0; j<win_size; j++){
time_window[j] = 0.42
- 0.5 * cos( 2 pi j / (win_size-1))
+ 0.08 * cos( 4 pi j / (win_size-1));
}
break;
case BLACKMAN_HARRIS:
for(j=0; j<win_size; j++){
time_window[j] = 0.35875
- 0.48829 * cos( 2 pi j / (win_size-1))
+ 0.14128 * cos( 4 pi j / (win_size-1))
- 0.01168 * cos( 6 pi j / (win_size-1));
}
break;
}
} /* mk_window() */