Forum: Digitale Signalverarbeitung / DSP / Machine Learning Fenster Funktion anwenden, welcher Gain Faktor?


von Manfred M. (bittbeisser)


Angehängte Dateien:

Lesenswert?

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).

: Bearbeitet durch User
von Alexxx (Gast)


Lesenswert?

Für ALLE FIR-Filter gilt:
Verstärkung = Summe (der gefensterten Koeffizienten) / 
Ausgangsskalierung!!
Wenn dich nur die Verstärkung der Fensterfunktion interessiert, dann 
halt
V= Summe der (verwendeten)Fensterwerte! Durch die Multiplikation 
bekommst du dann aber wieder kleine Rundungsfehler rein, also besser die 
gefensterten Koeffizienten aufd V= 1 skalieren - wie oben beschrieben...

von Manfred M. (bittbeisser)


Lesenswert?

Hallo,

Das mit den Filterkoeffizienten ist im Prinzip bekannt. Allerdings ist 
der Goertzel Algorithmus kein FIR Filter und hat auch keine 
Koeffizienten. Er wird meist als Sonderfall einer FFT bezeichnet. Was in 
meinen Bildern im Tap Fenster angezeigt wird, ist in diesem Fall 
eigentlich die Größe des Sample Puffers. Die Fensterfunktion wird hier 
also auf die Eingangsdaten angewandt.

Im Buch "Signalverarbeitung" von Martin Meyer (Aufl.6) wird auf Seite 
195 erwähnt, das der Korrekturfaktor immer der Kehrwert des konstanten 
Gliedes der Fensterfunktion ist.

Mein Problem ist, das es diesen Wert bei einigen Fensterfunktionen nicht 
gibt.

Mein Kommentar im Programmcode ist übrigens fehlerhaft. Die Abweichung 
beträgt etwa 4.7 dB womit der Korrekturfaktor irgendwo bei 1.7 liegen 
sollte. Ich habe aber keine Ahnung ob der konstant ist.

von Signalverarbeiter (Gast)


Lesenswert?

Die Skalierung hängt von der Signalbandbreite ab, die von der jeweiligen 
G-Frequenz abgedeckt wird.

von Manfred M. (bittbeisser)


Lesenswert?

Also die normale Skalierung führe ich natürlich durch. Ohne diese kann 
man sehr deutlich eine Pegeldifferenz von 6dB beobachten, wenn die 
Anzahl der Samples, und damit die Bandbreite, halbiert oder verdoppelt 
wird.

Meine Frage bezog sich auf die zusätzliche Anwendung einer 
Fensterfunktion auf die Eingangsdaten. Bei allen Fensterfunktionen, die 
auf irgendwelchen bewerteten Cos-Termen aufbauen (Hamming,Blackman 
u.s.w.) funktioniert das ja auch, denn die haben einen konstanten 
Anteil. Aber bei anderen Funktionen wie z.B. Lanczos oder Gauss geht das 
nicht.

Für Lanczos habe ich jetzt experimentell einen Korrekturfaktor von ca. 
1.74 ermittelt.

Momentan frage ich mich allerdings, inwiefern das auch zweckdienlich 
ist, denn die Kurven werden dann recht breit. Allerdings scheint mir die 
Anwendung anderer Filter für meinen Zweck (Morsedecoder) doch sehr viel 
aufwändiger.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.