Alternative zur FFT, Freq. genau bestimmen

Dec 13, 2007 78 Replies

Ich habe ein paar Messwerte im Puffer (sinusähnlich, ca. 10000 Schwingungen, Oversampling ist ca. 100) und möchte die Frequenz der Grundwelle (kann +-10% abweichen) möglichst genau bestimmen (möglichst auch genauer als es die Samplerate vorgibt). Die FFT löst ja nur im festen Raster auf und ist auf Messfenstervielfache von 2 festgelegt. Eine Idee wäre es noch, einen abstimmbaren Bandpass mehrfach auf den Puffer anzuwenden, bis das Ausgangs"signal" maximal ist (natürlich alles in Software). Welche Möglichkeiten gibt es noch?



M.


Matthias Weingart schrieb:

MEM hat AFAIK nicht dieses feste Frequenzraster. Allerdings habe ich noch keinen Code zum Laufen gebracht, trotz Beispiel im Numerical Recipes.

mfg Rolf Bombach

Handelt es sich um ein Gemisch unterschiedlicher Signale, oder handelt es sich um eine Grundwelle mit harmonischen Oberwellen?

Oder ist es ein halbwegs sauberes periodisches Signal, bei dem man die Nulldurchgänge sauber erkennen kann?

Je nachdem, entweder erstmal ein Tiefpassfilter rechnen, oder auch nicht.

Dann den Mittelwert bestimmen und damit den Gleichanteil beseitigen. Dann die Zeit zwischen den 20.000 Nulldurchgängen deiner 10.000 Schwingungen messen und daraus die Frequenz bestimmen. Die Auflösung vergrößert sich dann entsprechend der Zahl der Nulldurchgänge.

Wenn sich die Frequenz ändert und/oder eine geringere Auflösung reicht, einfach weniger Nulldurchgänge nehmen, bzw. direkt die Periodendauer messen. Letzteres dann nur mit der Auflösung, die sich aus dem Oversampling ergibt.

Gruß

Stefan DF9BI

Stefan Brröring :

Das mit den Nulldurchgängen hab ich mir auch schon gedacht, nur sind die leider nicht so schön gleichmässig verteilt. Mal nen Beispiel, wie das Signal aussehen könnte: Foto eines Lineals - die mm-Striche bestimmen die Frequenz und je nach Toleranz ist der eine Strich mal etwas breiter als der folgende. Im Durchschnitt stimmt aber das Raster (die Frequenz). M.

Rolf_Bombach :

Also Wavelet Analyse. In dem Buch scheint es noch Javabeispielcode dafür zu geben:

formatting link

M.

Das ist ja nicht unbedingt ein Problem. Kommt nur drauf an, wieviele Nulldurchgänge du nimmst.

Ich probiers mal mit Psuedo-Code

// erst Mittelwert berechnen

XM := 0; For i := 1 to 10000 xm := xm + x[i]; // Summe aller Messwerte bestimmen mx := xm / 10000; // daraus den Mittelwert berechnen

// Dann den ersten Nulldurchgang suchen

n := 0; i := 1; Repeat inc(i) until (x[i]*x[i-1] < 0); // ersten Vorzeichenwechsel suchen j1 := i;

// Dann Nulldurchgänge zählen

for i := j1 to 10000 begin inc(i); if (x[i]*x[i-1] < 0) then // wenn Vorzeichenwechsel begin inc(n); // Anzahl Nulldurchgänge incrementieren j2 := i; // Zeitpunkt des letzten Nulldurchgangs speichern end; end;

t := (j2-j1) * delta_t;

// und Frequenz berechnen f := n / t / 2;

Wenn keine anderen Frequenzen existieren würde wandeln auf Rechteck und dann Mittelwert bilden der Perioden ja nominell reichen.

Autokorrelationsfunktion ( delay, multiply, integrate ) und die in tracking-modus nur auf enges Fenster um ersten Peak oberhalb DC laufen lassen.

