Moin, ich sitze immer noch an meinem Frequenzanalyse-Projekt. Es geht darum die Freuqenz eines Eingangssignals hochgenau zu bestimmen. Letztes Jahr griff ich die Methode von Detlef auf, bei der man durch die Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines Signals errechnen kann. Dies funktionier auch SUPER! Bei einer FFT Aufloesung von ca. 20 kHz (10MSPS, 1024 Punkte Complex FFT) kann ich die Frequenz des Signals promille-Genau, sogar noch exakter bestimmen. Mein Eingangssignal hat immer eine dominierende Frequenz, die mal staerker und mal schwaecher zu sehen ist, also mit dynamischer amplitude. Dieser Frequenz moechte ich folgen (die frequenz "springt" nicht). Bislang habe ich jede FFT im vollen Frequenzbereich analysiert (800Hz bis 5MHz). Theoretisch brauche ich die Analyse im vollen Frequenzbereich nur einmal zu machen, den sobal die Frequenz (im falle der FFT, das Maximum) einmal gefunden ist, brauche ich dieser nur zu folgen. Zwischen 2 FFTs die ich durchfuehre, kann sich das Signal sowieso nur um maximal ca. 20 kHz verschoben haben. Es ist also alles andere als effizient jedesmal den gesamten Frequenzbereich von 5 MHz zu analysieren, obwohl man vorher weiss, dass sich das Signal z.b. bei 160 kHz plus-minus 20 kHz befindet. Ich habe schon stichwoerter wie Modulation der Samples aufgegriffen, aber so wirklich blicke ich da noch nicht ganz durch. Ein Beispiel konnte ich auch nicht finden. Es geht also darum, dass ich eine FFT in einem bestimmten Frequenzbereich durchfuehren moechte, also z.B. zwischen 160kHz und 200kHz. Meine Samplingrate betraegt 10MHz. Fuer jede Hilfe waere ich sehr dankbar Kai
Nach einigen Simulation muss ich feststellen, dass ich nicht ganz hinter der beziehung von Sample Rate und Anzahl der Samples, die ich durch den Goertzel jage, durchblicke. Im Inet findet man meist nur das Beispiel mit 8kHz samplingrate und N-Anzahl von 205. Kann mir vlt. jemand erklaeren warum ausgrechnet 205? Ein reales Scenarion in meinem Projekt waere folgendes: Sampling rate: 10MHz, zu untersuchende Bandbreite: 40kHz: start bei 140kHz, ende bei 180kHz. Die Genauigkeit dich ich hierbei brauche liegt bei 10Hz Schritten. Wenn ich eine Simulation bei diesem Scenario durchfuehre scheint es, als ich ein unheimlich hohes N (Anzahl an Samples) brauche um genau zu sein. Kann mir jemand sagen was genau es aufsich hat mit der Samplingrate, Samples-Anzahl und Aufloesung beim Goertzel. Wenn es gleich wie bei einer FFT ist, dann kann ich den Goertzel fuer meinen Zweck vergessen.
>>>> Letztes Jahr griff ich die Methode von Detlef auf, bei der man durch die Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines Signals errechnen kann. Dies funktionier auch SUPER! <<<< :-))) Ich bin erstaunlicherweise in der Lage dazuzulernen und die Frequenz(Amplituden-,Phasen-)bestimmung geht besser so: Beitrag "Frequenzlinie ausfiltern und deren Amplitude auswerten" Dabei bekommt man für jedes neue sample eine 'ad hoc' Frequenz, das Verfahren ist hochgenau: Ich konnte damit mit meiner soundkarte mittels Doppler-Frequenzverschiebung Fingerbewegungen detektieren. Bei Interesse gerne mehr, ich werbe hier schon lange für dieses wunderbare Verfahren. Goertzel ist FFT auf einer Frequenz, Du gibst die Frequenz vor. Cheers Detlef
Danke, immer wieder erfreut von dir zu hören Detlef :) Klar bin ich an deinem verbesserten Verfahren interessiert und werde es so schnell wie möglich Testen :)
Im Prinzip geht es viel einfacher. Das Signal wird in Quadratur mit einer Frequenz in der Naehe multipliziert und tiefgepasst. Dann muss man nur noch auswerten was die differenzfrequenz ist, und ob das Resultat links oder rechts herum dreht. Dann weiss man die genaue Frequenz. Ich wuerd's mit etwas unterhalb von 140kHz versuchen.
Könnte man der Aufklärung halber nochmals bitte kurz aufzeigen, was die Methode Detlef 1 war und worin der Unterschied zu Detlef 2 besteht? Mir ist dieser Satz nicht verstaändlich: Kai Zung schrieb: > bei der man durch die > Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines > Signals errechnen kann. Welche Phasendrehung? War gfs das gemeint: "Phasendifferenz zwischen zwei Informationen aus 2 FFTs derselben gesuchten Frequenz?" Im Prinzip ist es ja so, dass die Phase - relativ zur Bezugsohase 0 der FFT - bei beiden FFT-Ausgaben konstant sein muss - von Fehlern abgesehen. Wie ermittle ich daraus die Frequenz? Ich bekomme doch immer eine Art Gaussverlauf der Frequenzen mit 2 Maxima, die ein theoretisches Maximum einfassen. Wie kommt man da von deren Phasen auf die nicht erwischte Idealfrequenz? Und wie stellt man fest, dass sich die Frequenz nicht verändert hat sondern statisch ist? Eine sich bewegende Frequenz würde ja auch ein Verschmierung bewirken.
Hallo, das Interesse an genauer Frequenzbestimmung freut mich. Die erste Methode lief über verschobene FFTs: Beitrag "Genaue Frequenzbestimmung nach FFT" Die zweite Methode geht ohne FFTs: Beitrag "Frequenzlinie ausfiltern und deren Amplitude auswerten" >>>>>>> Kai Zung schrieb: > bei der man durch die > Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines > Signals errechnen kann. Welche Phasendrehung? <<<<<<< Ist erklärt in der Beschreibung der ersten Methode: Du kennst die Phasendrehung einer einzelnen Spektrallinie für z.B. zwei Abtastwerte Verschiebung, daraus läßt sich die genaue Frequenz berechnen. >>>>>>>>>>>> Im Prinzip ist es ja so, dass die Phase - relativ zur Bezugsohase 0 der FFT - bei beiden FFT-Ausgaben konstant sein muss - von Fehlern abgesehen. <<<<<<<<<<<<< Nee, dem ist nicht so. Die Phase dreht für überlappende FFTs weiter. Die ganze Nummer ist mit Sourcecode in Beitrag "Genaue Frequenzbestimmung nach FFT" vorhanden, da mal reinkucken. Cheers Detlef
so, bin wieder da. Hat bisschen gedauert, da ich speziell zum überprüfen der verschiedenen Methoden eine Anwendersoftware geschrieben habe. Die Methode mit den überlappenden FFTs ist bereits implementiert und rein rechnerisch deckt es sich mit meinen reelen Messungen. Auch bei schwierigen Signalverhältnissen liefert mir die FFT Methode bei bestimmung der Hauptfrequenz eine Genauigkeit im promille Bereich. Bei der zweiten, hier erwähnten Methode von Detlef stoß ich noch auf paar Probleme, die hauptsächlich darauf zurückzuführen sind, dass ich kein guter theoretischer Mathematiker bin :). Verstehe ich das richtig, dass man im Prinzip nur 3 Samples braucht um eine erste Frequenz zu berechnen? Was macht man denn, wenn man 512 hat? Die mathematischen defizite tauchen bei mir übrigens bei der linearen Regression auf. Also im prinzip Blicke ich zwischen den zwei Hauptzeilen nicht ganz durch: %Jetzt mit linearer Regression den Faktor bestimmen % Regression s1 auf s2 M= [s2.' ones(length(s1),1)]; coff=inv(M'*M)*M'*s1.'; Also Detlef falls du mir da noch bisschen auf die Sprünge helfen könntest, wäre es echt super. Gruß Kai
>>>> Verstehe ich das richtig, dass man im Prinzip nur 3 Samples braucht um eine erste Frequenz zu berechnen? <<<< Ja, das ist richtig, es reichen 3 samples um die Frequenz zu bestimmen >>>Was macht man denn, wenn man 512 hat? Gute Frage. Du nimmst mehr samples als die 3 nötigen um den Einfluß des Rauschens zu unterdrücken. Mit den 512 samples oder auch jeder anderen sampleanzahl bekommst du für die gesuchte Konstante ein überbestimmtes, lineares Gleichungssystem. Und seit dem grossen Gauss löst man das mit minimalem Fehler mittels linearer Regression. Und das geht so: Ax=y ist das lineare, überbestimmte Gleichungssystem in Matrixschreibweise. Lösung mit minimalen Fehlerquadraten lautet: A'*A*x=A'y , mit A' (A transponiert) von links vormultipliziert) Lösung: x=inv(A'*A)*A'*y Das ist die Gleichung, die auch im Matlab script steht. Das ganze ist auch bei Wikipedia unter 'lineare Regression' und 'Methode der kleinsten Quadrate' ausführlich und (m.E.) etwas verwirrend beschrieben. Hoffe, das geht so bei Dir. math rulez! Cheers Detlef
Ich bin nach langem hin und her auf die Methode von Prony die Detlef vorgestellt hat zurueckgekommen. Detlef schrieb: > Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines > gegebenen Sinus bestimmt. Das funktioniert auch gut unter Rauschen. Wenn ich jedoch auch nur das geringste Rauschen hinzufuege, dann versagt die Methode (und das script) komplett. Kannst du das bestaetigen Detlef?
>>Kannst du das bestaetigen Detlef?
Hallo, nein, das kann ich nicht bestätigen, ich schrub ja, dass das gut
in Rauschen funktioniert. Poste mal die Daten.
Cheers
Detlef
Hier das Script das ich aus [[Frequenzlinie ausfiltern und deren Amplitude auswerten]] uebernommen habe plus noise. Fuehre ich das Script ohne noise aus --> Super!! Script mit noise --> Autsch!! clear; Fs = 48000; Ts = 1/Fs; N = 512; f1 = 1938; t = (0:N-1)*Ts; LSD = 0.01; noise = sqrt(LSD/Ts)*randn(1,length(t)); % sig = 1.2345*sin(2*pi*f1*t) + 0.01*noise; sig = 1.2345*sin(2*pi*f1*t); s1=sig(1:N-2)+sig(3:N); s2=sig(2:N-1); M= [s2.' ones(length(s1),1)]; coff=inv(M'*M)*M'*s1.'; %Den Faktor in die Frequenz umrechnen wn=acos(coff(1)/2); f_calc = wn * Fs / (2 * pi) fehler = (f_calc - f1) / f1 * 100
Sorry ich kenne mich in der Materie nicht richtig aus,aber konnte es daran liegen dass das Rauschen nicht Bandbegrenzt ist?
Hallo Kai, reduzier mal die Abtastrate auf 12kHz oder niedriger, dann geht es besser. Hintergrund: Für hohe Überabtastraten ist der Term coff(1)/2 nahe an 1, und 'auf der Kuppe des Cosinus' wirkt sich ein Fehler stark aus. Kennst Du die Frequenz ungefähr? Dann gibt's besseres! Cheers Detlef clear; Fs = 12000; Ts = 1/Fs; N = 512; f1 = 1938; t = (0:N-1)*Ts; LSD = 0.01; noise = sqrt(LSD/Ts)*randn(1,length(t)); sig = 1.2345*sin(2*pi*f1*t) + 1*0.01*noise; %sig = 1.2345*sin(2*pi*f1*t); s1=sig(1:N-2)+sig(3:N); s2=sig(2:N-1); M= [s2.' ones(length(s1),1)]; coff=inv(M'*M)*M'*s1.' %Den Faktor in die Frequenz umrechnen coff(1)/2 wn=acos(coff(1)/2) f_calc = wn * Fs / (2 * pi) fehler = (f_calc - f1) / f1 * 100 10*log10((sig*sig')/(0.01*noise*0.01*noise')) plot(s2,s1,'r.',s2,M*coff,'b.') return
Danke fuer die Hilfe Detlef. OK, das sieht schon besser aus. Fuer meine Zwecke warscheinlich jedoch nicht sehr gut geeignet. Ich sample mit 10 MHz und detektiere Frequenzen von 800 Hz bis 5 MHz. Das klappt mit der Methode der zwei verschobenen FFTs auch recht gut! Jedoch hoffe ich noch genauer zu sein und suche deshalb nach anderen Methoden. Um deine Frage zu beantworten: fuer die entgueltige Frequenz bilde ich bislang aus 15 Werten, jeweils errechnet mit Methode der verschobenen FFTs, den Durchschnitt. Ich kann somit problemlos die Frequenz zuerst mit der einen Methode (FFT Verschiebung) errechnen und dann eine andere Methode zur exakteren auswertung zuziehen. Somit Ja, ich kenne die Frequenz ungefaehr. Was schlaegst du vor?
Hi, wenn Du die Frequenz kennst modellierst Du ein System, das ungedämpft auf dieser Frequenz schwingt. Dessen Zustandsgrößen schätzt Du mit einem Kalman Schatzer. Die Phasendrift ist ein Maß für den Frequenzversatz zwischen Deinem Model und Deinem realen Signal. Das hatte ich hier schon mal dargelegt: Beitrag "Amplitude und Phase einer festen Frequenz bestimmen." Das ist im Prinzip das gleiche als wenn Du Dein Signal vor der Frequenzbestimmung durch enen sehr schmalbandigen Bandpass schickst, der 'ungefähr paßt'. Ich habe die Frequenz nochmal anders bestimmt, und zwar mittels anlytischem Signal. Geht auch ganz gut. Cheers Detlef clear; Fs = 12000; Ts = 1/Fs; N = 512; f1 = 1938; t = (0:N-1)*Ts; LSD = 0.01; noise = sqrt(LSD/Ts)*randn(1,length(t)); sig = 1.2345*sin(2*pi*f1*t) + 1*0.01*noise; % Frequenzbestimmung durch Bildung von analytischem Signal sigc=hilbert(sig); phdiff=angle(sigc(2:end)./sigc(1:end-1)); phdiffmean=mean(phdiff); f_calc1=Fs*phdiffmean/2/pi return
Kai Zung schrieb: > Ich sample mit 10 MHz und detektiere Frequenzen von 800 Hz bis 5 MHz. und das geht so nah an Nyquist heran?
Mit der Methode Genaue Frequenzbestimmung nach FFT funktionier es auch so nah an Nyquist super. Wenn das Signal einen grossen Noise Antei hat, wird es nah an Nyquist (und nah an Nyquist / 2) zwar bisschen ungenauer, jedoch spreche ich hier von Abweichungen unterhalb des Promille-Breichs.
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.