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

noch eine Frage zur FFT

 

daNnyTigA
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 27.05.15
Wohnort: ---
Version: 2014b/2015a
     Beitrag Verfasst am: 09.09.2015, 20:40     Titel: noch eine Frage zur FFT
  Antworten mit Zitat      
Moin,

ich hab auch nochmal ne Frage zur FFT. Kann man aus dem Amplitudenspektrum etwas ablesen, wenn man eine FFT auf eine Funktion loslässt, wo nach einer bestimmten Zeit eine weitere Frequenz hinzugeschaltet wird? Ich nehme mal als Beispiel die FFT Beispielfunktion aus der Matlab Doku:

http://de.mathworks.com/help/matlab/ref/fft.html

Code:


Fs = 1000;            % Sampling frequency
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
plot(f,P1)
xlabel('f (Hz)')
ylabel('|P1(f)|')
 


Das ist der Code aus dem Beispiel (teilweise gekürzt). Da kann ich schön die Frequenzen und Amplitude ablesen. Was ist aber wenn meine Funktion S jetzt folgende ist:

Code:

S(1:700) = 0.7*sin(2*pi*50*t(1:700));
S(701:1000) = 0.7*sin(2*pi*50*t(701:1000)) + 5*sin(2*pi*120*t(701:1000));
 


Frequenzen kann ich wieder schön ablesen. Aber kann ich aus der Amplitude bei 120 Hz irgendetwas schließen? Ich könnte das ursprüngliche Signal eigentlich aus dem Frequenzspektrum nicht wiederherstellen, oder?

Danke und viele Grüße
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: 09.09.2015, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

so ganz verstehe ich glaube ich deine Fragen noch nicht. Aber evtl. hilft dir das weiter. Wenn ein Zeitsignal eine Amplitude von 10 bei 120Hz hat, muss im Spektrum auch ebenfalls eine diskrete Frequenzlinie bei 120Hz mit einer Amplitude von 10 auftauchen. Ansonsten stimmt wohl etwas mit der Berechnung des Spektrums nicht. Die Umkehrfunktion vom Frequenz- in den Zeitbereich nennt sich inverse FFT

Code:


Das Matlab Bsp. in der Doku ist übrigens nicht korrekt in Bezug auf die richtige Amplitude. Keine Ahnung warum dieser Code nach so vielen Jahren immer noch falsch aufgeführt wird. So wäre es richtig:

Code:

function [mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa, window, scale)
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% window: 1 =  Fensterung mit Hanning window
% 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(:);

% Fensterung
if window == 1
    win = hann(nfft); % Hanning Fensterfunktion
    sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur
    sig = sig_win;
end

% 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)
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
daNnyTigA
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 27.05.15
Wohnort: ---
Version: 2014b/2015a
     Beitrag Verfasst am: 09.09.2015, 22:15     Titel:
  Antworten mit Zitat      
Danke schonmal für die Antwort. Naja ich hab jetzt ein Signal mit Amplitude 10 bei 120 Hz wie in deinem Beispiel. Nach einer gewissen Zeit ändert sich mein Signal und eine Störfunktion mit Amplitude 2 bei 40 Hz kommt zusätzlich zu dem ursprünglichen Signal (mit Amplitude 10 und 120 Hz) hinzu. Wenn ich jetzt die FFT drauf loslasse (auf das ganze Signal), bekomme ich Peaks bei 120Hz und 40Hz. Der Peak bei 120 Hz ist 10, aber bei 40 Hz eben nicht 2, weil das Störsignal nicht von Anfang an da war, sondern erst später dazu gekommen ist. Die Höhe des Peaks sagt mir doch dann eigentlich rein gar nix aus, oder?

Danke für den Code, hab ich mir schon reingezogen und denke ich auch alles soweit inklusive Fensterung und Normierung etc. verstanden.
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: 10.09.2015, 10:01     Titel:
  Antworten mit Zitat      
Der Effekt nennt sich Leakage oder Leck Effekt. Dieser tritt dann auf, wenn das Signal nicht mit einer ganzen Anzahl von Perioden in das Messfenster passt. Siehe am Ende deines Testsignals S. Der Effekt zeigt sich nicht nur in einer verminderten Amplitude, sondern auch in kleineren Nebenmaxima rechts und links der eigentlichen Spektrallinie. Bei realen Signalen mit vielen Frequenzen ist es unmöglich das Messfenster so zu legen, dass immer nur volle Perioden enthalten sind. Dafür wurden die Fenster Funktion wie Hanning etc. eingeführt. Mit ihnen lässt sich der Effekt vermindert. Die meisten Fenster zielen darauf ab die Nebenmaxima zu minimieren, so dass die eigentliche Signalfreq. hervorkommt. Das Flattop window hingegen verwendet man, wenn einem Amplitudengenauigkeit wichtig ist. Es hängt also davon ab was mich an meinen Daten interessiert, Amplitude oder Frequenz. Oder man nutzt eben beide Fenster.

Das Frequenzspektrum besitzt ja eine Auflösung df = Fs/Anzahl Messwerte. Zu jeder diskreten Frequenz N*df (N = 0,1,2...) ermittelt die FFT den vorhandenen Signalanteil. Ist das Signal nun kein ganzes Vielfaches von df, kann der Signalanteil nicht genau bestimmt werden, was im Spektrum zu einer verminderten Amplitude und den Nebenmaxima führt. Der Fehler ist dann am Größten, wenn die Signalfrequenz genau in der Mitte der Schrittweite df liegt.
Private Nachricht senden Benutzer-Profile anzeigen
 
daNnyTigA
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 27.05.15
Wohnort: ---
Version: 2014b/2015a
     Beitrag Verfasst am: 10.09.2015, 16:35     Titel:
  Antworten mit Zitat      
ja dann habe ich es verstanden, dankeschön
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.