Forum: Mikrocontroller und Digitale Elektronik Sinus Fit zur Frequenzmessung


von Manuel M. (manuelm)


Lesenswert?

Ich brauche für ein Schulprojekt eine genaue, +-10mHz, Messung der 
Netzfrequenz. Das Projekt basiert auf einem ATMega16/32 (ca. 10MHz). Die 
Netzfrequenz wird abgetastet und bandbegrenzt auf 45Hz-55Hz. Die 
Abtastrate nach dem Filtern beträgt ca. 110Hz-200Hz.

Aus diesen Abtastwerten soll nun die Netzfrequenz möglichst genau 
berechnet werden. Dies könnte durch ein Fit mit einem Sinus oder Cosinus 
geschehen. Meine Frage: Gibt es effiziente Algorithmen, in C oder 
Assembler, mit denen die genannten Controller innerhalb einer halben 
sekunde auf ein vernünftiges Ergebnis kommen? Von a*cos(b*x+c)+d 
(a,b,c,d => Fitparameter) interessiert mich eigentlich nur b.

Gruss Manuel

von Peter D. (peda)


Lesenswert?

Manuel Moser wrote:
> Gibt es effiziente Algorithmen, in C oder
> Assembler, mit denen die genannten Controller innerhalb einer halben
> sekunde auf ein vernünftiges Ergebnis kommen?

Miß die Dauer von 25 Perioden, Kehrwert bilden, fertsch.


Peter

von Benjamin S. (recycler)


Lesenswert?

Wenn das signal sauber tiefpassgefilter ist, dann musst du ja nur die 
Nulldurchgänge detektieren. Dann hast du die Periodendauer.

1. Mal: start
2. Mal: halbe Periode
3. Mal: ganze Periode
4. Mal: 1,5 Perioden
usw.

von Michael L. (Gast)


Lesenswert?

Hallo Manuel,

die theoretische Grenze der Meßgenauigkeit ist die sogenannte 
Cramer-Rao-Grenze. Um genau zu werden, benötigst Du
- ein niedriges Signal-zu-Rausch-Verhältnis (SNR); hierzu dient die
  Filterung
- eine lange Meßdauer (ist bei Dir vorgegeben, muß aber evtl. verlängert
  werden, wenn es nicht reicht) und
- möglichst viele Abtastpunkte (ist bei Dir auch vorgegeben)

Die Anzahl der Abtastpunkte hat normalerweise einen weniger gravierenden 
Einfluß auf die Meßgenauigkeit als das SNR und die Meßdauer. Mit 110 Hz 
liegst Du aber nur sehr knapp über der doppelten Signalfrequenz.

(Die 110Hz reichen dicke aus. Schließlich ist die Abtastfrequenz 11x 
größer als die Bandbreite. Aber Mischen und Unterabtastung sind 
eigentlich kein Schulstoff.)

Ich schlage vor, daß Du auf dem AVR eine Fast Fourier Transformation 
(FFT) implementierst.

Du trägst zunächst den Betrag der FFT über der Frequenz auf, d. h.
abs(FFT(s)) über der f-Achse.

Da die f-Achse nur aus endlich vielen Punkten besteht, sieht es zunächst 
so aus, als könntest Du die Signalfrequenz nicht richtig bestimmen.

Du erhältst beispielsweise Frequenzwerte 49 Hz, 50 Hz, 51 Hz ..., aber 
eben nicht die tatsächliche Signalfrequenz 50.01 Hz.

Eine kleinschrittigere Unterteilung der Frequenzen bekommst Du dadurch, 
daß Du eine höhere Abtastfrequenz oder ein längeres Signal benutzt. Das 
solltest Du zunächst nutzen. Doch die Schrittweite bleibt trotzdem 
endlich.

Eine unendlich feinschrittige Unterteilung erreichst Du durch eine 
Interpolation: Wenn Du die FFT durchgeführt hast, nimmst Du die drei 
höchsten nebeneinanderliegenden Punkte von abs(FFT) und interpolierst 
sie mit einer Parabel: ax^2 + bx + c. Du hast drei Unbekannte a, b und c 
und drei Bekannte (die drei Punkte). Durch Einsetzen bekommst Du ein 
lineares Gleichungssystem, mithilfe dessen Du a, b und c bestimmen 
kannst.

Der Peak der Parabel liegt bei Deiner Signalfrequenz. Er läßt sich 
analytisch bestimmen:

d/dx  (ax^2+bx+c) = 2ax + b = 0

<==> x = -b/(2a)