MfG JRD

Rafael Deliano :

Hast Du da mal ne gute Quelle für Einsteiger?

M.

Für eine komplette AKF würde man sonst zwei FFTs brauchen, oder man müsste das Faltungsintegral komplett durchrechnen.

Die Auflösung wird damit aber auch nicht besser als durch die Samplefrequenz vorgegeben.

Gruß

Stefan DF9BI

Die AKF bringt dir eigentlich nur etwas, wenn dein Nutzsignal so stark von Störsignalen überlagert ist, dass du es praktisch gar nicht mehr erkennen kannst.

Aus deinen bisherigen Postings hatte ich geschlossen, dass du ein Signal hast, das einigermaßen sauber aussieht. In dem Fall macht AKF keinen Sinn.

Gruß

Stefan

Hi,

betrachte aus deinem grossen Zeitfenster zunächst nur ein kleines Fenster am Anfang, sagen wir mal mit 100 Sinusperioden. Per FFT Frequenz und Phasenlage in diesem Fenster bestimmen. Das gleiche machst du mit einem kleinen Fenster am Ende des grossen Zeitfensters. Dann kannst du die beiden Phasen-Informationen verwenden, um die Frequenz genauer zu berechnen. Denn der Zeitabstand zwischen den beiden Fenstern ist ja genau bekannt.

Gruss Michael

Matthias Weingart schrieb:

Also insgesamt 2 Millionen Samples?

Was meinst du damit? Wenn du 200 Samples pro Schwingung hast, möchtest du die Frequenz genauer als 1/200, also besser als 0,5% genau?

Macht nichts, selbst wenn du nur die Hälfte der Messwerte nehmen kannst, damit du auf 2^x kommst, durch die große Anzahl der Samples hast du schon eine sehr feine Auflösung. Wenn du eine FFT mit

1 Megasamples in den µC? reinbekommst (schön gefenstert mit Blackman oder ähnlicher Maske), bekommst du bereits eine Auflösung von 1/500000? der Samplingfrequenz, also bei deiner Frequenz sind das dann 1/5000 = 0,05% (oder eine Faktor 2 kleiner oder größer). Wenn das nicht ausreicht, kann man immer noch mit den Nachbarwerten um den Peak im Frequenzspektrum interpolieren.

Jens

Stefan Brröring :

Besser als die Nulldurchgangsmethode wäre es mit AKF wohl - weil das gesamte Signal in die Betrachtung eingeht und nicht nur wenige (möglicherweise gestörte) Punkte. Hab grad festgestellt, dass das Signal ziemlich mit DC "versaut" sein kann. Es kann einfach mal springen - wobei der Sprung über 0.1 bis 5 Perioden gehen kann oder auch schleichend und viel grösser als die Amplitude der Grundschwingung ist. Das müsste ich vorher erstmal irgendwie "glattbügeln", (also Hochpass) und zusätzlich sogar Teile rausschneiden. Kann mir vorstellen, dass die AKF mit DC überhaupt nicht klarkommt, die FFT stört so etwas vielleicht weniger? Rauschen ist nicht das Problem. Elektronisch würde ne PLL bestimmt ne gute Lösung sein. Im Falle des DC-Sprungs müsste man dann kurz mal ausrasten.

M.

"Jens Dierks" :

Mal wieder ne Änderung der Aufgabenstellung *duck* :-):

Speicherplatz (und Rechenzeit) soll möglichst klein werden, darum sollte es auch nur mit 10fach oversampling schon gute Ergebnisse bringen und auch wenn ich nur 100 Perioden habe. Problem bei der FFT ist ja auch, dass ich verschiedene Ergebnisse bekomme, je nachdem bei welchem Sample ich das Zeitfenster beginne (und auch die Peaks schieben sich da hin und her)... Die Lösung mit einem "Filter" dass auf Resonanz verstimmt wird, hat ja am Anfang auch Probleme mit dem Einsschwingen, aber wird zum Ende hin (je mehr Samples dazugenommen werden) immer genauer, so dass man dann frühzeitiger abbrechen kann. (mhh, gibt aber wieder nen Problem mit dem DC-Sprung, siehe anderes Posting, also der breitbandige (+-10%) Bandpass vorneweg bleibt mir wohl nicht erspart).

