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 / Fensterung / Gesamtpegel

 

Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2015, 14:18     Titel: FFT / Fensterung / Gesamtpegel
  Antworten mit Zitat      
Hallo zusammen,

ich mache momentan eine FFT-Analyse von Messdaten. Es handelt sich um ein Rechtecksignal (+-3V und 3kHz)
Die Frequenzanteile sind gut zu sehen, jedoch stimmen die Amplituden nicht überein.. Um diesem Fehler entgegenzuwirken (Leakage meines Wissens) habe ich ein Fenster erstellt und multipliziere dies mit meinem Signal. Und dann transformiere ich das Signal. Die Fragen: Wo liegt mein Fehler? (anbei ein Bild vom Spektrum)

Eine weitere Frage wäre, wie es mir möglich ist einen Gesamtpegel des Spektrums zu errechnen? Ist das einfach der Mittelwert meiner Absolutbeträge (a)?

Vielen Dank im Voraus für die Hilfe! Liebe Grüße

Code:
Fs=50000;
N=length(x);                    
F=(0:N-1)*Fs/N;
whm = window('kr',N,8)';
xf = x.*whm*N/sum(whm);
T=N/Fs;     // 20,5ms
df=1/T;
fmax=Fs/2;
X=fft(xf);
a=abs(X/N);
title("FFT von x","color","blue","fontsize",4);
xlabel("Frequenz [Hz]");
ylabel("Amplitude");
plot(F(1:550),a(1:550));


spektrum.png
 Beschreibung:

Download
 Dateiname:  spektrum.png
 Dateigröße:  12.16 KB
 Heruntergeladen:  661 mal


Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2015, 14:22     Titel:
  Antworten mit Zitat      
Okay die erste Amplitude der Grafik ist hinfällig - hatte ausversehen das Fenster mitgeplottet, diese Frage hat sich also shconmal erübrigt^^
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.02.2015, 17:50     Titel:
  Antworten mit Zitat      
Wer sucht, der findet: http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Da ist alles dabei rund um das Thema Betragspektrum und richtige Skalierung.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2015, 07:56     Titel:
  Antworten mit Zitat      
Ich krieg meine Amplitude trotzdem nicht korrekt dargestellt..

sie sollte bei 3 sein, ist aber bei 3.8

Ich hab die Amplitude mit 2 multipliziert und durch meine Blocklänge N geteilt

Wo liegt mein Fehler? (Bitte um Hilfe)

Code:
Fs=50000;
N=length(x);                        // 2048 FFT-Blocklänge
F=(0:N-1)*Fs/N;                     // Frequenzachse
whm = window('kr',N,8)';            // Hamming-Kaiser-Fenster
xf = x.*whm*N/sum(whm);             // Signal mit Fenster multiplizieren
plot(F,xf);                         // x mit Windowfunktion
T=N/Fs;                             // 40,9ms Erfassungszeit
df=1/T;                             // 24,4Hz Auflösung
fmax=Fs/2;                          // 25kHz Nyquistfrequenz
X=fft(xf);                          // Transformation
a=2*abs(X/N);                         // Betrag aus real/imag. von X
title("FFT von x","color","blue","fontsize",4);
xlabel("Frequenz [Hz]");
ylabel("Amplitude");
clf();
plot(F(1:N),(a(1:N)));
 
Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2015, 11:52     Titel:
  Antworten mit Zitat      
Niemand eine Idee bzgl der falschen Amplitude?

Das oben genannte Dokument ist für MATLab.. es gibt geringfügige Unterschiede.. aber auch damit bekomme ich die Amplitude nicht korrekt normiert.
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.02.2015, 19:12     Titel:
  Antworten mit Zitat      
Ohne dein Signal ist eine Fehleranalyse nicht so leicht.

Folgende Funktion erstellt definitiv das richtig Frequenzspektrum...siehe Bsp.


Code:

clear;
fs = 4096;           % Abtastfrequenz
Ts = 1/fs;
N = 4096; % Anzahl Messwerte
df = fs/N; % Frequenzauflösung
t=0:Ts:(N-1)*Ts;      
% Testsignal mit 3 unterschiedlichen Frequenzen, kein Leakage
f1 = 440; % Hz
f2 = 2*440; %Hz
f3 = 3*440; %Hz
sig1 = 10 + 1*sin(2*pi*f1*t);
sig2 = 2*sin(2*pi*f2*t);
sig3 = 3*sin(2*pi*f3*t);
signal =  sig1 + sig2 + sig3;

