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 aus eingelesenen Datenpunkten

 

felifa
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 14.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2017, 14:20     Titel: FFT aus eingelesenen Datenpunkten
  Antworten mit Zitat      
Hallo liebe Forumsbenutzer,

ich versuche gerade aus Datenpunkten eine FFT zu machen, um das Rauschen während der Aufnahme zu analysieren. Ich habe auch schon einige Ansätze, aber aus denen werde ich nicht schlau. Die Daten wurden schon in Matlab eingelesen.
Code:
Das wäre mein code soweit, für die FFT den ich gefunden hätte:

    Fs = 50; %Sampling Frequency
    T = 1/Fs;
    L = 50; %Signal length
    Y = fft(voltage);
    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)


 


Ich möchte die FFT von erfassten Daten 1 Sekunde machen, mit einer 50hz Aufnahmefrequenz. Meines Erachtens nach, wird die FFT hier nur für die Hälfte der Zeit gemacht. Kann sein dass es stimmt, aber warum wird das so gemacht? Brauche ich nicht das ganze Signal? Könnte mir da jemand bitte helfen?
Private Nachricht senden Benutzer-Profile anzeigen


Lukass

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2017, 15:03     Titel:
  Antworten mit Zitat      
Hallo,

ob du die FFT über die gesamte Zeit machst kann ich dir nicht sagen, weil da der entsprechende Code fehlt, der zeigt, wo "voltage" herkommt.

Anders gesagt: Wenn "voltage" ein Signal über eine Sekunde ist, wird bei deinem Code die FFT auch über die komplette Sekunde gemacht.

Dich verwirrt möglicherweise diese Zeile hier:
Code:
P1 = P2(1:L/2+1);

Die FFT erzeugt ein symmetrisches Spektrum, also eines für negative und für positive Frequenzen. Bei dieser Zeile wird das negative "weggeschnitten", da man meistens nur eine Hälfte vom Spektrum betrachten will, weil es für praktische Anwendungen völlig aussreicht.

Gruß Lukas
 
felifa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 14.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2017, 15:39     Titel:
  Antworten mit Zitat      
Danke für die Antwort Very Happy

Das ist der gesamte Code, die Daten werden aus Excel eingelesen. Die FFT sollte über die ganze Zeit laufen. Es wurde nur 1 Sekunde gemessen, also hat man 50 Werte.

Code:

  Daten=xlsread('datei');
  voltage=Daten(:,1);
  time= 0.02*reshape(1:numek(S1),size(S1)); %um die Zeit Werte im 0.02 Intervall    zu bekommen

    Fs = 50; %Sampling Frequency
    T = 1/Fs;
    L = 50; %Signal length
    Y = fft(voltage);
    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)



Mich irritiert aber leider noch warum P2=abs(Y/L) ist?? Warum wird das gemacht? Das selbe gilt für
P1(2:end-1) = 2*P1(2:end-1);
und
f = Fs*(0: (L/2))/L;

Könntest du mir erklären was hier geschieht? Ich erkenne da einfach nicht wofür das gemacht wird und ich finde keine Erklärung dafür... Du würdest mir damit sehr helfen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Lukass

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2017, 19:03     Titel:
  Antworten mit Zitat      
Hallo,

das sind alles Berechnungsschritte um auf die gewünschte Darstellungsform der FFT zu kommen. Um das alles zu verstehen solltest du dich in Signalabtastung und Signalverarbeitung/Fourier-Transformation einlesen.
Ich versuche mal die Zeilen so gut wie möglich zu erklären.
Die Codezeile
Code:

macht folgendes:
Das Ergebnis der FFT (in deinem Fall Y) ist ein Vektor mit Real- und Imaginärteil. Daraus kann man z.B. den Betrag und die Phase ermitteln. Um das Betrags bzw. Amplitudenspektrum zu berechnen wird der Befehl "abs" verwendet.
Aufgrund des in Matlab implenentieren FFT-Algorithmus sollte das Ergebnis dann noch durch die Division auf die Signallänge (L) normiert werden.

Bei jeder Frequenz deines Ausgangssignals(Zeitsignals) verteilt sich die entsprechende Amplitude jeweils zur Hälfte auf das negative und positive Spektrum. Das liegt eben an der Fouriertransformation, die ein symmetrisches Spektrum erzeugt. Da man ja nur einen Teil des Spektrums anschaut, mittels
Code:
P1 = P2(1:L/2+1);
, multipliziert man noch mit dem Faktor zwei, um die korrekte Amplitude des Signals zu erhalten. Da sich die beiden Spektren (positiv und negativ) bei der Frequenz 0 Hz "treffen", also der erste Eintrag von P1, d.h. P1(1), muss dort nicht mit 2 multipliziert werden. Dies wird alles durch die Zeile
Code:
P1(2:end-1) = 2*P1(2:end-1);

erreicht.
Die letzte Zeile
Code:

f = Fs*(0: (L/2))/L;
 

erzeugt dann nur noch den Frequenzvektor, da man Spektren ja auf die Frequenz und nicht auf die Zeit bezieht.
Der Frequenzvektor geht dann gleichmäßig von 0Hz bis zur halben Abtastfrequenz (Fs/2), weil höhere Frequenzen aufgrund des Nyquist-Shannon-Abtasttheorems nicht darstellbar sind. Den Frequenzvektor kannst du z.B. auch so erstellen
Code:

f = linspace(0,Fs/2,L);
 


Ich hoffe, dass ich dir helfen konnte.

Gruß Lukas
 
felifa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 14.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.03.2017, 10:23     Titel:
  Antworten mit Zitat      
Hallo Lukas,

vielen lieben Dank für diese ausführliche Erklärung Very Happy Very Happy Very Happy

Die letzte Frage die ich mir dennoch noch stelle ist, wenn ich es jetzt plotte, bekomme ich einen Graphen dessen x Achse nur bis 5 Hz reicht. Sollte der Graph nicht bis 10 Hz reichen? Denn so bekomme ich ja nur ein Frequenzspektrum der halben Frequenz... oder liegt das daran, wie du erklärt hat, dass nur das halbe Signal genommen wird, da der andere Teil des Spektrums im negativen Bereich läge?
Ich bitte Dich um eine letzte Hilfestellung Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Lukass

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.03.2017, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

kein Problem Smile

Genau so ist es. Die Frequenzen, die du darstellen lassen kannst gehen von -Fs/2 bis +Fs/2. Da man den negativen Teil nicht betrachtet geht es also von 0Hz bis Fs/2. Laut deinen oberen Code ist Fs = 50, also müsste die Frequenzachse von 0 bis 25Hz gehen.

Gruß
Lukas
 
felifa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 14.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2017, 11:00     Titel:
  Antworten mit Zitat      
Hallo Lukas ,

Dann wären nun alle meine Fragen zu diesem Thema geklärt Very Happy Vielen Dank!! :DDD
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: 22.03.2017, 18:48     Titel:
  Antworten mit Zitat      
Hallo,

ich kann nur immer wieder auf folgendes Skript verweisen, da oft die Skalierung der Amplitude nicht korrekt durchgeführt wird:

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


Siehe u.a.
Code:
% 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!


Gruß DSP
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.