Verfasst am: 22.09.2015, 14:46
Titel: FFt und Fensterfunktion
Hallo Miteinander,
ich habe noch ein paar Probleme mit einer FFT und deren FensterFunktion. Ich Habe mir ein Vektor By erzeugt und ein BX. Diesen transformiere ich mir in den Frequenzbereich . Die Frequenzachse passt soweit auch, nur leider die Ampliutenachse nicht.
Normalerweise lese ich mir die Daten aus einer Datei und um eine Testfunktion zu erzeugen habe ich By = 15 *sin(2*pi*1e6*Bx) definiert. Im ideafall sollten hierbei 40,255 dBm raus kommen. Bei mir, nach der Fensterrung kommen 38,75dBm raus. Aber warum ?
Wenn die Signalfrequenz f kein ganzes Vielfaches der Frequenzauflösung df = Abtastfrequenz / Anzahl Messwerte ist, kommt es zum sogenannten Leakage Effekt. Die Signalfrequenz kann dann nicht genau ermittelt werden, was sich im Spektrum durch eine niedrigere Amplitude und dem Auftreten von Nebenmaxima rechts und links der Signalfrequenz f ausdrückt. Die Fensterfunktion soll diese Nebenmaxima minimieren, je nach gewähltem Fenster. Das Flattop window verwendet man, wenn Amplitudengenauigkeit wichtig ist. Dabei werden aber die Nebenmaxima weniger stark gefiltert.
Was ich allerdings nicht verstehe, wie du bei einem Spannungspegel von 10V auf 38,49dbm kommst. Wofür steht überhaupt das m? Es müssten doch eigentlich dBV sein und die Umrechnung von einer Feldgröße zum Spannungspegel ist dann:
Code:
% Umrechnung in dB, mag = Magnitude
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
dBm steht für Dezibel mit Bezugsgröße Milliwatt...
Maike
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2015, 12:46
Titel:
@ Epfi
das '"m" steht hierfür für Milliwatt.
Ich habe mich bei dem Kommentar leider verschrieben in wirklichkeit sind es in diesem Beispiel 15W und 10 W.
Umrechnung von Watt in dbm -> 10*log(P/1mW)
Das P steht hierfür für eine mittlere leistung in meinem Fall z.B. für 15 W Peak -> P=15W/sqrt(2) -> sqrt(2) weil der Mittelwert einer sinus / cosinus welle mit Hilfe von sqrt(2) berechnen lässt.
Das Flattop window habe ich wegen der Genauigkeit extra dafür gewählt. In meinem Fall hab eich doch durch die Interpolation der Funktion ein Vielfaches der Frequenzauflösung df oder nicht ? Dementsprechend müsste doch die Ausgangsamplitude stimmen...
Mit der Einheit Watt statt Volt macht das natürlich mehr Sinn. Nur muss bei 10W nicht trotzdem ein glatter dBm Wert von 40 herauskommen?
Ich habe dir doch den Link zu einem Skript gegeben...nicht nur aus lauter Langeweile . Dein Code ist nämlich nicht korrekt.
Siehe richtige Fensterung:
Code:
% Anhang an die bereits erfolgte Untersuchung % -------------------------------------------
win = hann(N)'; % oder jedes andere beliebige Fenster % y_win = y.*win; % Fensterung ohne Amplitudenkorrektur
y_win = y.*win*N/sum(win); % Fensterung mit Amplitudenkorrektur
Auch die Amplitude stimmt bei dir nicht. Willst du eigentlich nur den positiven Frequenzbereich darstellen oder ein zweiseitige Spektrum? Je nach dem muss unterschiedlich skaliert werden. Siehe Skript...
Code:
% Berechnung der FFT % ------------------
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% ... % Darstellung des interessierenden Frequenzbereichs des % Amplitudengangs (0...fn) und % daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2)]; % DC-Bin auf N normieren!
Wenn du interpolierst entspricht das ja einem upsampling. Daher ändert sich die Abtastfrequenz und die Anzahl Messwerte und so logischerweise auch die Frequenzauflösung. Ich empfehle dir auch wenn möglich statt
interp1
lieber die Funktion
resample
zu verwenden, da dort ein Antialiasing Filter automatisch mit verwendet wird.
Falls du allerdings auf das Leistungsdichtespektrum deines Signals aus bist, solltest du eher die Funktion
pwelch
bevorzugen.
Maike
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2015, 15:05
Titel:
Danke schon einmal vorab für die Hilfe.
Ich habe mein Programm soweit abgeändert und bekomme immer noch einen falschen Amplitudenwert heraus (+1,7 dB).
der Befehl resample ist leider bei mir nicht brauchbar , Weil "resamples the input sequence, x, at p/q times the original sample rate" -> wenn man meine SInus funktion aufmacht sieht man, dass die Zeitpunkte nicht Äquidistant sind....
Schau dir den Peak bei 5 Hz an. In der linearen Darstellung ergibt sich im Frequenzspektrum ebenfalls eine Amplitude von 5, was umgerechnet rund 6.9dB entspricht. Auch dieser Wert ist in der log. Darstellung vorhanden.
Maike
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2015, 16:49
Titel:
Ja, dasselbe habe ich auch raus. Auch bei dir stimmt die Amplitude nicht wirklich . Liegt das an der Fensterrung oder warum hat man da unterschiede von teilweise 2 dB
Was soll daran nicht stimmen? Ich habe sowohl beim Hanning wie auch beim Flattop Fenster rund 6.9dB, was linear 5 entspricht.
Einstellungen und Berechtigungen
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
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.