Alternative zur FFT, Freq. genau bestimmen

Dec 13, 2007 78 Replies

Nicht wirklich: echtes Totzeitglied ist klassisches Problem der Analogtechnik. Dort biegt man dann lieber schnell Richtung PLL ab.

MfG JRD

Rafael Deliano schrieb:

Ich habe hier auf dem Schreibtisch laufen: SC-Bandpassfilter, Schmitt-Trigger, Delay als digitales Schieberegister realisiert, XOR, SC-Tiefpassfilter, Schmitt-Trigger. Funzt super.

Nebenher ist der Controller zu 100% rechenleistungsmäßig frei.

Eine PLL eignet sich wohl eher für längerperiodische Signale. Lasse mich aber gerne belehren.

- Henry

www.ehydra.dyndns.info

Ein numerischer Fit an einen Sinus. Die Startfrequenz für den Fit bekommst Du durch die Zahl der Nulldurchgänge. Das habe ich in einem ähnlichen Fall (1e6 Datenpunkte, 10 bis 1e4 Perioden) erfolgreich angewendet. In der Diss. von Stefan Götte wird das Verfahren beschrieben:

formatting link
(ab Seite 42) Ein Fit für eine Mio Datenpunkte kann erheblich schneller sein als eine FFT. Dafür erhält man weniger Information, nämlich nur die drei Zahlen Frequenz, Amplitude und Phase der Grundschwingung. Andere Frequenzanteile, die im Signal enthalten sein mögen, werden ignoriert. Außerdem ist anders als bei der FFT die Präzision mit der die Frequenz ermittelt wird, nicht fest mit der Zahl der Datenpunkte verknüpft.Wahrscheinlich reichen erheblich weniger Datenpunkte als Du zur Verfügung hast, um eine dem Problem angemessene Genauigkeit der Auswertung zu erreichen.

------

Kai-Martin Knaak http://lilalaser.de/blog

Moin,

Michael Koch schrub:

Dabei könnte es aber passieren, dass man sich mit der Anzahl der Perioden, die zwischen den beiden Bereichen liegen, verschätzt.

Aber so ähnlich:

Erst mal nur eine sin-Funktion bezüglich Phase und Periodendauer in die geschätzte erste Periode reinfitten. Jetzt kennt man den ungefähren Wert der Periodendauer. Nun die zweite Periode mit einbeziehen. Dadurch bekommt man einen genaueren Wert für die Phase und Periodendauer. Jetzt die erste und die die dritte Periode berücksichtigen, die zweite auslassen. Mit diesen beiden Fenstern wie gehabt Phasenlage und Periodendauer optimieren. Das Optimieren müsste recht zügig gehen, da man ja schon einen guten Startwert hat. So macht man weiter: 1. und 4. Periode berücksichtigen, Phase und Periodendauer optimieren. Dann 1. und 5. Periode berücksichtigen....

Der Rechenaufwand steigt nur linear mit der Anzahl der Samples, müsste also irgendwann schneller als FFT sein.

CU Rollo

Moin!

Dagegen hilft Zählen der Nulldurchgänge, die schnellste Methode, ein ungefähres Ergebnis als Startwert für kompliziertere Verfahren zu erhalten. Für die Anzahl der Perioden zwischen zwei Zeitpunkten ist es exakt exakt genug. :-)

Hiervon hingegen würde ich - über das gesamte Signal - das exakteste Ergebnis überhaupt erwarten. Vermutlich ist es aber auch die aufwendigste Methode.

Gruß, Michael.

Moin!

Hab eben erst gesehen, daß Du hier schon ähnliches geschrieben hast wie ich gerade...

Wobei die Frequenzanteile auch sehr dicht beieinander liegen können... Genauer gesagt: Bei auch nur minimalen Frequenzschwankungen oder einem Phasensprung geht das Verfahren zwangsläufig in die Hose, weil der Fit-Sinus wahlweise vorn oder hinten nicht ins Signal passt.

