Forum: Digitale Signalverarbeitung / DSP / Machine Learning Hanning Window


von Johann (Gast)


Lesenswert?

Hallo @ all.

Ich habe eine FFT programmiert. Jedoch noch ohne Fensterung. Hierzu habe 
ich einige Fragen:

1. Muss ich die Fensterung z.B. Hanning Window mit dem abgetasteten 
diskreten Signal multiplizieren?

2. Wo bekomme ich die Koeffizienten für das Hamming Window her?

3. Wie rechne ich aus dem Ergebnis der FFT (Betrag aus Real und 
Imaginärteil )die Fensterung wieder raus.

von Johann (Gast)


Lesenswert?

Hier schon mal ein guter Link wie man die Fensterfunktion berechnet. 
Jedoch wie man wieder wieder die Fensterfunktion im Frequenzbereich 
rausrechnet steht dort nicht.

http://www.statistics4u.com/fundstat_germ/ee_fft_windowing.html

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Johann wrote:
> 1. Muss ich die Fensterung z.B. Hanning Window mit dem abgetasteten
> diskreten Signal multiplizieren?

Du meinst das Hann-Fenster. Es gibt "Hamming", "(von) Hann" - aber nicht 
"Hanning". Ja, du multiplizierst die Abgetasteten Werte (den 
Signalausschnitt der Länge N) mit einer Gewichtungsfunktion der Länge N.

  weighted(n) = original(n) * window(n) (für n = 0..N-1)

> 2. Wo bekomme ich die Koeffizienten für das Hamming Window her?

Aus der Bildungsvorschrift:

  http://de.wikipedia.org/wiki/Fensterfunktion#von-Hann-Fenster_.28auch_bekannt_als_.E2.80.9ERaised-Cosinus-Fenster.E2.80.9C.29

> 3. Wie rechne ich aus dem Ergebnis der FFT (Betrag aus Real und
> Imaginärteil )die Fensterung wieder raus.

Wozu? Im Spektrum ist die Transformierte der Gewichtungsfunktion in das 
"ursprüngliche" Spektrum gefaltet (vgl. "Leck-Effekt"). Das ist genauso 
gewollt und je nachdem welche Gewichtungsfunktion man wählt hat man auf 
der einen Seite gewisse Vorteile die man sich durch Abstriche an anderen 
Stellen erkauft (z.B. amplitudengenaues vs. frequenzgenaues Spektrum).

von Stefan (Gast)


Lesenswert?

T. H. schrieb:
> z.B. amplitudengenaues vs. frequenzgenaues Spektrum

Welche Möglichkeiten gäbe es, diese Aspekte zu kombinieren?

Also wie kann ich "fenstern" um z.B. sehr genaue Amplituden und 
andererseits sehr genau Frequenzen zu bekommen?

Und: Was bedeutet "frequenzgenau"?

von Edi M. (Gast)


Lesenswert?


von J. S. (engineer) Benutzerseite


Lesenswert?

Johann schrieb:
> Wo bekomme ich die Koeffizienten für das Hamming Window her?

Hann ist eine einfache Sinus-Funktion, passend verschoben und als Glocke 
genutzt. Hamming ist ähnlich, leicht gestaucht und etwas angehoben- ein 
Kompromiss zwischen geringem Leckeffekt und Repräsentanz der 
Spektrallinien. Schau Dir auch mal die Gauss-Funktion an, sowie das 
blackman-Fenster.

von Balu (Gast)


Lesenswert?

Wo könnte man mal nachlesen, welches Fesnter welche Vor und Nachteile 
hat?

von Edi M. (Gast)


Lesenswert?


von FPGAler (Gast)


Lesenswert?

VHDL-mässig ist Bartlett am einfachsten.

von gerhard (Gast)


Lesenswert?

...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() */

von gerhard (Gast)


Lesenswert?

Ich hab' keine Ahnung wieso beim copy&paste aus "2 * pi *j" und so
die Sternchen entfernt wurden. Dafür wird PI fett angezeigt.
Abweichend vom Kommentar heißt der Buffer time_window und nicht window.

Gruß, Gerhard

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

http://www.mikrocontroller.net/articles/Formatierung_im_Forum
mit c und /c oder pre /pre in eckigen Klammern müsste es gehen

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.