www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Hanning Window


Autor: Johann (Gast)
Datum:

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.
Autor: Johann (Gast)
Datum:

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_w...
Autor: T. H. (pumpkin) Benutzerseite
Datum:

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

> 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).
Autor: Stefan (Gast)
Datum:

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"?
Autor: E. M. (elektromeister)
Datum:

Autor: J. S. (Firma: Selbstständig) (engineer) Benutzerseite
Datum:

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.
Autor: Balu (Gast)
Datum:

Wo könnte man mal nachlesen, welches Fesnter welche Vor und Nachteile
hat?
Autor: E. M. (elektromeister)
Datum:

Autor: FPGAler (Gast)
Datum:

VHDL-mässig ist Bartlett am einfachsten.
Autor: gerhard (Gast)
Datum:

...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() */
Autor: gerhard (Gast)
Datum:

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
Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net