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

Fourier Analyse für Zeitreihe

 

Max1896
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2019, 22:09     Titel: Fourier Analyse für Zeitreihe
  Antworten mit Zitat      
Guten Tag,

ich habe eine Zeitreihe mit Geschwindigkeitsmesswerten. In einem Modellversuch zu meiner Abschlussarbeit wurden diese gemessen mit einem ADV bei einer Frequenz von 25 Hz. Ich soll nun laut meinem Prüfer eine Fourier Analyse durchführen, um eine Sinuskurve heruaszubekommen, sodass a) das Rauschen rausfällt und ich b) die verschiedenen Kurven vergleichen kann.

Leider fehlt mir als Matlab Neuling total der Ansatz, wie ich das umsetzten kann. Ich suche schon seit einigen Stunden auf google nach einem Ansatz aber bekomme es selbst nicht hin. Habe mich bisher nur an dem fft codewort versucht und kann mit dem ergebnis leider nichts anfangen. Der Plot dieses Vektors zeigt mir nichts plausibles.

Ich hoffe hier einen Ansatz zu bekommen, würde mich sehr freuen.

VG,
Max
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2019, 22:28     Titel:
  Antworten mit Zitat      
Hallo,

der Befehl fft ist der richtige Anfang. Schau dir dann mal die Beispiele in der Doku dazu an.
Ansonsten bitte die Fragen möglichst konkret formulieren: wir kennen weder deine Daten noch wissen wir, welche Ergebnisse du bekommst und warum du diese nicht für plausibel hältst. Dann ist es auch schwierig, dich zu unterstützen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2019, 23:13     Titel:
  Antworten mit Zitat      
Nabend Harald,

ja da hast du Recht, ich war wohl etwas vorschnell.

Ich habe die beiden Vektoren als Matlab-Datei angehängt, mit der Zeit als t und vx als Geschwindigkeit.

Ich habe
Code:
berechnet und mir das ergebnis plotten lassen plot(t,g). Den Plot habe ich auch angehängt.

Ich sehe zwei Spitzen bei t=1,88 und t=163,3 aber da komme ich bereits nicht weiter.

Edit: der Plot macht auch wenig Sinn ich denke
Code:
schon eher. Dort habe ich zwei Pekas von jeweils y=172,3 bei x1=48 und x2=4084 (Vektorlänge 4130).

Bei dem Beispiel in der Doku ist mir nicht ganz klar, wie ich das Signal formen kann, ohne die Amplitude zu kennen. Die Frequenz wäre in meinem Fall 25, richtig ?
Code:

"Form a signal containing a 50 Hz sinusoid of amplitude 0.7 and a 120 Hz sinusoid of amplitude 1.

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);"


Viele Grüße

plot_abs(g).fig
 Beschreibung:

Download
 Dateiname:  plot_abs(g).fig
 Dateigröße:  93.3 KB
 Heruntergeladen:  388 mal
plot_fft(vx).fig
 Beschreibung:

Download
 Dateiname:  plot_fft(vx).fig
 Dateigröße:  103.19 KB
 Heruntergeladen:  405 mal
t_vx.mat
 Beschreibung:

Download
 Dateiname:  t_vx.mat
 Dateigröße:  25.61 KB
 Heruntergeladen:  392 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 00:18     Titel:
  Antworten mit Zitat      
Hallo,

S ist nur ein Beispielsignal. Statt S bzw. dem gestörten Signal X solltest du dein tatsächliches Signal verwenden.
Am Plot kannst du mehr ablesen, wenn du auf der x-Achse die Frequenz aufträgst. Wie das geht, siehst du in dem Beispiel.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2019, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

leider verstehe ich nicht was mein Signal ist. Ich habe den Plot aber weiss nicht was ich daraus ablesen kann bzw. wie ich die Signalfunktion aufstelle.

Wenn ich das richtig sehe brauche ich zwei Frequenzen und zwei Amplituden.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 17:50     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
leider verstehe ich nicht was mein Signal ist.

Na, deine Daten. Du hast die Variable vx genannt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2019, 18:16     Titel:
  Antworten mit Zitat      
okay aber wie kann ich vx als Signal verwenden? Ich habe die Schritte aus der Docu in ein Skript geschrieben. Laut der Docu soll das Signal abhängig von Amplitude und Frequenz sein. Ich habe lediglich einen Spaltenvektor vx mit 4130 Einträgen.

Wenn ich das richtig verstanden habe kann ein Skript nicht auf eine Variable im Workspace zugreifen.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 19:17     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Laut der Docu soll das Signal abhängig von Amplitude und Frequenz sein.

Wie gesagt: in der Doku wird so ein Beispielsignal generiert.