Um das Verfahren vorher zu testen, empfehle ich Dir das Programm GNU 
Octave bzw. die kommerzielle Variante Matlab.
Dich interessieren vor allem die Befehle:
- fft               (Fouriertransformation)
- interp1           (komfortable Interpolation)
- find              (um die Position des Maximums zu suchen)
- polyval/polyfit   (Polynomfit)

Um Rauschen zu simulieren, evtl. noch awgn (add white gaussian noise).



Gruß,
 Michael

von Manuel M. (manuelm)


Lesenswert?

@Peter Dannegger
Ja, das ist auch eine Lösung die ich in Betracht ziehe. Für eine solche 
Messung müsste ich jedoch die ganze Signalaufbereitung Analog machen, 
weil ich sonst durch die Abtastung zu wenig Genauigkeit habe, und 
zusätzlich das Problem von Störungen wenn ich keine starkes Filter habe. 
Da der Mikroprozessor neben der Frequenzmessung nur sehr wenig zu 
rechnen hat, wäre natürlich eine digitale Lösung, Filterung und Messung, 
des Problems schöner, da weniger Schaltungsaufwand nötig ist.

@Benjamin S.
Da das Bandpassfilter digital ist, wäre die Nulldurchgangdetektierung zu 
ungenau, da nur 110-200 Abtastwerte pro Sekunde vorhanden sind.

Manuel

von Benjamin S. (recycler)


Lesenswert?

Mittelung hat noch gefehlt, dann bist du bei Petersansatz :)

von Manuel M. (manuelm)


Lesenswert?

@Michael
Danke für den ausführlichen Beitrag. Die Fouriervariante hab ich auch 
schon in Betracht gezogen aber anschliessend verworfen aufgrund 
Ungenauigkeit und Aufwand. Dies jedoch zu Unrecht wie es scheint. Was 
ich mir hier jedoch noch überlegt habe ist, dass ich mit 450Hz Abtaste, 
dann Filtere und anschliessend jeden zehnten Abtastwert nehme und so 
eine Abtastrate von 45Hz habe. Durch die daraus folgende Unterabtastung 
befindet sich mein Band dann zwischen 0 und 10Hz. Dadurch würde ja der 
Aufwand der Fouriertransformation erheblich sinken. Ist dies 
realistisch? Das Bandpassfilter wäre in diesem Falle natürlich höherer 
Ordnung. Eine weitere Frage ist noch, wie kann man den Rechenaufwand der 
FFT auf dem Controller abschätzen?

Manuel

von 1234 (Gast)


Lesenswert?

Eine Fouriertrafo ist ein Witz, um eine einzelne Frequenz zu finden.

von Michael L. (Gast)


Lesenswert?

Hallo Manuel,

zunächst nochmal zur theoretischen Grenze:

Auf Seite 298 in
http://books.google.de/books?id=W_vTbYbpNx4C&pg=PA290&dq=cramer+rao+laser+doppler&lr=&client=firefox-a#PPA298,M1

ist hergeleitet, daß die maximal erreichbare Frequenzgenauigkeit für 
einen reinen Sinus durch

sigma_f^2 = 3 f_s^2 / ( pi^2 N (N^2-1) * SNR )

gegeben ist. N ist soweit ich das sehe die Anzahl der Abtastpunkte.

Wenn Du das SNR (nach der Filterung) ungefähr bestimmst, kannst Du das 
ja mal einsetzen. Ich habe leider kein Bauchgefühl dafür, ob bei einem 
typischem SNR der Netzspannung und 25 Signalperioden 10 mHz ein 
realistischer Wert sind.

Setzen wir also mal Werte ein, die in die Größenordnung kommen könnten:

SNR = 20 dB = 100     (nicht ganz gut, aber auch nicht ganz schlecht)
N   = 0.5s * 200/s = 100 Abtastpunkte
fs  = 200 Hz

sigma_f = sqrt{ 3 * 200^2 / 3.14^2 / 100^4 } = 11 mHz

Du bist also evtl. tatsächlich schon in der Nähe der Meßgrenze.


> Danke für den ausführlichen Beitrag. Die Fouriervariante hab ich auch
> schon in Betracht gezogen aber anschliessend verworfen aufgrund
> Ungenauigkeit und Aufwand. Dies jedoch zu Unrecht wie es scheint. Was
> ich mir hier jedoch noch überlegt habe ist, dass ich mit 450Hz Abtaste,
> dann Filtere und anschliessend jeden zehnten Abtastwert nehme und so
> eine Abtastrate von 45Hz habe. Durch die daraus folgende Unterabtastung
> befindet sich mein Band dann zwischen 0 und 10Hz. Dadurch würde ja der
> Aufwand der Fouriertransformation erheblich sinken.
Wenn Du mit 45 Hz abtastest, erhältst Du beim Abtasten einen Sinus von 5 
Hz+x, wobei x die Abweichung der Netzfrequenz von 50 Hz ist.

