WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

FFT Amplitudmessung, Windowing

 

FloGz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2012, 15:43     Titel: FFT Amplitudmessung, Windowing
  Antworten mit Zitat      
Hallo zusammen

Ich möchte mit einer FFT eines Signals die Amplitude bei einer bestimmten Frequenz messen. In der Simulation in Matlab stelle ich jedoch fest, dass der angezeigt Wert der Amplitude nicht korrekt ist. Wo mache ich den Fehler? Ja ich Normiere auf die Anzahl der Samples.
Auch versuche ich die Auswirkung der Wahl des Fensters (rectangular, hanning, flattopwin) festzustellen.

Das Matlab Beispiel das ich erstellt habe, ist angehängt.

Ein Screenshot des plots der FFT ist auch angehängt.

Meine Fragen:
- Wie kann ich die Genauigkeit der Amplitudenmessung in der FFT beeinflussen? Oder was mache ich in meinem m-File falsch?
- Sehe ich es richtig, dass die Frequenzauflösung (Abstand der Werte in der FFT in Hz) delta f = 1/Aufnahmezeit ist? Also 1s langes Signal -> 1Hz Frequenzauflösung
- Sehe ich es richtig, dass die Samplerate den maximalen Frequenzwert in der FFT bestimmt. Also Fs= 30kHz -> 1/2*30kHz ist die maximal angezeigte Frequenz in der FFT

gruß Flo

fft_plot.png
 Beschreibung:

Download
 Dateiname:  fft_plot.png
 Dateigröße:  15.3 KB
 Heruntergeladen:  1327 mal
fft_test.m
 Beschreibung:

Download
 Dateiname:  fft_test.m
 Dateigröße:  1.34 KB
 Heruntergeladen:  612 mal


FloGz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2012, 15:46     Titel:
  Antworten mit Zitat      
Ergänzung:
auf dem angehängten png-file ist natürlich die Amplitude über der Frequenz in Hz aufgetragen (habe die achsenbeschriftung vergessen).

Zu sehen ist dass die blaue Kurve einen peak bei 0,678 hat. Die Amplitude des reinen Sinus ist jedoch 1 und 1/sqrt(2) = 0,707 wäre immer noch größer als dieser peak
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.06.2012, 15:54     Titel:
  Antworten mit Zitat      
Diese Skript sollte vieler deinen Fragen beantworten.

http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Bist du dir sicher, dass in deinem Spektrum kein Leakage auftritt? Das ist ganz einfach Prüfbar.

Die Freq.-auflösung df deines Spektrums ist Abtastfreq./Anzahl Messwerte
Sind die Signalfreq. keine ganzzahligen Vielfache von df tritt Leakage auf. Somit treten um die eigentliche Signalfreq. weitere Freq. auf.
Private Nachricht senden Benutzer-Profile anzeigen
 
FloG
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2012, 11:59     Titel:
  Antworten mit Zitat      
Danke für die Antwort.

Deine Antwort deckt sich mit der Codezeile in dem von dir genannten Beispiel: df = fa/N;
Das ist aber auch genau das was ich gesagt habe: df = 1 / Aufnahmezeit,
denn tAufnahme = N/fa. Will ich also df kleiner machen, muss ich N erhöhen, dadurch würde sich aber auch fa erhöhen. N wird bei konstantem fa nur erhöht, wenn die Aufnahmezeit vergrößert wird. -> df=1Hz bei 1s Aufnahmezeit.

