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 Verständnisfrage

 

hatebreed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2012, 09:46     Titel: FFT Verständnisfrage
  Antworten mit Zitat      
Hallo, ich habe eine Frage zur FFT.

Ich habe eine Menge an Messdaten. Radius und Zeit. Ich möchte die Frequenz der Schwingung bestimmen, mit welcher der Radius schwingt. Dazu habe ich ein Skript zur FFT gefunden, welches ich aber nicht verstehe, da ich noch Matlab Neuling bin und durch FFT nicht so wirklich durchblicke. Der Radius besteht aus ca. 250 Messwerten.

Code:


R=Daten(:,5);

Fs = 1000;                      % Sampling frequency
T = 1/Fs;                     % Sample time
L = length(R);                   % Length of signal
t = (0:L-1)*T;                % Time vector

y = R;

[color=red]NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
g = 2*abs(Y(1:NFFT/2+1));[/color]
% Plot single-sided amplitude spectrum.
plot(f,log(g))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

end

 


Mir ist nicht ganz klar, was der rot markierte Bereich genau macht und ob das so stimmt. Wäre nett wenn mir jemand helfen könnte.


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.07.2012, 10:07     Titel:
  Antworten mit Zitat      
Hier geht es um die richtige Skalierung der Magnitude. Schau dir dazu bitte folgendes Skript an.

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

Deine Skalierung von g ist nicht ganz korrekt. Die Funktion fft berechnet ein beidseitiges Spektrum -fs/2...0...+fs/2 [Hz]. Daher sind die Amplituden durch 2 geteilt. Stellt man nun nur den positiven Freq.-bereich dar, muss man anders skalieren. Daher wird mit 2 multipl.

Allerdings darf Y(1) = Gleichsignalanteil und Y(NFFT/2 + 1) = Ampl. bei der Nyquistfreq. nicht verdoppelt werden, da sie in Y nur einmal vorkommen, nicht so wie die anderen Werte. Dies wird ebenfalls im Skript gezeigt.
Private Nachricht senden Benutzer-Profile anzeigen
 
hatebreed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2012, 11:22     Titel:
  Antworten mit Zitat      
Danke für deine Antwort... aber sie bringt mich leider auch nicht so wirklich weiter Sad.

Wie müsste ich den Code denn ändern, damit er richtig ist?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.07.2012, 12:47     Titel:
  Antworten mit Zitat      
Deshalb der Link zu dem Skript...dort ist doch alles erklärt Wink

Code:

Fs = ....; % Abtastfrequenz
fn = Fs/2; % Nyquistfrequenz
NFFT = ...; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = Fs/N; % Frequenzauflösung

% Frequenzbereich
% ----------------------------------

% Berechnung der FFT
% ------------------
H = fft(y, NFFT); % Fouriertransformation durchführen
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H); % Betrag bilden

% Graphische Darstellung
% ----------------------
% Frequenzvektoren (werden bei der graphischen Darstellung benötigt):
x_fn = 0 : df : fn;
% entspricht der Zeile f = Fs/2*linspace(0,1,NFFT/2+1); in deinem Code

% !!! richtige Skalierung für den positiven Freq.-bereich von amplH
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2) amplH((N/2)+1)/N]; % DC-Bin und Nyquistfreq. auf N normieren!

% Plot Ausgabe der Magnitude in dB

plot(x_fn, 20*log10(amplitudengang + eps)) % eps = kleine Konstante um log(0) zu vermeiden
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)| in dB')


 
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 09:09     Titel:
  Antworten mit Zitat      
hi, das ist immer sone sache mit den skripten. jeder hat doch iwie was leicht anderes vor sich. bei mir kommt zB das hier wenn ich versuche so zu skalieren wie da vorgeschlagen..

Error using horzcat CAT arguments dimensions are not consistent.
Error in alles (line 64)
amplitudengang = [amplH(1)/L amplH(2:L/2)/(L/2) amplH((L/2)+1)/L];

ich arbeite ja grad an ner ähnlichen problematik und mein arbeitsstand ist erstma folgender. allerdings keine ahnung ob das richtig ist, es sieht erstmal nicht falsch aus Wink

Code:

Y = fft(Mi(:,2),poti)/L;                    % FFT

frequArea = fa/2*linspace(0,1,poti/2); % Skalierung des Ergebnisses
fig=figure(1);
plot(frequArea,2*abs(Y(1:poti/2)))     % Plot in Skalierung
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
 


-Mi(:,2) wäre dein messwertvektor
-poti ist nfft bei den meisten hier
-L ist Länge des signals

gruß chrisl
Private Nachricht senden Benutzer-Profile anzeigen
 
hatebreed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 09:10     Titel:
  Antworten mit Zitat      
ich habe versucht den Code anzuwenden, bekomme aber immer eine Fehlermeldung ausgeworfen.

??? Error using ==> horzcat
CAT arguments dimensions are not
consistent.

Error in ==> Frequenzanalyse at 39
amplitudengang = [amplH(1)/N
amplH(2:N/2)/(N/2) amplH((N/2)+1)/N]; %
DC-Bin und Nyquistfreq. auf N normieren!


woran liegt das? amphH ist ein 1024 x 1 Vektor, N=1024.

Wenn ich das Beispiel ausführe, gibt es keine Fehlermeldung.
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 11.07.2012, 09:28     Titel:
  Antworten mit Zitat      
Probier bitte folgendes Bsp...genau das Gleich macht auch das Skript aus dem Link:

Code:

Fs = 1024; % Abtastfrequenz
fn = Fs/2; % Nyquistfrequenz
N = 1024; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = Fs/N; % Frequenzauflösung

