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-Probleme: Es kommen falsche Werte raus

 

_Stefan_

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2008, 10:32     Titel: FFT-Probleme: Es kommen falsche Werte raus
  Antworten mit Zitat      
Hallo,

um sicher zu sein, dass ich die fft-Funktion richtig anwende, will ich eine einfache Kosinusfunktion analysieren. Ich bekomme jedoch für die Amplituden falsche Werte heraus.
Weiterhin weiß ich nicht wie ich den Frequenzvektor bilden soll.
Ich habe hier schon einige Threads zur FFT gelesen, aber zur Bildung des Frequenzvektors werden häufig nur Zahlenwerte benutzt und ich weiß nicht, woher diese Zahlen genau kommen.

Meine code ist unten angehängt.
Wäre jemand so nett, ihn zu verfollständigen / zu korrigieren und mir vor allem zu Erklären warum es so gemacht werden muss?

Ich hatte früher schonmal mit der fft-Fkt gearbeitet und mir die Bildung des Frequenzvektors aus dem Internet besorgt. Allerdings lag ich immer etwas neben der gesuchten Frequenz. Kann ich nicht erwarten, dass die Frequenz genau getroffen wird?


Code:

dt = 0.0001; % Sampletime
t  = 0:dt:1; % Zeitvektor
A  = 3;      % Amplitude des Testsignals
f  = 5;      % Frequenz des Testsignals
sign = A*cos(2*pi*f*t); % cos-Signal
n  = length(t);  % Samples

fft_sign = fft(sign,n)/n;
betrag = abs(fft_sign);
phase = angle(fft_sign);
frequ = ???; % Frequenzvektor

stem(frequ,betrag);
 


Viele Grüße,
Stefan.


mr_endres
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 78
Anmeldedatum: 11.06.08
Wohnort: Unterfranken
Version: ---
     Beitrag Verfasst am: 27.09.2008, 12:05     Titel:
  Antworten mit Zitat      
Hallo,

ich würde deinen Code so ergänzen :

Code:

dt = 0.001; % Sampletime
t  = 0:dt:1; % Zeitvektor
A  = 3;      % Amplitude des Testsignals
f  = 5;      % Frequenz des Testsignals
sign = A*cos(2*pi*f*t); % cos-Signal
n  = length(t);  % Samples

betrag =abs(fft(sign,n));
betrag=fftshift(betrag);
frequ = (-n/2:n/2-1)/n;
plot(frequ,betrag);
xlabel('frequenz/f')
axis([-.03 .03 0 1500]);
 


Dabei benötigst du fftshift um das Spektrum symmetrisch um Null betrachten zu können.
Dementsprechend musst du auch deinen Frequenzvektor symmetrisch angegeben.

Im Plot siehst du nun das Frequenzspektrum (in Einheiten der Samplingfrequenz!).

Mit dem Befehl :
Code:

frequ(find(betrag==max(betrag)));
 

siehst du, dass sich die Peaks im Spektrum bei
f=-0.0055*f_s und f=0.0045*f_s
also bei ca. (+-)5Hz befinden.

Du wählst zwar die Samplingfrequenz sehr hoch, doch wenn du mehr Perioden des Eingangssignals (also größeres t wählst) dann kommst du auch genauere Werte im Frequenzspektrum (Stichwort sinc-Funktion und Faltung).

mfg Johannes
Private Nachricht senden Benutzer-Profile anzeigen
 
_Stefan_

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2008, 23:17     Titel:
  Antworten mit Zitat      
Hallo Johannes,

danke für deine Antwort.
Wenn ich deinen code in Matlab starte, dann bekomme ich aber immer noch nicht ganz die gewünschten Werte angezeigt.
Wenn ich die Frequenz gemäß deiner Angabe noch mit 1/dt multipliziere bekomme ich also offenbar die tatsächliche Frequenz in Hz (siehe angehängtes Bild).
Leider liegt der Peak noch recht weit von 5 Hz entfernt, immerhin bei 4,496Hz.
Ist diese Ungenauigkeit normal? Ich habe doch sogar fünf Perioden im Zeitsignal und die Abtastrate ist auch sehr hoch.

Vor allem stimmt aber die Amplitude in deinem Diagramm noch nicht.
Was soll denn die Amplitude von 1502 bedeuten?
Die Amplitude der cos-Funktion war doch 3.

Viele Grüße
Stefan[/code]

plot.jpg
 Beschreibung:

Download
 Dateiname:  plot.jpg
 Dateigröße:  30.82 KB
 Heruntergeladen:  770 mal
 
mr_endres
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 78
Anmeldedatum: 11.06.08
Wohnort: Unterfranken
Version: ---
     Beitrag Verfasst am: 29.09.2008, 18:31     Titel:
  Antworten mit Zitat      
Zunächst mal zur Abtastfrequenz f_s. Für eine verlustfreie Abtastung muss gelten : f_s=2*f_max, wobei f_max die größte vorkommende Frequenzkomponente in deinem Signal ist (das ist das Nyquist Kriterium, s. z.B. Wikipedia ...). Damit wäre für deine 5Hz also dt=0.1s schon ausreichend.

Wenn du jetzt t=1s setzt so schneidst du den Cosinus quasi nach 1s ab, d.h. du multiplizierst ihn mit einer Rechteckfunktion (Stufenfunktion). Nun wird aber aus der Fouriertransformierten des Produktes zweier Funktionen im reziproken Raum eine Faltung der Fouriertransformierten (die Cosinus Funktion wird zu zwei Delta Peaks; die Stufenfunktion zu einer sinc Fkt, und damit die Faltung der beiden zu zwei Sinc Fkt. an den Stellen der Delta Peaks ). Im Idealfall möchtest du die Delta Peaks bei +-5Hz sehen. Je breiter nun du die Stufenfkt. (also je größer t wird) machst desto schmaler wird die sinc Fkt. und desto besser nähert sich deren Max. an +- 5Hz an.

Wenn du z.B. folgendes ausführtst :

Code:

clear all;
dt = 0.1; % Sampletime
t  = 0:dt:20; % Zeitvektor
A  = 3;      % Amplitude des Testsignals
f  = 5;      % Frequenz des Testsignals
sign = A*cos(2*pi*f*t); % cos-Signal
n  = length(t);  % Samples

betrag =abs(fft(sign,n));
betrag=fftshift(betrag);
frequ = (-n/2:n/2-1)/n;
plot(frequ,betrag);
xlabel('frequenz/f')
axis([-.03 .03 0 1500]);
frequ(find(betrag==max(betrag)))
 


So bekommst du schon -.500Hz und 0.4950Hz.

Faszit: Das entscheidende ist bei richtiger Abtastfrequnz die Dauer der Abstastung.


Zur Amplitude: Du trägst hier das Frequenzspektrum nicht die Amplitude auf ! Wenn du die y-Achse normierst so bekommst du den raltiven Anteil der Frequenzen im Spektrum. Die Delta Peaks die die Fouriertrafo bei cosinus liefer sollte ja z.B. unendlich hoch sein.

mfg Johannes
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.