Was passiert denn, wenn du deine Daten wie in der Doku verarbeitest und die angepasste fft gegen die Frequenz plottest?

Zitat:
Wenn ich das richtig verstanden habe kann ein Skript nicht auf eine Variable im Workspace zugreifen.

Sofern es der Base Workspace ist, geht das sehr wohl.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2019, 19:38     Titel:
  Antworten mit Zitat      
Das mit der Variable hat doch funktioniert. Hatte zuvor versucht auf die 4. Spalte meiner .dat Datei zuzugreifen mit
Code:
. Das hat leider nicht funktioniert. Nun gut es funktioniert mit der Variablen aus dem Workspace wenn ich sage S=vx. Danke dafür schonmal.

X habe ich nun wie im Beispiel belassen
Code:
X = S + 2*randn(size(t));
Nun sieht der letzte Plot S(t) eher aus wie X(t) aussehen sollte, also mit Ströfrequenzen. Normalerweise sollte ich da einzelne Peaks haben (2 Stück?).



Und ich bin nicht sicher, ob ich das X überhaupt noch brauche, da ich ja keine Störfrequenz erzeugen muss, sondern diese schon in vx drin ist. Kann ich x rausnehmen ohne das Skript durcheinander zu bringen?

Wenn ich z.B.
Code:
schreibe, sehen logischerweise S(t) und X(t) gleich aus und S(t) immer noch nicht auf zwei Peaks reduziert Confused .

Code:
Fs = 25;            % Sampling frequency                    
T = 1/Fs;             % Sampling period      
L = 4130;             % Length of signal
t = (0:L-1)*T;        % Time vector


S=vx;
X = S + 2*randn(size(t));;

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

Y = fft(X);

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)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')


Zuletzt bearbeitet von Max1896 am 22.02.2019, 20:14, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 20:01     Titel:
  Antworten mit Zitat      
Hallo,
Zitat:

Kann ich x rausnehmen ohne das Skript durcheinander zu bringen indem ich
Code:
schreibe ?

Das kannst du nicht nur, das solltest du. Wie mehrfach gesagt sind S bzw. X Beispielsignale.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2019, 21:56     Titel:
  Antworten mit Zitat      
Hallo,

leider ist nun immer noch nicht das Rauschen für mein Signal für vx rausgefiltert worden.

Die Kurven für X(t) und S(t) sind noch gleich. Also das Frequenzspektrum ist ungefiltert und hilft mir so leider nicht weiter.

Ich zweifle gerade daran ob ich überhaupt etwas verstanden habe Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 22:23     Titel:
  Antworten mit Zitat      
Hallo,

den Teil mit X kannst du doch weglassen. Warum würdest du über deine Daten ein Rauschen legen wollen?!

Was soll gefiltert werden und wie?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Max1896
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 11.01.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2019, 23:06     Titel:
  Antworten mit Zitat      
Nabend,

also wenn ich X einfach weglasse, dann passt ja das Skript nicht mehr zusammen. Das kriege ich so auch nicht umgeschrieben weil ich nicht ganz nachvollziehen kann was dort gerechnet wird. Deshalb steht bei mir immer noch X=S;

Ich bin davon ausgegangen, dass das Skript mir die Frequenzen meines Signals herausfiltern kann, die mein Signal später als schöne Sinuskurve im Zeitbereich beschreiben können.

Dazu möchte ich dann die inverse Transformation benutzen. Dies klappt auch am Ende meines Skriptes, jedoch werden die Störfrequenzen nicht herausgefiltert und das Signal ist am Ende wieder das Ausgangssignal.

Code:
Fs = 25;            % Sampling frequency                    
T = 1/Fs;             % Sampling period      
L = 4721;             % Length of signal
t = (0:L-1)*T;        % Time vector


S=vx;
% X = S;

figure(1);

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

Y = fft(X);

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

figure(2);

f = Fs*(0:(L/2))/L;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

figure(3);

plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

V=ifft(Y);

figure(4);
plot(tv,V)


Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2019, 23:34     Titel:
  Antworten mit Zitat      
Hallo,

warum wendest du fft denn überhaupt 2 Mal an? Der wesentliche Teil vom Beispiel war ja, wie man die Frequenzachse hinbekommt.

Zitat:
dass das Skript mir die Frequenzen meines Signals herausfiltern kann, die mein Signal später als schöne Sinuskurve im Zeitbereich beschreiben können.

Wie soll das Skript das können? Es berechnet ja nur die fft und plottet sie. Wenn du eine schöne Sinuskurve haben willst, musst du das originale Signal rekonstruieren, siehe z.B.
https://de.mathworks.com/matlabcent.....-original-signal-from-fft

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.