^^^^^^^^^ Auflösung!

Die Information über die wahre Frequenz ist durchaus noch vorhanden, die Quantisierung im Frequenzbereich (also die Einschränkung auf die Auflösung 1/T) erfolgt erst, wenn man sich bloß den größten Peak herauspickt.

Das kann man aber auch besser machen:

- Schöne Fensterfunktion übers Signal legen

- FFT

- Transformierte Fensterfunktion dranfitten

So hat man keine Probleme mehr mit Phasensprüngen und leichten Schwankungen und Rauschen und Störungen in anderen Frequenzbereichen kann man beim Fit ignorieren. Und man hat eine deutlich höhere Genauigkeit als max(FFT).

Gruß, Michael.

Klingt für mich alles so nach mp3.

- Henry

www.ehydra.dyndns.info

Offensichtlich ist ist das Totzeitglied digital nicht analog. Und für 1 Bit digital muß S/N gut genug sein. Es sei den man verwendet dither, benötigt dann aber eben höhere serielle Bitrate.

MfG JRD

Rafael Deliano :

Warum eigentlich Multiplizieren? AKF arbeite ja mit der Summe der Produkte des Signales mit denen des selben Signalen etwas später. Warum denn nicht einfach die Summe der Differenzen? (noch besser wäre wohl Gauss' Quadratsumme, aber das ist ja auch wieder * drin). Die Differenz würde mir auf den ersten Blick logischer erscheinen. Also anstelle Summe( f(t)*f(t+d) ) besser Summe( f(t)-f(t+d) ) (d=delay, t=Laufvariable)

FIFO braucht's nicht, hab ja alles im RAM.

M.

"Jens Dierks" :

Nach einer einfachen Differenzierung müsste man ja noch dieselbe Frequenz für die Grundwelle rausbekommen, oder? Damit hätte ich dann erstmal DC-Sprünge im Signal eliminiert (thx an Rafael). Die Amplitude ist ja egal, brauche ja nur die Frequenz. Wie gut klappt das wirklich mit der Fensterung? Hatte damit mal vor Jahren gespielt, war aber auch nicht so zufrieden. Lag aber vielleicht auch daran, dass das Signal ziemlich aperiodisch war. Zur Auswertung der Frequenzpeaks mit Wichtung: Gibt es da Literatur dazu? Nehmen wir mal an, ich habe 3 Peaks. Bei 49.9Hz=30%, bei 50=100%, bei 50.1=35%; also liegt die Frequenz der Grundwelle etwas oberhalb von

50Hz. Nur um wieviel?

M.

Auch eine PLL kann man rechnen.

Hoch- und Tiefpassfilter sind per Software recht einfach zu realisieren. Musst mal unter digitale Filer googeln.

Der Rechenaufwand ist erheblich geringer, als bei einer FFT oder AKF.

DC-Anteil eliminieren ist ebenfalls sehr einfach, entweder so wie ich das beschrieben habe, oder per Tiefpassfilter den Gleichanteil bestimmen und vom Nutzsignal abziehen.

Die Frage wäre noch, wie du die Signale auswerten willst, offline auf nem PC, oder quasi online auf nem leistungsschwachen Microcontroller.

Im ersten Fall kann man mit den Signalen einfach mal spielen.

Interessant wäre noch zu wissen, ob es während deiner Messdauer, d.h. über die 10000 Perioden Frequenzwechsel gibt, die du erkennen willst, oder ob du nur die mittlere Frequenz deines Nutzsignals über alle 10000 Perioden ermitteln willst.

Gruß

Stefan DF9BI

Ich habe vor ca. 20 Jahren mal einen Vortrag über eine Lösung mit Oberflächenwellenfiltern gehört. Ging dabei um die Faltung eines Signals mit einem Pseudorauschen für militärische Anwendungen / Spread-Spektrum Technik.

Habs zwar nicht so ganz verstanden, wie das auf dem Oberflächenwellenfilter gehen sill und mich auch nicht intensiv damit beschäftigt, aber damit konnte man angeblich zwei Signale in Echtzeit miteinander falten. Damit wäre dann auch eine AKF möglich.

Geht aber an der Frage des OP etwas vorbei.

Gruß

Stefan DF9BI

Kai-Martin Knaak :

Danke für den Tipp. So einen schönen Sinus wie im dem bei Dir beschrieben optischen Fall habe ich vermutlich aber nicht. Aber das hat mich auf eine Idee gebracht. Fit auf ein Rechtecksignal. Das würde sogar völlig ohne Multiplikationen auskommen.

M.

= Summe( f(t)) - Summe( f(t+d)) = Summe über den nicht überlappenden Bereich. Kann ja wohl nicht stimmen.

Tut mir ja leid, aber die Korrelation ist nunmal das Ensemblemittel über das Produkt zweier Zufallsvariablen.

Gruß Henning

Stefan Brröring :

Tja, das wird sich alles erst noch herausstellen. Also DC-Sprünge wird es bestimmt geben. Was ich mir auch noch vorstellen kann, dass die Frequenz im Messintervall langsam weglaufen könnte. Beim Fit auf Sinus oder Rechteck wäre das ein dritter oder vierter Parameter der angleichbar wäre (Frequenzdrift per Gerade oder Parabel oder gar Spline wegfitten). Auf jeden Fall wird das Signal komplett im RAM liegen. Spielen werd ich erstmal auf dem PC. Dann muss ich sehen, wo ich soviel RAM mit nem uC kriege. Vermutlich wird das ein ARM mit externem RAM. Das bedeutet dann vermutlich auch BGA's zu löten, ohje...

M.

Wenn man vorhat die Theorie so aus dem Stegreif mal umzuentwickeln überhebt man sich leicht.

Es gibt abgespeckte Variante um die Multiplikation zu umgehen:

--+-------+---------| | | | | switch |----Integrator---- | +-- *-1 --| | | | +-Kop --delay----------+

Das Signal das durch die Verzögerung läuft wird per Komparator auf 1 Bit quantisiert( notfalls mit Dither verschönern ), also nur noch +1 oder -1. Der Multiplizierer ist dann Umschalter zwischen Originalsignal und invertiertem Signal, also aufwandsarm.

MfG JRD

Henning Paul :

Ja, vermutlich zu einfach.

M.

Rafael Deliano :

Jo scheint so. :-)

