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
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
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.
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
@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
@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
Eine Fouriertrafo ist ein Witz, um eine einzelne Frequenz zu finden.
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
> 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.
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
Du kannst ja hiermit überprüfen, ob Deine Messung stimmt: http://www.ucte.org/ Oder gleich den Wert übernehmen. Peter
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.
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
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
Leute die nur die Nulldurchgänge Zählen bauen Radiowecker die in Industrienetzen mit zu vielen Oberschwingungen schneller laufen. Mfg Michael
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.