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 und Fensterfunktion

 

Maike

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2015, 14:46     Titel: FFt und Fensterfunktion
  Antworten mit Zitat      
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 ?
Code:

clear all; clc; close all;
B = importdata('File', ';'); % Hier File Adresse eingeben
Bx=linspace(B(1,1),B(end,1),length(B(:,1)))';
By=interp1(B(:,1),B(:,2),Bx);

By = 15 *sin(2*pi*1e6*Bx); % 10V -> 38,49dbm , 15-> -> 40,255 dBm

f_B = 1/(Bx(2)-Bx(1));      % Abtastzeitpunkte festlegen

%w = flattopwin(length(Bx))';
w = hann(length(Bx));
wsignal = By(:).*w;
ws=sum(w);
Y= 10*log10(1000*abs(fft(wsignal)/ws));


Bx_FFT = f_B/length(B(:,1))*(0:length(B(:,1))-1)';
plot(Bx_FFT,Y);

 


sinus_5v_500k.txt
 Beschreibung:

Download
 Dateiname:  sinus_5v_500k.txt
 Dateigröße:  2.41 MB
 Heruntergeladen:  466 mal


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2015, 08:18     Titel:
  Antworten mit Zitat      
Hallo,

in diesem Skript http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html solltest du alles notwendige finden, um das Betragsspektrum richtig darzustellen.

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)


Siehe hier: http://www.sengpielaudio.com/Rechner-db.htm
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 09:09     Titel:
  Antworten mit Zitat      
dBm steht für Dezibel mit Bezugsgröße Milliwatt...
Private Nachricht senden Benutzer-Profile anzeigen
 
Maike

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 12:46     Titel:
  Antworten mit Zitat      
@ 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...
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2015, 13:35     Titel:
  Antworten mit Zitat      
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? Wink

Ich habe dir doch den Link zu einem Skript gegeben...nicht nur aus lauter Langeweile Wink. 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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maike

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 15:05     Titel:
  Antworten mit Zitat      
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).

Code:

Bx=linspace(B(1,1),B(end,1),length(B(:,1)))';
By=interp1(B(:,1),B(:,2),Bx)

N_B = length(B(:,1));     % N wird nachher für die Abtastpunkte benötigt

win_b = hann(N_B);
By_win= By.*win_b*N_B/sum(win_b);        % Fensterung mit Amplitudenkorrektur
By_FFT = fft(By_win, N_B);               % transformiere die Funktion
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
By_FFT = abs(By_FFT);
%By_FFT = fftshift(By_FFT/N_B);
By_FFT = By_FFT/(N_B/2);        % Skalierung, für Frequenzanteil für f>0Hz
By_FFT = 10*log10(By_FFT*1000); %logarithmieren

f_B = 1/(Bx(2)-Bx(1));      % Abtastzeitpunkte festlegen
Bx_FFT = f_B/length(B(:,1))*(0:length(B(:,1))-1)';

plot(Bx_FFT, By_FFT)

 



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....
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2015, 16:01     Titel:
  Antworten mit Zitat      
Also für mich ist das Ergebnis korrekt Wink

Code:

clear;
B = importdata('sinus_5v_500k.txt'); % Hier File Adresse eingeben
Bx = linspace(B(1,1),B(end,1),length(B(:,1)))';
By = interp1(B(:,1),B(:,2),Bx);

N_B = length(B(:,1));     % N wird nachher für die Abtastpunkte benötigt

win_b = hann(N_B);
By_win= By.*win_b*N_B/sum(win_b);        % Fensterung mit Amplitudenkorrektur
By_FFT = fft(By_win, N_B);               % transformiere die Funktion
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
By_FFT = abs(By_FFT);
mag = [By_FFT(1)/N_B; By_FFT(2:(N_B/2))/(N_B/2)];        % Skalierung, für Frequenzanteil für f>0Hz
mag_dB = 10*log10(mag+eps); %logarithmieren

f_B = 1/(Bx(2)-Bx(1));      % Abtastzeitpunkte festlegen
df = f_B / N_B;
Bx_FFT = 0:df:f_B/2-df;

subplot(3,1,1)
plot(Bx,By,'b.-')
xlabel('t');
ylabel('y');
grid on;
subplot(3,1,2)
plot(Bx_FFT, mag)
grid on;
xlabel('Frequenz Hz');
ylabel('Amplitude linear');
subplot(3,1,3)
plot(Bx_FFT, mag_dB)
grid on;
xlabel('Frequenz Hz');
ylabel('Amplitude dB');
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maike

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 16:49     Titel:
  Antworten mit Zitat      
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
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2015, 16:55     Titel:
  Antworten mit Zitat      
Was soll daran nicht stimmen? Ich habe sowohl beim Hanning wie auch beim Flattop Fenster rund 6.9dB, was linear 5 entspricht.
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.