M.

Matthias Weingart schrieb:

Deswegen die Fensterung, also Mittelwert bestimmen und zu den Rändern hin die Signale verkleinern und auf den Mittelwert zulaufen lassen. Dann sind beide Ränder auf dem selben Wert.

Das hört sich noch schwieriger an als mit FFT. Wie man Performance einsparen kann hat Michael schon beschrieben, man kann auch erstmal ein kleines Zeitfenster samplen, FFT berechen (wenn das schnell genug geht), dann ausrechnen wie lange man warten kann damit man keinen Fehler einer ganzen Schwingungsperiode eingeht, dann nochmal sampeln und nach Michaels Beschreibung vorgehen.

Jens

Ich habs mal aufgepinselt:

formatting link

Das Signal sollte DC-frei sein, da hilft ein simpler Differenzierer.

Die AKF wandelt einen Sinus in eine Cosinuszeitreihe von um. Das Rauschen sammelt sich nahe DC.

Anders als ursprünglich gesagt würde man hier nicht auf den Sinuspeak sondern auf den Nulldurchgang sein Fenster legen, Signal dort steiler. Für jeden Punkt der Zeitreihe bräuchte man die simple Schaltung. Delay also jeweils ein Sample länger. Insofern um Aufwand zu reduzieren nicht die ganze Zeitreihe sondern nur Fenster.

Das Verfahren wird bekanntlich in FSK-Modems verwendet um zwei Frequenzen zu unterscheiden. Dort berechnet man nur einen festen Punkt, den am Nulldurchgang.

Hier würde man mehrere Samples um den Nulldurchgang berechnen. Anhand der Steilheit der Gerade die durch Null geht sollte man die Frequenz also auch zwischen den Samples interpolieren können.

MfG JRD

Rafael Deliano :

Thx.

Also ist das Fenster viel kleiner als eine Periode (ich hätte das jetzt grösser gemacht (also mind. eine komplette Periode). Ich möchte möglichst viel vom Signal verwenden - umso genauer wird es (hoffe ich), andererseits spart ein kleines Fenster Zeit.

M.

Das Fenster sind hier eigentlich nur 2 Punkten: die unmittelbar links und rechts vom Nulldurchgang.

Aber wenn das Signal jittrig ist und die Abtastrate hoch kann das zuwenig sein, weil man den Nulldurchgang dann nicht immer im Blickfeld hat und kontinuierlich Frequenz berechnen kann. Deshalb ist oft 3-4 Punkte berechnen für Tracking besser.

Man benötigt die Multiplizierer und Integrator dann aber 3-4 mal, Aufwand steigt. Wenn das Signal in FIFO fester Länge ankommt hat man wegen des Delay-RAM kaum Probleme: kann man über Indexoffset dort abgreifen. Aber die FIFO muß so tief sein, daß der Nulldurchgang dort überhaupt noch gespeichert ist. Bei hoher Samplerate und niederer Sinusfrequenz also entsprechend viel RAM für FIFO nötig.

MfG JRD

War das jetzt die Antwort eines DSPs??

Die AKF läßt sich wunderbar in Analogtechnik realisieren.

- Henry

www.ehydra.dyndns.info

Rafael Deliano schrieb:

Richtig. Aber da ist die Frequenz genau bekannt.

Wie macht es denn ein Mensch, wenn er aufs Scope guckt? Irgendwas mit Mustererkennung und Gewichtung.

- Henry

www.ehydra.dyndns.info

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required