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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.