Sagen wir einmal konkret, Du hast f=50.01 Hz. Dann bekommst Du nach dem 
Runtermischen 5.01 Hz.
Wenn Du eine halbe Sekunde mißt, hast Du 2.5 Periodendauern. Das sind 
2.5 * 9 Abtastpunkte, also 22 Abtastpunkte. Das wird glaube ich nicht 
einfacher.

> Ist dies
> realistisch? Das Bandpassfilter wäre in diesem Falle natürlich höherer
> Ordnung. Eine weitere Frage ist noch, wie kann man den Rechenaufwand der
> FFT auf dem Countroller abschätzen?
Da kann ich Dir leider nicht bei helfen. Ich programmiere zu wenig auf 
µC. Aber die paarhundert Abtastpunkte, die bei Dir anfallen, wird der 
Chip schon noch verrechnet kriegen. Oder mußt Du kontinuierlich messen?


Es gibt noch eine weitere Methode, die Frequenz zu bestimmen. Sie 
funktioniert immer recht gut, wenn das SNR groß und das Signal 
schmalbandig ist:

Du benötigst dazu die Phase phi Deines Signals. Dann lautet die 
Momentanfrequenz w = 2*pi*f Deines Signals:

w = d(phi)/dt

Dein Ziel ist es also, die Phase des Signals zu bekommen, sie abzuleiten 
und zu mitteln.

Die Phase phi bekommst Du über die Hilberttransformation, die Du in 
Matlab über hilbert(s) berechnest.
Die Hilberttransformation nimmt sich das Signal s und dreht dreht jede 
Spektralkomponente um 90°. (Sie läßt sich auf dem µC über eine FFT, die 
Multiplikation mit j und die inverse FFT implementieren)

Das Ergebnis:
hilbert(s) = s + j * s_(gedreht)   ; j: imaginäre Einheit

ermöglicht es Dir, mithilfe von arctan(...) bzw. angle(...) die Phase 
des Signals zu messen, abzuleiten und zu mitteln.

Das Verfahren klappt auch, wenn Du nur ein Signal mit einer halben oder 
viertel Periodendauer hast.




Gruß,
  Michael

von Michael L. (Gast)


Lesenswert?

> Eine Fouriertrafo ist ein Witz, um eine einzelne Frequenz zu finden.
Sicherlich denkst Du an Nulldurchgangszähler o. ä.

Vielleicht solltest Du über den Witz nochmal nachdenken. Du begreifst 
ihn schlagartig, wenn Du nur wenige Periodendauern oder hohe 
Genauigkeitsanforderungen hast. Dann geht es nicht mehr mit Hau-Ruck, 
1234, 0815 oder gar 4711.

von Peter D. (peda)


Lesenswert?

Manuel Moser wrote:
> @Benjamin S.
> Da das Bandpassfilter digital ist, wäre die Nulldurchgangdetektierung zu
> ungenau, da nur 110-200 Abtastwerte pro Sekunde vorhanden sind.

Warum willst Du durch eine digitale Filterung Informationen wegschmeißen 
und dann mühsam hinterher wieder reinrechnen (falls das überhaupt so 
genau geht)?

Periodendauermessung ist weit verbreitet und auch zuverlässig.
Du willst 50Hz auf 0.01Hz genau messen, also brauchst Du eine Auflösung 
von 1:5000.
Wenn Du über 50 Halbwellen mißt, mußt Du also den Nullduchgang nur auf 
1% genau detektieren und das ist leicht machbar.

Natürlich nicht nach digitaler Filterung, da ist dann der exakte 
Zeitpunkt des Nulldurchgangs verloren, da der Sinus im Nulldurchgang 
sehr steil verläuft.
Was aber hilft, ist eine Klippung (Begrenzung), dann hast Du quasi 
Rechteck.


Peter

von Peter D. (peda)


Lesenswert?

Du kannst ja hiermit überprüfen, ob Deine Messung stimmt:

http://www.ucte.org/

Oder gleich den Wert übernehmen.


Peter

von Ulrich (Gast)


Lesenswert?

