Forum: Digitale Signalverarbeitung / DSP / Machine Learning Fast Fourier Transformation mit Matlab


von Stefan N. (marcinoo)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hab folgendes Problem:
Mir liegt ein Sinussignal in diskreter Form von 20ms Länge vor. Dieses 
Signal hat eine minimale Frequenz von 50Hz, das heißt eine Periode passt 
genau in diese 20ms.
Aber das Signal ist auch mit höherfrequenten Anteilen überlagert.
Dieses Signal soll ich nun im Frequenzbereich untersuchen und alle 
Frequenzen die darin vorkommen angeben.
Um dies zu tun habe ich erst einmal ein Signal erstellt bei dem mir alle 
Frequenzen bekannt sind (siehe s im Matlabcode).


% close all
clc

f1 = 50;
f2 = 55;
f3 = 3000;

fs = 1000000;
t=0:1/fs:0.02; %andere Variante: t=0:1/fs:1;
x =length(t)
s = sin(2*pi*f1*t) + sin(2*pi*f2*t) + sin(2*pi*f3*t);
ls=length(s);


fmax = 1/(t(2)-t(1));
l = length(s);
df = (1/l)*fmax
fvec = 0:df:fmax-df;

figure
subplot(2,1,1);plot(t, s);subplot(2,1,2);plot(fvec, abs(fft(s))/l*2)

Also ich erstelle mir das Signal in diskreter Form, so wie ich es auch 
zum untersuchen bekommen würde.
wenn ich nun auf das Signal die FFT anwende bekomme ich folgendes 
Spektrum:
(pic1p)

http://www10.speedyshare.com/files/21353084/download/pic1.jpg

Wie man sieht ist der Anteil mit 55Hz nicht im Spektrum enthalten obwohl 
er ja in Wirklichkeit da ist
Wenn ich aber im Matlabcode folgende Zeile ändere: aus t=0:1/fs:0.02; 
mache ich t=0:1/fs:1;
Also ist mein Signal jetzt nicht 20ms sondern 1s lang. Dann erhalte ich 
folgendes Spektrum: (pic2p)

http://www10.speedyshare.com/files/21353222/download/pic2.jpg

Hier ist der Anteil von 55 Hz gut sichtbar.
Wie kann ich also mein Problem lösen? Ich habe das Signal, dass ich 
untersuche nur als kurzes, diskretes Signal von 20ms vorliegen und soll 
es mit einer Frequenzauflösung von 1Hz untersuchen. Zerbreche mir schon 
lange den Kopf, aber es klappt nicht
Für jede Hilfe wäre ich sehr dankbar :-)

: Verschoben durch Admin
von Thomas B. (detritus)


Lesenswert?

Stefan Nafets schrieb:
> Wie kann ich also mein Problem lösen? Ich habe das Signal, dass ich
> untersuche nur als kurzes, diskretes Signal von 20ms vorliegen und soll
> es mit einer Frequenzauflösung von 1Hz untersuchen. Zerbreche mir schon
> lange den Kopf, aber es klappt nicht

Naja, es geht ja auch nicht ;)

Die Frequenzauflösung der FFT wird allein von der Länge des betrachteten 
Zeitfensters bestimmt. Wie du schon gesehen hast, führt eine größere 
Länge zur besseren Auflösung, der Kehrwert der Fensterlänge gibt die 
Frequenzauflösung an. Wenn du wirklich nur die 20ms an Daten hast, 
kannst du so nur 50Hz auflösen.
Du könntest allerdings versuchen, das selbe 20ms Fenster 50mal 
hintereinander in einen Vektor zu schreiben, und den dann mit der FFT zu 
behandeln. Das Ergebnis ist wg. Leakage allerdings mit Vorsicht zu 
genießen (mit Fensterung kann man evtl. noch was rausholen)

von Peter K. (peter26)


Lesenswert?

Hi,


Also die Frequenzauflösung lässt sich ja berechnen:
Heisst bei fs=1000000 und N=fs * 0.02 -> 50 Hz d.h entweder du erhöhst 
die Abtastfrequenz oder die Anzahl der Werte:

.) Zeropadding (Anfügen von Nullen) -> damit kannst du die 
Frequenzauflösung auf keinen Fall verbessern auch wenn es auf den ersten 
Blick so aussieht.

.) Mit einer Fensterfunktion kannst du deine Frequenzauflösung auch 
nicht verbessern da die schmalste (oder schmälerste ;-) keine Ahung) 
Mainlobe durch ein Rechteckfenster zustanden kommt -> das du ja 
automatisch schon angewendet hast.

Hoffe dich nicht verwirrt zu haben.

lg Peter

von Stefan N. (marcinoo)


Lesenswert?

Woow danke für eure Antworten :-)

Also zu Thomas B:

>Du könntest allerdings versuchen, das selbe 20ms Fenster 50mal
>hintereinander in einen Vektor zu schreiben, und den dann mit der FFT zu
>behandeln. Das Ergebnis ist wg. Leakage allerdings mit Vorsicht zu
>genießen (mit Fensterung kann man evtl. noch was rausholen)

