mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Hanning Window


Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_w...

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-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:

Bewertung
0 lesenswert
nicht 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"?

Autor: Edi M. (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Balu (Gast)
Datum:

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

Autor: Edi M. (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: FPGAler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VHDL-mässig ist Bartlett am einfachsten.

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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() */

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.