Die Fouriertransformation ist für das bestimmen einer einzelen Frequenz 
ziehmlich schlecht geeignt, denn man bekommt nur dirktet Frequenzen die 
hier auch noch reativ weit auseinander liegen.
Wenn man die Möglichkeit hat auf das analoge Signal zuzugreifen, wäre 
das messen der Nulldurchgänge eine einfache methode. Dann aber am besten 
nicht nur 2, sondern so viele wie die Messzeit hergibt, und dann die 
Anpassung einer Geraden an die Zeiten. Das ist normalerweise auch noch 
Schulstoff.
Für die Geradenanpassung gibt es fertige Formeln, ist also wirklich 
nicht schwer.

Wenn man aber nur die relativ langsame Abtastung hat, dann ist die 
Methode der Wahl das anpassen erner Sinusfunktion nach dem Kriterium 
einer minimalen summer der Quadrate der Differenzen. So wie schon in der 
ursprünglichen Frage. Eine direkte Formel gibt es dazu nicht, sondern 
man muss ein iteratives Verfahren nutzen. Man verbessert also 
schrittweise die Schätzwerte für die Amplitude, Frequenz und Phase (bzw. 
die 2 te Amplitude).
Eine Vereinfachung die man dabei machen kann ist die Funktion als Summe 
von Sinus und Cosinus Anteil zu schreiben und nicht mit der Phase. 
Dadurch wird die Funktion in mehr Parametern linear, und das iterative 
Verfahren geht einfacher. Nur die Frequenz bleibt als nichtlinearer 
Parameter.

Zur Lösung gibt es verschiedenen Iterationsverfahren.

von Rainald K. (Firma: DEUTA-WERKE GmbH) (rainald62)


Lesenswert?

Die von Michael zitierte Formel für die Cramer-Rao-Grenze gilt für 
"Sinus plus weißes Rauschen". Die Störungen der Netzspannung sind aber 
kein Rauschen. Insbesondere sind die Fehler (Differenzen zum Sinus) der 
einzelnen Abtastungen untereinander nicht unkorreliert. Störungen durch 
Phasenanschnittsteuerungen z.B. wiederholen sich in jeder Periode und 
der Offset (Parameter d im ersten Posting) ist gar konstant.

Eine Vorverarbeitung kann Störungen unterdrücken, wenn sie geeignet ist. 
Ungeeignete Vorverarbeitung kann die Auswirkung von Störungen auf das 
Ergebnis verstärken, obwohl das vorverarbeitete Signal "besser" 
aussieht. Kurze Spikes z.B. sollte man im Zeitbereich entsorgen, nicht 
erst mit einem Bandpass über viele Samples verteilen (aber der ist ja 
u.U. nicht zu umgehen).

Für die Situation nach dem Bandpass ist es unangebracht N = 100 
Abtastpunkte in die Formel einzusetzen, denn bei einer Bandbreite von 10 
Hz und einer Messzeit von 0,5 s hat man effektiv nur 5 statistisch 
unabhängige Werte. Die von Michael vorgeschlagene Unterabtastung mit 45 
Hz bewirkt also keinen Informationsverlust (vorausgesetzt, das 
Diskretisierungsrauschen ist vernachlässigbar). Unterabtastung mit 22 Hz 
würde auch reichen.

Nicht-statistische Fehler als weißes Rauschen in die Formel einzusetzen, 
ergibt eine zu pessimistische Grenze für die erreichbare Genauigkeit. 
Die echte Grenze zu erreichen setzt aber eine Auswertungsmethode voraus, 
die die charakteristischen Fehler des Signals berücksichtigt. Jede 
Auswertungsmethode, die lediglich von einem perfekten Sinus plus weißem 
Rauschen ausgeht, wird mehr oder weniger stark von Imperfektionen 
gestört. Das betrifft auch den von Ulrich vorgeschlagenen nichtlinearen 
Fit auf kleinste Fehlerquadratsumme (NLLS). Dann erreicht man nicht 
einmal die pessimistische Grenze.

Bei der Beurteilung von Auswertungsmethoden helfen numerische 
Experimente mit plausibel simulierten Störungen. In der Literatur werden 
oft nur gaußverteilte Fehler simuliert. Das trifft auch auf die Trilogie 
ccrma.stanford.edu/~abemoto/abe-m114 -m115 -m116.pdf zu, die Ulrichs 
These widerlegt, die FFT wäre schlecht geeignet: Die Abstände zwischen 
den diskreten Frequenzen kann man verringern, indem man die Messwerte 
mit Nullen ergänzt - nicht nur auf die nächste Zweierpotenz. Die elf 
Werte bei Unterabtastung mit 22 Hz könnte man auf 64 Werte ergänzen.