Ts = 1/Fs;
t = 0:Ts:(N-1)*Ts;
% Testsignal
f = 10*df;
y = 10 + sin(2*pi*f*t);


% Frequenzbereich
% ----------------------------------

% Berechnung der FFT
% ------------------
H = fft(y, N); % Fouriertransformation durchführen
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H); % Betrag bilden

% Graphische Darstellung
% ----------------------
% Frequenzvektoren (werden bei der graphischen Darstellung benötigt):
x_fn = 0 : df : fn;
% entspricht der Zeile f = Fs/2*linspace(0,1,NFFT/2+1); in deinem Code

% !!! richtige Skalierung für den positiven Freq.-bereich von amplH
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2) amplH((N/2)+1)/N]; % DC-Bin und Nyquistfreq. auf N normieren!

% Plot Ausgabe der Magnitude Linear

plot(x_fn, amplitudengang) % eps = kleine Konstante um log(0) zu vermeiden
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)| in dB')
grid on;
 


Wenn du nun die Skalierung aus deinem Code verwendest, kommt nämlich nicht der richtige Gleichsignalanteil von 10 (siehe y) heraus.

Edit: Sollte y kein Zeilen- sondern Spaltenvektor sein, musst du hier Semikolon verwenden:
Code:
amplitudengang = [amplH(1)/N; amplH(2:N/2)/(N/2); amplH((N/2)+1)/N];


Ist poti und L bei dir gleich? Wenn nicht, ist die Skalierung der Amplitude nicht nur beim Gleichsignalanteil und bei der Nyquistfreq. falsch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 10:06     Titel:
  Antworten mit Zitat      
Super, hat am Spaltenvektor gelegen.
Besten Dank
 
Chrislap
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 10:38     Titel:
  Antworten mit Zitat      
ja stimmt - das lag an dem zeilenvektor mit der fehlermeldung..
allerdings bekomme ich bei eurer version amplituden im stark negativen bereich - sieht auch mit den frequenzen leicht anders aus (was nicht heißt, dass es nu falsch ist)..
und nein wenn du mich meinst, ist poti und L nicht gleichlang. jedenfalls nicht bevor mit nullen aufgefüllt wurde. meine frequenzen schienen auch leicht verschoben (zu den niedrigen frequenzen - könnte echt im verhältnis von L zu poti sein) - ich hatte das hier am anfang schonmal gefragt, ob ich das richtig gemacht habe - ich habe das verhältnis poti/L schon versucht selber irgendwo anzubringen, kam bisher aber auf keinen grünen zweig. wäre nett wenn du sagen würdest, was du genau meinst - was da der fehler ist - wo habe ich etwas übersehen? ich kann schlecht konstanten anbringen ohne zu wissen was ich da machen^^ wäre super wenn du in meinem thema bei signalverarbeitung mal reinguckst und mir sagst was du meintest Smile
danke, lg chrisl
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.07.2012, 10:49     Titel:
  Antworten mit Zitat      
Fehler: Du musst durch die Anzahl Messwerte teilen, die auch der Länge von Mi entsprechen. Ist nun poti > length(Mi) wird ja hier automatisch Nullen ans Ende von Mi angehängt, um auf die Länge von poti zu erweitern. Dann darf hier nicht durch L sondern es muss durch poti geteilt werden. Ich empfehle dir aber den Weg der Skalierung aus dem Skript zu verwenden, oder wie ich ihn hier in dem kleinen Bsp. gezeigt habe. Was dann für ein Signal für die fft verwendet wird, ist ja egal.

Code:

Y = fft(Mi(:,2),poti)/L;                    % FFT
 


Diese Skaleriung ist falsch. Der Gleichsignalanteil etc. ist dann nicht richtig. Siehe Bsp. oben!!
Code:

plot(frequArea,2*abs(Y(1:poti/2)))     % Plot in Skalierung
 
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.07.2012, 11:10     Titel:
  Antworten mit Zitat      
Chrislap hat Folgendes geschrieben:

allerdings bekomme ich bei eurer version amplituden im stark negativen bereich -


Welche Version für den Plot hast du denn verwendet?...ich habe einmal die Darstellung in dB und einmal linear (einfacher nachvollziehbar) angegeben. Sorry für den Wechsel...ich wollte keine Verwirrung stiften.

Code:

% Plot Ausgabe der Magnitude Linear

plot(x_fn, amplitudengang) % eps = kleine Konstante um log(0) zu vermeiden
 



Hier kommen nun bei dem Testsignal y für den Gleichsignalanteil 20 dB = 10 linear und 0 dB = 1 linear bei der Frequenz f heraus. Alle´anderen Frequenzen haben eine negative Amplitude. Dies entspricht quasi der Null in der linearen Darstellung. -100 dB sind z.B. 0.00001
Code:

% Plot Ausgabe der Magnitude in dB

plot(x_fn, 20*log10(amplitudengang + eps)) % eps = kleine Konstante um log(0) zu vermeiden
 


Zuletzt bearbeitet von DSP am 11.07.2012, 11:11, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 11:11     Titel:
  Antworten mit Zitat      
danke, also da hakt es also. leider ändert sich aber rein gar nix, wenn ich durch poti, statt L teile bei der fft - kann ich mir auch nicht erklären - im workspace sehe ich doch die dimensionen - L ist 6800 lang also deutlich kürzer..

ich versuche es auch immer mit euren varianten die ich so finde. allerdings, wie schon gesagt, sieht das denn ziemlich merkwürdig verzerrt aus und befindet sich in nem bereich von -160 bei der amplitude^^
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.07.2012, 11:57     Titel:
  Antworten mit Zitat      
Hast du meinen vorherigen Post zur Darstellung linear/log. angesehen? Dort ist erklärt warum -160 vorkommen.
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 - 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.