%Spektrum berechnen
[Amplitude, Amplitude_dB, fv] = FFT_betragsspektrum( signal, N, fs, 0);

% Darstellung des positiven Betragsspektrums
stem(fv,Amplitude);
xlabel('Frequenz in Hz')
ylabel('Amplitude')
grid on;
 


Hier die Funktion:

Code:
function [mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa, scale)
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% scale: 0 = keine Impulsantwort als Eingang, 1 = Impulsantwort
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2

% un-,gerade Anzahl Messwerte?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum
if scale == 0
    Fy_pos0 = abs(Fy(1:k));

    %   Skalierung  
    mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
else % nicht durch nfft teilen bei Impulsantwort
    mag = abs(Fy(1:k));
end

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
 


Wenn das Signal wirklich eine Amplitude von 3 hat, wird sie im Spektrum auf jeden Fall niedriger und niemals höher sein, da ja neben der eigentlichen Signalfrequenz Nebenmaxima entstehen. Die Energie/Leistung des Signals ist ja die Amplitude, welche bei Leakage im Spektrum auf mehrere Frequenzen verteilt wird. Daher ist die ermittelte Amplitude dann immer geringer.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2015, 08:10     Titel:
  Antworten mit Zitat      
Ich benutze SciLab und kann daher nicht 1:1 die MATLab-Befehle übernehmen.

Ein Plot meines Frequenzspektrums OHNE Fensterung und MIT Fensterung habe ich angehängt.

Bei Anwenden der Fensterfunktion bekomme ich komischerweise eine geringere Amplitude von ca 3,4. Sollte durch das Reduzieren der Nebenfrequenzen (Leakage) die Amplitude nicht eher höher werden?

In SciLab kann ich beispielsweise nicht nfft anhängen.

Code:
% Signal transformieren
Fy = fft(sig,nfft);


Wie normiere ich meine Amplitude korrekt?

OHNE_fensterung.png
 Beschreibung:

Download
 Dateiname:  OHNE_fensterung.png
 Dateigröße:  12.17 KB
 Heruntergeladen:  634 mal
MIT_fensterung.png
 Beschreibung:

Download
 Dateiname:  MIT_fensterung.png
 Dateigröße:  12.59 KB
 Heruntergeladen:  616 mal
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.02.2015, 11:35     Titel:
  Antworten mit Zitat      
Zitat:
Wie normiere ich meine Amplitude korrekt?


So wie es in der oben genannten Funktion ist (zumindest für Matlab). Der Inputparameter nfft ist aber nicht wirklich von Belang, da es keinerlei Auswirkung auf die Skalierung hat. Ist nfft > Anzahl Messwerte des Signals, fügt die Matlab Funktion automatisch Nullen ans Ende des Signals, um auf die Länge nfft zu kommen. Den Vorgang nennt man zero padding. Übergibt man den Parameter nicht mit, kann eben kein zero padding durchgeführt werden. Ist nfft = Anzahl Messwerte des Signals, spielt die zusätzliche Übergabe von nfft ohnehin keine Rolle.

Bei Scilab kann ich dir leider nicht helfen. Wird denn dort auch ein zweiseitiges Spektrum berechnet, also von -Fs/2...0...+Fs/2 ?



Natürlich wird die Amplitude der Signalfrequenz durch die Fensterung höher, denn die Nebenmaxima werden ja gemindert (Gilt nur bei Leakage!!). Aber wenn das Signal eine Amplitude von 3 hat, dann kann weder mit noch ohne Fensterung ein Wert größer 3 im Amplitudenspektrum vorkommen. Erst recht nicht bei Leakage. Es sei denn die Skalierung stimmt nicht. Das war damit gemeint Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Mgx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2015, 14:33     Titel:
  Antworten mit Zitat      
In meinem Fall habe ich einmal von 0 bis fmax/2 geplottet, aber es geht auch mittels fftshift von -fmax/2 bis +fmax/2.

Ich habe nun herausgefunden, dass es anscheinend mit der Fourierreihe der Rechteckschwingung zusammenhängt, dass meine Amplitude einen Wert von ~6,3 hat, da die Grundschwingung mit 4/pi * A berechnet wird.. bei 5V im Zeitbereich komme ich dann im Frequenzbereich auf den Wert.

Jedoch habe ich das gleiche auch mit einer Sinussschwingung probiert, wobei hier die Amplitude die gleiche sein müsste wie im Zeitbereich.. ist sie aber leider nicht.
 
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 - 2024 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.