Genau das habe ich schon versucht, dass Problem was dabei auftritt ist, 
dass ja noch höherfrequente Anteile im Signal enthalten sind, die nicht 
unbedingt vielfache von 50Hz sind. D.h sie passen in die 20ms nicht 
komplett rein, sondern vielleicht 5 mal und noch ein bischen. Somit 
kommt es zu sprüngen an den Übergängen also alle 20ms. Und das verzerrt 
das Spektrum. Meinst du das mit Leakage?

Un zu Peter K. :-)

Wenn ich fs erhöhe, bring das ja nicht viel da es in deiner Formel im 
Zähler und im nenner steht und sich somit weggürzt. Aber das habe ich 
als erstes audprobiert :-)
Das mit dem auffüllen mit Nullen habe ich auch schon ausprobiert und 
gemerkt dass es nur falsche ergebnisse liefert.

Mit Fensterung habe ich im besten falle auch nur eine auflösung von 50Hz 
hinbekommen.

Hmm also bin ich in einer Sackgasse .. und kann da nix tun ??
Ich denke ich muss noch an der idee arbeiten ber der ich das signal 
einfach 50mal hintereinander schreibe ......

von Detlef _. (detlef_a)


Lesenswert?

Du mußt ja keine FFT machen. Mit der Matlab-Optimierungsfkt. 
(fminsearch) läßt Du Dir in Deine Meßwerte einen Sinus nach 
Amplitude/Frequenz/Phase reinfitten. Das klappt prima.

Cheers
Detlef

von Alexander L. (lippi2000)


Lesenswert?

Hey Stefan,

Peter hat die diskrete Frequenz
 richtig erklärt.
Die Formel sagt, dass deine Frequenzauflösung
 gleich dem Verhältnis von Abtastfrequenz zur Anzahl der 
Gesamtabtastwerte ist.

Bei 1kHz Abtastfrequenz und 1000 Samples kannst du eine FFT berechnen 
und erhältst dort die gewünschten Frequenzanteile mit einer Auflösung 
von 1Hz. Also übertrieben gesagt kleine Balken die alle 1Hz breit sind 
:-)

Nimm mit 1kHz allerdings 10x so viele, nämlich N=10000 Samples auf und 
deine FFT erreicht jetzt eine Auflösung von 0.1Hz.

Also das ist nun mal das absolute Grundgesetz der FFT.

Zero Pading wird eigentlich nur verwendet, wenn die FFT keiner 2er oder 
3er Potenz entspricht um sie berechnen zu können. Nimmt man 1000 
Samples, so benötigt die FFT allerdings 1024. Am besten ist ein 
Zeropadding von 12 Werten am Anfang und weiteren 12 am Ende. Wird eine 
Fensterfunktion verwendet, werden die Amplituden am Rand eh sehr stark 
gedämpft und die Beeinflussung geht gegen Null.

Die Lösung mit dem Aneinanderfügen von mehreren Samplefunktionen geht 
nur bei selbst berechneten Funktionen, die dann einen stetigen Übergang 
aufweisen müssten. Und das ist auch nur bei einigen Signalen der Fall. 
Bei nichtperiodischen Funktionen geht das schon gar nicht. Ergo 
absoluter Murks.

Du wirst dein Ziel nur mit richtigem Abtasten und Samplezahl erreichen.

Gruß Alexander

von Alexander L. (lippi2000)


Lesenswert?

Hab deinen Code mal angesehen, dein Problem ist ein ganz anderes. Schau 
dir die FFT-Berechnung mal genau an.
Im übertragenen Sinne kann man sagen:

1.
Passt ein Sinus mit genau einer Periode in deinen Vektor, erhältst du 
eine Linie an x=1. Passen 2 Perioden rein, dann bekommst du die 
Spektrallinie bei x=2.

Willst du eine Auflösung von 5Hz haben, so muss in deinem Vektor 
mindestens einmal die 5Hz-Schwingung rein passen. Ein 50Hz-Sinus liegt 
dann genau mit 10 Perioden in dem Vektor.

2.Aus wie vielen Samples müsste ein Sinus mit 5Hz bestehen?

Da hilft dir der Herr Shannon weiter. Soll deine höchste Spektrallinie 
(Ende des Spektrums) bei 50Hz liegen, dann müssen 2 Abtastwerte vor 
liegen! Es ergibt sich ein Spektrum welches bis 100Hz geht, wobei alles 
ab 50Hz gespiegelt ist.
Wiederum heißt dies, dein 5Hz-Sinus müsste folglich aus 20 Abtastwerten 
bestehen. (Ein 5Hz-Signal kann also bis zur 9.Oberschwingung dargestellt 
werden)

Das war jetzt mal komplett von hinten aufgezäumt, aber das ist ja 
ungefähr der Grundgedanke der DFT. Schau deinen Code mal durch. Wie 
viele Perioden des 50-Hz Sinus sind in deinen N-Abtastwerten enthalten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.