Ja Spectral leakage tritt wohl auf. Durch passende Fensterfunktion (laut http://www.ni.com/white-paper/4844/en), Flattop-Fenster, kann ich den Fehler in der Amplitudenanzeige minimieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.06.2012, 13:12     Titel:
  Antworten mit Zitat      
Das ist wohl richtig. Man kann die Auflösung aber auch durch Zeropadding erhöhen. Hier werden dann Nullen an das Signal vor der Transformation gehängt. Man erhält dadurch zwar keine neuen Information, aber eben eine genauere Auflösung/Freq. der Spektrallinien. Die Funktion fft(signal,nfft) macht das Zeropadding automatisch, wenn nfft > length(signal) ist.

Die Skalierung des pos. Freq.-spektrums stimmt, aber nicht die Normierung des Fensters. Dies ist auch in dem Skript gezeigt.

Code:

% Fensterung mit Amplitudenkorrektur z.B. für
win = flattopwin(NFFT)';
y_win = y.*win*NFFT/sum(win);
 


Edit: Da hier Leakage auftritt, ist die Amplitude natürlich ohne Fenster niedriger. Wie du schon richtig schreibst, ist für Amplitudengenauigkeit das Flattopwin am Besten geeignet. Dafür treten aber deutliche Nebenfreq. neben der Signalfreq. auf. Ist man eher an der genauen Freq. als der Amplitude interessiert, nimmt man eher ein Hamming oder Blackman Win.
Private Nachricht senden Benutzer-Profile anzeigen
 
FloG
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2012, 14:04     Titel:
  Antworten mit Zitat      
Zero padding kenn ich. Ok es verfeinert mir meine Frequenzauflösung, aber ich dachte es verschmiert auch das Spektrum, also es ändert die Werte der Amplitude? Darum hab ich als NFFT nicht nextpower2 gewählt sondern die hälfte davon, wenn man so will "previouspower2" (wenn die Anzahl der Samples keiner Zweierpotenz entspricht, nimm die nächst kleinere Zweierpotenz). Damit eben kein Zero padding auftritt.

Das mit dem Normieren bei den Fenstern hab ich gesehen. Ist da immer die selbe Umrechnung (*NFFT/sum(win)) zu verwenden, egal welche Fensterfunktion (hann, flattopwin,...) ich verwende?
Private Nachricht senden Benutzer-Profile anzeigen
 
FloG
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2012, 14:30     Titel:
  Antworten mit Zitat      
Noch eine Sache fällt mir gerade ein. Angenommen ich habe ein Signal das 1025 Samples lang ist. Mit zero padding wird es auf 2048 Samples verlängert. Das zero padding geschieht erst durch den Befehl fft. Wenn ich zuvor eine Fensterfunktion anwende, wende ich diese natürlich auf das Zeitsignal mit 1025 samples an. Dann bilde ich hierüber die FFT. Oder muss ich viel eher das Zeitsignal von Hand auf 2048 Samples mit Nullen erweitern und nun das Fenster über diese 2048 Samples anlegen und dann die FFT ohne zusätzliches Zero Padding bilden?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.06.2012, 14:59     Titel:
  Antworten mit Zitat      
Erst Fenstern dann Zeropadding...du willst ja die abrupten Übergänge vermeiden, bzw. das Fenster sorgt dafür, dass beide Enden gleich sind. Das Leakage entsteht ja, da nicht ganze Perioden des Signals im Messfenster enthalten sind. Durch die Fensterung wird das Signal an den Enden ja so verändert, dass es "fast ganze Perioden" werden.

Durch Zeropadding wird logischerweise auch Leakage gefördert, denn den Zusammenhang zwischen df und deinen Signalfreq. habe ich ja erläutert. N wird höher und dadurch df kleiner. War die Signalfreq. vorher ein ganzes Vielfaches zu df, könnte dies nach dem Zeropadding nicht mehr der Fall sein. In der Realität hat man es aber wohl in den meisten Fällen der Spektralanalyse mit Leakage zu tun. Deshalb wurden die Fenster ja auch entwickelt. Man muss diesen Effekt aber immer im Hinterkopf behalten, wenn man ein Spektrum betrachtet.

Die Normierung ist für jedes Fenster gleich.
Private Nachricht senden Benutzer-Profile anzeigen
 
FloG
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2012, 11:03     Titel:
  Antworten mit Zitat      
Vielen Dank DSP für deine Antworten.

Eine Sache verwundert mich aber noch. Ich habe folgendes Szenario in Matlab simuliert.
Abtastrate 16000 Samples/s
Anzahl Abtastwerte 8192
-> df = 1,953125 Hz

Signalamplitude jeweils 1.
Signalfrequenz in der ersten Simulation = 1000 * df
-> 1000 Perioden des Signals sind in meinen 8192 Samples enthalten. Spectral leakage sollte nicht vorhanden sein.
Signalfrequenz in einer zweiten Simulation = 1000,5 * df
-> 1000 und eine halbe Periode des Signals sind in meinen 8192 Samples enthalten. Spectral leakage sollte maximal vorhanden sein.

Ich habe jeweils eine FFT für das Zeitsignal mit Rechteckfenster, mit Hanning und mit Flattop berechnet.

In der ersten Simulation mit einer Signalfrequenz die einem ganzen vielfachen der Frequenzauflösung entspricht war die Amplitude in der FFT bei allen 3 Fenstern = 1. Also eine richtige Anzeige.
Für die zweite Simulation mit einer Signalfrequenz ungleich einem ganzen vielfachen der Frequenzauflösung, also einer halben Sinusperiode am Ende des Signals: Flattop = 0,99911, Hanning = 0,85789 und Rechteck = 0,65715. Beim Rechteckfenster ist also eine Abweichung von 34,3%!!!
Es ist für mich nun verwunderlich, dass eine solche hohe Abweichung auftritt. Bei 16kSa/s und 8192 Werten bilde ich die FFT über 1000 Perioden der ersten Signalfrequenz. Mit der zweiten Frequenz habe ich auch 1000 Perioden und nur eine halbe mehr. Warum verursacht diese eine halbe Periode bei 1000 weiteren ganzen Perioden eine Abweichung von 34%?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 11.06.2012, 11:42     Titel:
  Antworten mit Zitat      
Mathematisch kann ich dir das nicht erklären...

http://de.wikipedia.org/wiki/Leck-Effekt

Im zweiten Bild unter zeitdiskrete Systeme wird der Grund für die hohe Abweichung aber deutlich. Die DFT/FFT berechnet ja immer nur zu den diskreten Frequenzen im Abstand df die Signalenergie/-leistung. Treffe ich mit der Schrittweite nun nicht die genaue Signalfreq., wird die Energie auf mehrere diskrete Freq. verteilt. Daher kommen die hohen Abweichung...die Energie/Leistung steckt eben mit in den Nebenmaxima, was man unten rechts sehr gut sieht. Die Abweichung könnte aber auch geringer sein, will sagen, die 34% sind nicht grundsätzlich anzunehmen. Ohne es getestet zu haben, vermute ich aber, dass die Abweichung maximal ist, wenn die Signalfreq. genau in der Mitte der eigentlich Schrittweite liegt. Bsp. 2 Hz Auflösung df und nun jede ungerade Signalfreq.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.