Wenn man weiß, dass das Ergebnis stets zwischen zwei oder drei 
bestimmten Fourier-Komponenten liegt, ist deren direkte Berechnung 
(siehe Goertzel-Algorithmus) effizienter als per FFT.

Was das Schülerprojekt betrifft, hoffe ich sehr, dass der 
Digitalisierung ein steiler analoger Tiefpass vorgeschaltet ist. Sonst 
landet die Abtastung sporadisch auf einem Spike und dieser grob falsche 
Messwert repräsentiert dann ein gesamtes Abtastintervall :-(

Gruß
  Rainald

von Kai Klaas (Gast)


Lesenswert?

Hallo Manuel,

ich finde es immer witzig, wenn von der "Netzfrequenz" gesprochen wird. 
Diese gilt nicht für eine Einzelschwingung, sondern immer nur gemittelt 
über eine langen Zeitraum. Dies liegt einfach daran, daß es unzählige 
Schaltvorgänge im Netz gibt, nach denen die Netzfrequenz erst neu 
"einschwingen" muß. Die Elektrizitätswerke garantieren übrigens die 
Einhaltung der Netzfrequenz auf einen bestimmten Toleranzbereich, 
weswegen netzsynchronisierte Uhren sehr sehr genau gehen, wenn man mal 
Netzausfälle außer Acht läßt, weil sie eben über einen sehr langen 
Zeitraum die Netzfrequnz mitteln. Bei einer Einzelmessung der 
Netzfrequenz über nur eine Periode kann man aber erhebliche Torlanzen 
feststellen.

Beim Sinusfit muß man ebenfalls aufpassen. Bei kurzzeitigen Änderungen 
der Netzspannung kann der Sinusfit erhebliche Fehler ergeben, sowohl 
hinsichtlich der Amplitude als auch der Frequenz. Darüber hinaus führen 
auch Ungenauigkeiten des ADC zu erheblichen Meßfehlern von Periode zu 
Periode.

In jedem Fall sind Frequenzmessungen am Netz nur sinnvoll, wenn über 
etliche Perioden gemittelt wird. Deswegen finde ich die Methode von 
Peter am sinnvollsten: Man bestimmt die Zeitdauer von insgesamt 25 
Perioden (anhand der Nulldurchgänge) und bestimmt daraus die mittlere 
Netzfrequenz. Den so erhaltenen Mittelwert der Netzfrequenz würde ich 
dann in einen Moving Average Filter geben, der alle 0,5sec einen neuen 
Mittelwert zur Anzeige bringt aber gleichzeitig über 16, 32 oder noch 
mehr solcher Einzelmessungen mittelt.

Kai Klaas

von Michael (Gast)


Lesenswert?

Leute die nur die Nulldurchgänge Zählen bauen Radiowecker die in 
Industrienetzen mit zu vielen Oberschwingungen schneller laufen.

Mfg Michael

von Kai Klaas (Gast)


Lesenswert?

Hallo Michael,

>Leute die nur die Nulldurchgänge Zählen bauen Radiowecker die in
>Industrienetzen mit zu vielen Oberschwingungen schneller laufen.

Kommt natürlich darauf an, wie du die Nulldurchgänge feststellst...

Kai Klaas

von Rainald K. (Firma: DEUTA-WERKE GmbH) (rainald62)


Lesenswert?

Stellen wir uns mal vor, die Messung der Netzfrequenz wäre nicht 
just-for fun, sondern Teil einer Regelschleife bei einem 
Energieversorger. Ob dann ein Tiefpass zur Glättung mit einer 
Zeitkonstanten von tau = 8, 16 oder noch mehr Sekunden angemessen ist?

Im dynamischen Fall, wenn also der Input der Glättung nicht um einen 
konstanten Wert x statistisch streut, sondern um ein x(t), bewirkt ein 
zur Glättung eingesetzter Tiefpass durch sein Systemmodell "x = 
konstant" eine Verzögerung von tau - für Frequenzen in seinem 
Durchlassbereich wohlgemerkt.

Geeigneter ist ein Kalman-Filter, mit dem angemessenere Systemmodelle 
verwendet werden können, z.B. "dx/dt = konst". Sie können zudem den 
voraussichtlichen Effekt der Steuerungseingriffe auf den Systemzustand 
für dessen nächste Schätzung berücksichtigen.

Gruß
  Rainald

von eh (Gast)


Lesenswert?

Wenn man die Netzfrequenz filtert, dann will man die harmonischen 
weghaben, dh 100Hz, 150Hz, 200Hz, usw. Dh das Filter kann bei 50Hz mit 
dem abschneiden beginnen. Dh die Verzoegerung ist um die 20ms.

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