Ich experimentiere seit einiger Zeit mit digitalen Filtern, obwohl ich
kein Experte bin. Momentan versuche ich Fensterfunktionen auf ein
Goertzel Filter anzuwenden, also auf die Eingangsdaten. Im Prinzip
scheint das auch zu funktionieren.
Aber für einige Fensterfunktionen finde ich keinen Skalierungsfaktor
(bzw. Verstärkungsfaktor). In einem Buch habe ich gefunden, das die
Skalierung vom ersten konstanten Faktor der Fenster Funktion abhängig
ist. Aber diesen scheint es für Sinc und Cosinus Fenster nicht zu geben.
Durch Experimente habe ich herausgefunden, das für Cosinus Fenster PI/2
zu funktionieren scheint. Aber für Sinc-Fenster finde ich nichts.
Kann mir da vielleicht jemand einen produktiven Denkanstoß geben?
Also der Programmcode für die entsprechenden Fensterfunktionen ist etwa:
1 | switch( type ) {
|
2 | ...
|
3 | case wt_HANNING: // Von Hann window - zum Vergleich
|
4 | scale = 1.0 / 0.5;
|
5 | for( n = 0; n < num; n++ ) {
|
6 | weight = 0.5
|
7 | - (0.5 * cos( 2 * M_PI * i * factor ))
|
8 | ;
|
9 | v[i] *= weight;
|
10 | i--;
|
11 | }
|
12 | break;
|
13 |
|
14 | case wt_LANCZOS:
|
15 | //scale = M_PI / 2.0; // Ergebnis noch ca 1dB zu niedrig
|
16 | // bei scale = 1.0 ca. 6 dB zu niedrig
|
17 | for( n = 0; n < num; n++ ) {
|
18 | weight = Sinc( ((2 * i * factor) - 1) * M_PI );
|
19 | v[i] *= weight;
|
20 | i--;
|
21 | }
|
22 | break;
|
23 |
|
24 | case wt_COSINUS: // ok
|
25 | scale = M_PI / 2.0;
|
26 | for( n = 0; n < num; n++ ) {
|
27 | weight = sin( M_PI * i * factor );
|
28 | v[i] *= weight;
|
29 | i--;
|
30 | }
|
31 | break;
|
32 | ...
|
Anmerkung:
i ist der datenindex
factor ist
1 | double factor = 1.0 / (num - 1); // num=num of samples
|
Um das zu demonstrieren füge ich mal 2 Bilder meines Auswerteprogramms
an, das erste ohne Fensterfunktion und das zweite mit Lanczos
Fensterfunktion. Die kleinen Einsprünge in den Kurven bitte ich zu
ignorieren. Die habe mit der nicht optimalen Auswertung zu tun
(Phasenlage des Oszillators).