Eine Gleichrichtung, wie bei meinem "Fit auf ein Rechtecksignal", allerdings hat man hier nur die Delay zu verändern und nicht Frequenz und Phase. Man wird aber nicht genauer als die Samplerate. Auch ne Überlegung wert....

M.

Du kannst sowieso nicht beliebig genau werden, die Cramér-Rao bound begrenzt die Genauigkeit Deiner Schätzung sowieso.

Schätztheorie ist "eine Wissenschaft für sich", eine "wird schon irgendwie gehen"-Lösung wird immer suboptimal sein.

Bezüglich Deines Problems fällt mir David C. Rife, Robert R. Boorstyn, "Single-Tone Parameter Estimation from Discrete-Time Observations", IEEE Transactions on Information Theory, September 1974 ein, Michael P. Fitz, "Further Results in the Fast Estimation of a Single Frequency", IEEE Transactions on Communications, Feb./March./April 1994 hatte ich auch mal gelesen.

Gruß Henning

Wie schon weiter oben geschrieben: den AKF-Koeffizienten links und rechts vom Nulldurchgang bestimmen. Der wird durch die Integration geglättet und ist damit relativ unzittrig. Aus den beiden kann man dann linear in das Sample interpolieren:

  • |\
+---+---+---+ \| +

MfG JRD

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required