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 :-)
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)
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
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 ......
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
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
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.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.