Hallo
ich würde gerne die Phasenverschiebung von zwei Sinussignalen mit einem
uC messen (am liebsten AVR)....
Die Umwandlung erfolgt 1. durch Optokoppler bzw. durch OPV und einem
XOR-Gatter
Die Messgenauigkeit soll 1uS betragen
is das überhaupt möglich? oder gibt es da einfachere analoge Lösungen?
Danke und herzliche Grüße
Wie die Signale Vorliegen ist irgendwie nicht ganz klar. Da könnte es
schon schwer werden das die Flanken genau erkannt werden. Eine Zeit
mit 1 µs Genauigkeit zu messen ist für einen µC kein wirklich großes
Problem. Die meisten AVRs haben eine ICP Einheit um damit ein Zeit zu
messen, einige größere haben auch 2 ICP Einheiten - damit wäre es am
Einfachsten. Sonst müsste man das ganze für den einen Eingang in
Software mit einem Interrupt realisieren. Das geht für 1 µs auch, wenn
auch nicht ganz so einfach.
Es gibt auch eine relativ einfache analoge Lösung mit dem Phasendetektor
aus eimem PLL IC wie 74HC4046. Da bekommt man dann aber eher die Phase
und nicht direkt die Verzögerung heraus.
Alternativ kannst Du auch 2 identische Schmidt-Trigger verwenden (z.Bsp.
Inverter mit Schmidt-Trigger Verhalten) und dahinter ein XOR-Gatter
verwenden. Dieses ist dann immer High am Ausgang, wenn die
Eingangssignale unterschiedlich sind. Wenn Du eine Phasenverschiebung
von 0 hast, so hast Du am Ausgang immer low. Bei einer
Phasenverschiebung von 180° hast Du am Ausgang immer High. Dazwischen
erhältst Du ein PWM-Signal mit einem Tastverhältnis proportional zum
Phasenversatz.
Da die Ausgangsspannungen des Gatters sicherlich nicht genau bei 0 und 5
Volt sind, ist es eventuell sinnvoll einen Begrenzerverstärker nach zu
schalten, die Eingänge regelmäßig zu tauschen (damit Du einmal das
Signal, dann 180°-Das Signal bekommst), oder einen Gatter daneben als
Referenz zu verwenden.
SNR schrieb:> Einfach beide Signale abtasten und die Kreuzkorrelation berechnen?
Schlechte Idee, da der interne AD-Wandler die Signale nur sequentiell
abtasten kann, nicht aber parallel. Der durch die Sequenzierung
entstehende Fehler ist auch ungefähr in der Größenordnung des Messwerts.
Für die Lösung wäre ein externer AD-Wandler erforderlich und der
Rechenaufwand dieser Lösung ist für so ein einfaches Problem eigentlich
unnötig hoch.
1. Beide Signale mittels OP hoch verstärken, so dass "nahezu" ein
Rechteck entsteht.
2. Beide Rechtecksignale auf ein schnelles XOR-Gatter geben.
3. Die Länge des H-Signals ist gleich die Zeit der Phasenverschiebung,
die nun mittels µC gemessen werden kann.
4. Fertig
Hi,
das ergibt dann ja eine gewünschte Messgenauigkeit/Auflösung von 18m°.
Das ist schon extrem wenig. Messgeräte die das "wirklich" können sind
nicht billig und das baut man auch nicht einfach so. Berechne mal die
Ansteigsgeschwindigkeit des Sinus im Nulldurchgang und um wie viel Volt
sich dort die Spannung pro 1us ändert.
Wir lösen das seit längerem auch über die Kreuzkorrelation. Da bekommst
du mit relativ wenig aufwand gute Ergebnisse. Leider nicht auf 8bit uC,
außer du hast x Sekunden Zeit um die Messung auzuwerten und verwendest
externe Wandler (müssen synchron sampeln!)
Gruß
Lars
Lars schrieb:> das ergibt dann ja eine gewünschte Messgenauigkeit/Auflösung von 18m°.> Das ist schon extrem wenig. Messgeräte die das "wirklich" können sind> nicht billig und das baut man auch nicht einfach so. Berechne mal die> Ansteigsgeschwindigkeit des Sinus im Nulldurchgang und um wie viel Volt> sich dort die Spannung pro 1us ändert.
Das ist korrekt, das sieht mal wieder nach einer gewünschten Genauigkeit
aus, über die man nicht groß nachgedacht hat.
Lars schrieb:> Wir lösen das seit längerem auch über die Kreuzkorrelation. Da bekommst> du mit relativ wenig aufwand gute Ergebnisse.
Na ja das wenig Aufwand ist relativ. Vor allem wenn du mit der
Kreuzkorrelationsmethode auf die oben angegebene Genauigkeit kommen
willst. Du brauchst ne ganze Menge synchrone und genau Abtastwerte und
musst mit denen auch noch recht aufwendig Rechnen.
Wobei natürlich die Störunterdrückung bei einer Berechnung über
Kreuzkorrelation das groß Plus ist.
Das synchron sampeln ist nicht unbedingt nötig, denn die Verzögerung
beim AD im µC ist konstant und bekannt. Man kann die also raus rechnen.
Wenn man ein kleine Verzögerung hat, wäre aber eine gleichzeitige
Abtastung schon besser.
Für die volle Kreuzkorrelation reicht ein 8 Bit µC eher nicht. Für ein
paar Punkte, z.B. um den Nulldurchgang sollte es aber reichen. Da man
nur eine bekannte Frequenz hat, könnte man die Auswertung auch etwas
anders machen, ggf. auch noch mit dem 8 Bit µC: die beiden Signal für
sich analysieren und die Phase zu einer gedachten internen Ref. per
Fouriertransformation (keine FFT, sondern zu Fuss weil man nur 2 Punkte
braucht) bestimmen.
Im Prinzip sollte sich die Aufgabe auch mit der Soundkarte am PC lösen
lassen. Gegen Drift im Analogen Eingangsfilter könnte man ggf. die
Kanäle einmal per Relais tauschen, wenn man etwas Zeit hat. Für den PC
ist die Korrelationsfunktion keine Herausforderung mehr.
Die eher analoge Lösung mit genauer Messung von nur den Nulldurchgängen
hängt davon ab wie viele Störungen man im Signal hat. Direkt mit der
Wellenform von der Netzspannung wird das schon sehr schwer. Da braucht
man dann erst eine Filterung um die Oberwellen zu entfernen und kann
dann möglichst alle Flanken auswerte. Die Schwierigkeit liegt darin den
Filter Driftarm zu bekommen, der Teil mit dem µC ist dagegen eher
Einfach.
_Gast aus HL_ schrieb:> Schlechte Idee, da der interne AD-Wandler die Signale nur sequentiell> abtasten kann, nicht aber parallel
Das kommt drauf an was für einen uC Du hast. Manche haben 2 SAH drin,
manche auch gleich mehrere AD-Wandler.
Udo Schmitt schrieb:> ROFL. Klasse Idee mit einem 8Bit µC :-)
50Hz mit dementsprechender Überabtastung bekommt selbst ein 8-Bitter
hin.
Timer wo die ADCs triggert über Interrupt. 2x Ringpuffer. Nachdem der
Puffer voll ist die Berechnung durchführen. In der Zeit braucht man ja
nicht unbedingt weiter Sampeln.
Wobei er nicht explizit 8-Bit-uC gesagt hat. Kann also auch ein AVR32
sein.
Gruß
Ulrich schrieb:> Für die volle Kreuzkorrelation reicht ein 8 Bit µC eher nicht. Für ein> paar Punkte, z.B. um den Nulldurchgang sollte es aber reichen.
Hmm, stimmt eigentlich. Solange die maximal zu erwartende Verschiebung
deutlich innerhalb des Abtastfensters ist würde das doch reichen. Aber
wenn ich eine Genauigkeit von etwa 1µs erreichen will muss doch meine
Abtastrate mindestens 2MSamples/s sein (Stimmt doch?), und wenn die
Phasenverschiebung größer werden kann dann brauche ich entsprechend
viele Messwerte oder muss die Phasenverscheibung entsprechend ungefähr
kennen, so daß ich nur zwei Ausschnitte sample mit entsprechendem
Versatz und die KK nur für einen Teilbereich berechne.
Ulrich schrieb:> Im Prinzip sollte sich die Aufgabe auch mit der Soundkarte am PC lösen> lassen.
Wie willst du damit auf eine zeitliche Auflösung im µs-Bereich kommen?
Die Abtastpunkte müssen nicht so nahe zusammenliegen. Zum einen gibt der
AD Wandler ja nicht nur 0 und 1 aus, sondern auch zwischenwert. Zum
anderen wird man deutlich mehr als 1 Periode messen und kann
entsprechend mitteln für mehr Auflösung. Das gilt für den AD Wandler im
µC und auch die Soundkarte.
Wenn man den AD Wandler nutzt geht es ja gerade nicht darum zu sehen
zwischen Elchen Sampeln der Nulldurchgang ist, sondern man nutzt die
ganze Wellenform aus. Einfach nur der Nulldurchgang wäre die andere
Methode mit einem analogen Filter und dann einer klassischen
Zeitmessung, z.B. per ICP.
Wenn man sich die Auswertung so vorstellt, das man vom Signal den Sinus
und Cosinus Anteil bestimmt, muss man für 1 µs in der Zeit, bzw,, 0.018
Grad, den kleineren Teil auf etwa 13 Bit genau bestimmen. Das ist keine
so besonders hohe Anforderung und sollte auch mit nur 8 Bit Auflösung
des ADs noch ganz gut gehen, weil man je relativ viele Samples (z.B.
5000 pro Sekunde) mittelt. Man braucht aber schon ein bisschen Zeit (ein
paar Sekunden ?) für die Messung. Eine Wichtige Frage ist dabei noch wie
viele Störungen das Signal hat - also ob die 50 Hz aus dem Netz kommen,
oder von einem extra Funktionsgenerator.
Warum einfach, wenn es auch kompliziert geht?
ich würde an beide Signalquellen einen simplen Komparator anschließen
(MAX999 oä.) und damit nen Counter starten bzw. stoppen oder ne
angeschlossene Captureeinheit triggern, kurzum die Zeitunterschiede der
Nulldurchgänge digital erfassen. Immerhin kann man mit gängigen uC mit
Takten im 10 MHz-Bereich Zeiten mit 100 ns auflösen. Sollte doch
ausreichen. Und wenn man dann noch die Ergebnisse von - sagen wir mal 10
Messungen - überlagert, also Mittelwert bildet, dann sollte der Einfluß
von Fremdsignalen auch wegzukriegen sein.
W.S.
W.S. schrieb:> ich würde an beide Signalquellen einen simplen Komparator anschließen
Hast du dir das mal ausgerechnet?
Die Anstiegsgeschwindigkeit des Sinussignals im Nulldurchgang beträgt
U' = 2*pi*f*Us
Bei einem Singal mit 50Hz und 1V Uspitze gibt das 314V pro Sekunde. Oder
eben 314uV pro Sekunde. 314uV genügen zwar um einen Komparator zu
kippen, aber du hast bestimmt noch Rauschen etc. auf dem Signal und dann
Schaltet der Komparator im Nulldurchgang unzählige male bis er sich
endlich entschieden kann wohin er will. Klar kann man das Signal
verstärken und begrenzen, dass der Nulldurchgang viel steiler wird, aber
dann kommt die Phasenverschiebung der Verstärker wieder dazu. Ok die
kann man herausrechnen wenn sie konstannt bleibt, aber bleibt sie das?
Ist sie Amplitudenabhängig? (Und das wird sie sein!)
Ohne jetzt werbung machen zu wollen, nur als Vergleich:
http://www.omicron.at/fileadmin/user_upload/files/pdf/en/CMC-256plus-Technical-Data-ENU.pdf
Das hier beschriebene Gerät kosten so viel wie ein Mittelklassewagen und
erreicht eine Phasengenauigkeit von 5m°. Die Messgeräte im Kalibrierraum
sind gerade so im Stande diese Genauigkeit zu messen und sind mit die
Besten auf dem Markt. (Messung über Kreuzkorrelation). Mit einer
Komparatorlösung kommst du auf ca. 100m° und dann ist ziemlich bald
schluss.
Ich würde die Lösung mit AD Wandler vorschlagen. Etwas Mathematik mit
komplexen Zahlen und dann wird das schon.
Wie schon oben gesagt wurde, Kreuzkorrelation oder FFT der Signale sind
der zielführende Weg. Mit einem AVR wird das vermutlich nix, eher DSP
oder zumindest ARM Cortex. Als ADC würd ich einen Audio Typ nehmen, die
haben meist 2 Kanäle, die synchron sampeln.Die Abtastrate muss aufgrund
der Mittelungseigenschaften von FFT/Kreuzkorrelation nicht extrem hoch
sein. Die üblichen 192kHz sollten völlig ausreichen. Die analoge
Signalaufbereitung sollte so einfach und qualitativ hochwertig wie
möglich sein (Phasenverschiebungen).Hab das mal für Leistungsmessung am
Netz gemacht und war dann bei 10,24kHz Abtastrate doch auf ca. 0,1°
reproduzierbar.
Grüsse
der Neuling schrieb:> is das überhaupt möglich? oder gibt es da einfachere analoge Lösungen?
Deinem Namen zufolge hast Du vielleicht noch Probleme mit Auflösung und
Genauigkeit, mit Anspruch und Wirklichkleit.
Eine einfache Möglichkeit, Deine Signale zu bewerten findet sich in der
Codesammlung unter Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88".
Mit der Schaltung kannst Du die Phasenverschiebung messen und sehen, wie
stabil die Signalaufbereitung arbeitet. Unter Umständen siehst Du, dass
auch eine geringere Genauigkeit völlig ausreichend ist.
Wenn man schon den Aufwand treibt und die Kreuzkorrelation ausrechnet,
dann sollte man danach nicht nur das Maximum als größten Einzelwert
suchen, sondern besser da noch einmal eine Sinusfunktion anpassen, oder
wenigstens eine Parabel in der Nähe des Maximums.
Wenn man einen nähungsweisen Sinus Signal mit bekannter Frequenz hat,
kann man auch gleich einen Sinus an die beiden Signal anpassen. Das geht
auch bei nicht genau bekannter Frequenz noch recht schnell und liefert
dann auch ein recht genaues Ergebnis. Die Korrelationsfunktion braucht
man eigentlich nur, wenn man die Signalform nicht kennt und man eine
Verzögerung bestimmen will.
Die Kreuzkorrelation kannste fuer diese Anwendung in die Tonne kloppen.
Die Anforderungen sind ein ueblicher akademischer Furz. Bei 20ms
periodendauer ist 1us gleich 50ppm. Die Kreuskorrelation hat ein extrem
flaches Maximum fuer Phasengleichheit eines Sinus. Was besser ist, ist
die Kreuskorrelation mit einem 90 grad verschobenen Sinus. Den erhaelt
man mit einem PLL, der mit dem Netz mitlaeuft. Schade, wenn das
Netzsignal nicht exakt Sinus ist. dh man muesste erst mal einen
Oberwellenfilter drueberlassen.
Ich wuerd die Kreuzkorrelation durch eine Multiplikation und langsamem
Tiefpass erstzen.
Pico Oschi schrieb:> Die Kreuskorrelation hat ein extrem> flaches Maximum fuer Phasengleichheit eines Sinus. Was besser ist, ist> die Kreuskorrelation mit einem 90 grad verschobenen Sinus.
Reden wir über unterschiedliche Dinge? Die „Flachheit“ des Maximums
ändert sich doch nicht mit der Phasenverschiebung der beiden Signale.
Auch wenn es wie ein akademischer „Furz“ klingt. Bei AKF und KKF bleibt
das periodische Signal absolut gleich nur die Amplitude ändert sich. Bei
der AKF geht die Phase verloren (ist immer ein Cosinus) und bei der KKF
ist das periodische Signal genau um die Phasendifferenz verschoben.
Man muß ja auch nicht das Maximum der KKF nehmen, es geht ja auch der
Nulldurchgang.
Wie schon oben geschrieben: wenn man die Form des Signals vorher kennt,
bringt einem die Korrelation keinen wirklichen Vorteil - und wenn dann
sollte man danach auch die ganze Kurve und nicht nur das Maximum oder
ersatzweise den Nulldurchgang auswerten. Wobei der Nulldurchgang auch
nur geht, wenn man die Signalform genau kennt.
Hier soll aber die Signalform bekannt sein (Sinus, jedenfalls
näherungsweise). Wenn es um so etwas die Dielektrische Verluste im
Medium geht, kann man eigentlich auch nur die Grundwelle gebrauchen, wie
die Verschiebung dann bei den Oberwellen ist, kann man nicht allgemein
sagen - nur eine obere und untere Grenze kann man angeben, die liegen
aber weit (d.h. Faktor 4 und mehr) auseinander. Entsprechend stören die
Oberwellen im Signal nur und sollten auch bei der Korrelationsfunktion
nicht genutzt werden.
Wenn ich zwei orthogonale Funktionen kreuzkorreliere, dann erhalte ich
Null. Deswegen ist es einfacher die Phasenverschiebung zweier fast 90
verschiedener Funktionen zu messen wie wenn sie in der Phase fast gleich
sind. Wenn man den vollen Phasenwinkel Bereich messen will muss man
somit simultan mit Sin & Cos multiplizieren und dann den Quotienten
nehmen.
Und sinnvollerweise nimmt man nicht das versaute Netz, sondern
generierte saubere Spannungen.
Udo Schmitt schrieb:> ROFL. Klasse Idee mit einem 8Bit µC :-)
Da spricht der Fachmann. Für die KKF reicht eine Multiplikation mit
+/-1, d.h. eine simple Invertierung des Signals. Das sollte wohl auch
ein 8-Bit µC oft genug hinbekommen.
Pico Oschi schrieb:> Wenn ich zwei orthogonale Funktionen kreuzkorreliere, dann erhalte ich> Null.
Das ist mathematisch unsauber formuliert und deshalb die
Missverständnisse.
Das Skalarprodukt zweier orthogonaler Vektoren ist der Nullvektor.
Wenden wir dieses Gesetz auf unsere zwei Funktionen an so folgt daraus,
dass das (Skalar)Produkt zweier orthogonaler Funktionen Null ergibt. Das
möglicherweise umgangssprachlich verwendete Wort „korreliere“ meint also
das Skalarprodukt. Die Kreuzkorrelationsfunktion ist jedoch anders
definiert. Die Kreuzkorrelation zweier orthogonaler harmonischer
Funktionen gleicher Frequenz ist wiederum eine harmonische Funktion
derselben Frequenz mit einer Phasenverschiebung. Die Phasenverschiebung
entspricht genau der Phasendifferenz der Ursprungfunktionen
Ulrich schrieb:> Wie schon oben geschrieben: wenn man die Form des Signals vorher kennt,> bringt einem die Korrelation keinen wirklichen Vorteil
Man darf auch etwas über den Tellerrand schauen. Die Auto- und
Kreuzkorrelation dürfen natürlich überall dort angewendet werden wo sie
mathematische Vorteile versprechen. Dazu sollte man jedoch genau ihre
Eigenschaften kennen. Es lassen sich schnell unzählige Beispiele für den
Einsatz der Auto- und Kreuzkorrelation bei bekannten Signalen
(Signalformen) finden.
GPS – Signal der einzelnen Satelliten bekannt, KKF berechnet die
Signallaufzeit
Mode-Pickung der Modalanalyse – Signalform bekannt AKF und KKF schätzen
die Übertragungsfunktionen
Werner schrieb:> Da spricht der Fachmann. Für die KKF reicht eine Multiplikation mit> +/-1, d.h. eine simple Invertierung des Signals.
Offensichtlich kritisiert mich gerade ein Fachmann.
Mein Wissen ist ca. 25 Jahre alt, aber jeder Wert einer Kreuzkorrelation
ist doch die Summe aller Multiplikationen zwischen dem einen Signal un
dem anderen Signal + Tau.
Und das dürfte wohl einen 8Bit µC ordentlich beschäftigen zumindest wenn
das quasi in Echtzeit erfogen soll.
Was die Multiplikation mit +-1 betrifft darfst du mir das gerne mal
erklären.
Quelle meines Wissens: (Hänsler, statistische Signaltheorie, TH
Darmstadt)
Das Wesentlich der KK wurde hier im Übrigen meines Erachtens überhaupt
nicht erwähnt daß sich nämlich statistisch verteilte Störungen
herausmitteln.
Deswegen wird doch im Handy und Satellitenfunk KK verwendet weil man
damit ein Nutzsignal noch aus einem um Größenordnungen größerem Rauschen
herausbekommen kann.
Es gibt im übrigen Versuche mit dem man nachweisen kann daß unser Hirn
beim Hören was ähnliches macht um z.B. das Sprechen einer Person aus dem
Hintergrungrauschen (z.B. Lärm in einer Kneipe) herauszufiltern.
Udo Schmitt schrieb:> Was die Multiplikation mit +-1 betrifft darfst du mir das gerne mal> erklären.
Für mich bitte auch!
Udo Schmitt schrieb:> Das Wesentlich der KK wurde hier im Übrigen meines Erachtens überhaupt> nicht erwähnt daß sich nämlich statistisch verteilte Störungen> herausmitteln.
Genau deshalb hatte ich in meinem PDF (etwas weiter oben) zu jedem der
beiden Signale zwei jeweils unkorrelierte (!) Störungen (50 %) dazu
addiert. In der Grafik der KKF sieht man sehr schön wie die Störungen
rausgemittelt werden.
Man kann die Korrelationsfunktion mit Hilfe der FFT Ausrechnen. Da würde
es dann von der Rechenzeit ggf. schon mit dem 8 bit µC gehen - nur man
braucht auch einiges an RAM, und das kann man nicht durch mehr Zeit
ausgleichen.
Die Methode der Wahl ist da schon eher die direkte Anpassung einer
Sinusfunktion an beide Signale. Das geht bei einigermaßen bekannter
Frequenz auch mit einem 8 Bit µC noch in Echtzeit recht genau - wenn es
sein muss mit etwas extra Messzeit zum genauen messen der Frequenz
vorab.
Ulrich schrieb:> Die Methode der Wahl ist da schon eher die direkte Anpassung einer> Sinusfunktion an beide Signale.
Nehmen wir mal ein stark gestörtes Sinussignal (siehe Bild) wie mache
ich da eine Anpassung?
An einfachsten ist es wenn man die Frequenz genau kennt: Für die
Anpassung berechnet man einfach die Korrelation des Signals mit einem
gerechneten (oder am µC auch aus einer Tabelle) Sinus und Cosinus. Wenn
das Messintervall gerade ein vielfaches der Periode ist hat man damit
gleich die Anteile als Sinus und Cosinus, sonst kommt noch eine kleine
Korrektur dazu. Aus dem Verhältnis und dem Arcustangens bekommt man die
Phase der einzelnen Signale.
Für jeden wert vom AD Wandler braucht man damit nur 2 Multiplikationen
mit einem Wert aus der Tabelle und 2 Additionen, bei variabler Frequenz
noch eine 3. Addition für den Tabellenindex. Das schöne dabei ist, das
man die einzelnen Werte nicht alle Speichern muss. Wenn es sein muss
kann man auch einen Offset vom AD Wandler noch berücksichtigen. Dazu
kommen dann am Ende ggf ein paar extra Operationen und dann 2 mal der
Arcustangens (bzw. atan2() in C) als relativ langsame
Fließkommafunktion. Aber auch das schaft ein 8 Bit µC unter 10 ms.
Wenn man die Frequenz nicht genau (hier wohl etwa +-0,1 Hz) kennt, wird
es ggf. etwas komplizierter, könnte aber geschickt programmiert immer
noch in Echtzeit, ohne Speichern aller Werte reichen, der Aufwand sollte
sich etwa verdoppeln.
Ulrich schrieb:> Aus dem Verhältnis und dem Arcustangens bekommt man die Phase der> einzelnen Signale.
Arcustangens ist ja auch immer eine so gute Option wenn man genaue Werte
haben möchte ;-)
der Neuling schrieb:> ich würde gerne die Phasenverschiebung von zwei Sinussignalen mit einem> uC messen (am liebsten AVR)....
Ein Weg wäre, durch Phasenverschiebung um 90° zu dem Sinus B den Cosinus
B zu erzeugen bzw. entsprechende Rechtecksignale.
Aus den beiden Mittelwerten über Sinus A * Sinus B bzw. Sinus A *
Cosinus B ergibt sich direkt der Phasenwinkel. Statt der Multiplikation
mit Sinus B bzw. Cosinus B kann man auch mit den entsprechenden
Rechtecksignalen multiplizieren, was die Rechnung auf dem µC sehr
einfach macht.
Ulrich schrieb:> Für die> Anpassung berechnet man einfach die Korrelation des Signals mit einem> gerechneten (oder am µC auch aus einer Tabelle) Sinus und Cosinus.
Was ist die Korrelation für eine Rechenoperation? Ich kenne Addition,
Subtraktion, Multiplikation, Integration, die Korrelationsfunktion
(siehe oben), den Korrelationskoeffizienten …, jedoch keine Korrelation.
Was müsste ich rechnen?
Matthias schrieb:> Ein Weg wäre, durch Phasenverschiebung um 90° zu dem Sinus B den Cosinus> B zu erzeugen bzw. entsprechende Rechtecksignale.
Wie erzeugt man (rechentechnisch) von einem furchtbar verrauschten
harmonischen Ausgangssignal ein unverrauschtes harmonisches Signal das
genau um 90 Grad phasenverschoben ist?
Da wir zuvor so viel über Korrelation diskutiert haben, dachte ich die
Erklärung könnte ich mir Sparen. Für die Kooreltation des Signal mit
einem Siunus, berechnet man erst mal in Echtzeit die Summe über Messwert
* Sinuswert (beim µC wohl aus der Tabelle). Am Ende kann man dann noch
auf die Zahl der Summanden normieren - muss es da aber nicht so genau
nehmen, denn es kommt ja nur auf das Verhältnis für Sinus und Cosinus
an.
Man könnte die 90° verschobenen Signale über eine digitale oder analoge
Phasenregelschleife erzeugen. Wenn das Quellsignal verrauscht ist, hilft
wohl nur die Spikes zu filtern, bzw. die Bandbreite des Reglers so zu
begrenzen, dass kurze Störungen nicht für eine große Verstimmung der
erzeugten Frequenz sorgen.
Ist aber jetzt eher theoretisch. So würde ich es probieren (in einem
Mikrocontroller).
Ulrich schrieb:> Da wir zuvor so viel über Korrelation diskutiert haben, dachte ich die> Erklärung könnte ich mir Sparen. Für die Kooreltation des Signal mit> einem Siunus, berechnet man erst mal in Echtzeit die Summe über Messwert> * Sinuswert (beim µC wohl aus der Tabelle).
Ich begreife es trotzdem nicht. Wenn ich zwei Vektoren habe, Vektor 1
enthalt das Messsignal und Vektor 2 einen Sinus (meinetwegen in einer
Tabelle) und ich multipliziere Elementweise die beiden Vektorgrößen und
summiere sie dann auf, dann erhalte ich doch zum Schluss nur eine reelle
Zahl. Was sagt mir die aus, unhabhängig ob ich diese Zahl noch auf die
Vektorlänge normiere oder nicht.
Bsp.
V1 = [1,2,3,4]
V2 = [9,8,7,6]
E = 1*9+2*8+3*7+4*6
Joe G. schrieb:> Wie erzeugt man (rechentechnisch) von einem furchtbar verrauschten> harmonischen Ausgangssignal ein unverrauschtes harmonisches Signal das> genau um 90 Grad phasenverschoben ist?
Gut zu wissen, dass deine Signale beide furchtbar verrauscht sind.
Möchtest du die Phasenverschiebung bei einer bestimmten Frequenz messen
oder die Zeitverschiebung zwischen zwei (im Prinzip) beliebigen, aber
gleichen Signalen? Was weißst du denn überhaupt von deinem Signal? Ohne
irgendwelche Zusatzinformationen wird es sonst beliebig lustig da etwas
Sinnvolles zu messen. Zeig doch mal ein Bild.
Ist schon OK.
Eigentlich wollte ich nur auf die Kreuzkorrelationsfunktion hinweisen.
Viele haben davon gesprochen, dass es einfacher geht. Man könnte z.B.
mit Sin und Cos multiplizieren und den aufsummierten Mittelwert bilden,
man könnte den Sin nachbilden, eine um 90 Grad phasenverschobene
Funktion nutzen, man könnte „korrelieren“, usw. usw.
JA ihr habt alle recht! Doch nun schaut noch mal genauer hin. Es ist und
bleibt die Kreuzkorrelationsfunktion, in diesem Fall mit tau = 0.
Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines
gegebenen Sinus bestimmt. Das funktioniert auch gut unter Rauschen. Das
script nimmt keine Rücksicht auf Speicherplatz. Das Ganze läßt sich
modifiziert auch auf einem kleinen uC ausführen. Braucht man die
Phasenverschiebung zweier Signale macht man die Prozedur für beide
Signale.
Wenn man die Frequenz des gesuchten Signals kennt gibt es bessere
Verfahren. Dieses Verfahren hat Prony erfunden.
Cheers
Detlef
clear
w=15.3*2*pi/128
sig = 1.34*sin(w*(0:127)+0.123);
n=length(sig);
%sig(n-1)+sig(n+1)=2*cos(w)*sig(n);
s1=sig(1:n-2)+sig(3:n);
s2=sig(2:n-1);
% Regression s1 auf s2
M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.';
wn=acos(coff(1)/2);
M=[cos((0:n-1)*wn).' sin((0:n-1)*wn).'];
coff=inv(M'*M)*M'*sig.';
cc=coff(2)+j*coff(1);
amp=abs(cc);
ph=angle(cc);
Ulrich schrieb:> Das synchron sampeln ist nicht unbedingt nötig, denn die Verzögerung> beim AD im µC ist konstant und bekannt
wie willst Du den Jitter rausrechnen? Bei einem MC-gesteurten ADc wirst
Du einiges an Problemen haben.
Detlef _a schrieb:> Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines> gegebenen Sinus bestimmt.
Warum hat sich das bei Matlab eigentlich eingebürgert maximal unlesbare
Variablennamen zu benutzen?
Simon K. schrieb:> Warum hat sich das bei Matlab eigentlich eingebürgert maximal unlesbare> Variablennamen zu benutzen?
Weil es cool ist, weil man sich vermeintlich damit von den
"Nichtwissenden" abhebt.
Entschuldigt wenn ich diesen Beitag wieder ausgrabe, ich versuche mich
gerade an der implementierung eines ähnlichen Verfahrens, habe aber
dabei so meine Probleme. Insbesondere ist mir nicht klar wo ich bei
Detlefs Regressionsverfahren die Freqeunz des Signals erhalte. Phase und
Amplitude ja - aber die Freqeunz?
Vielleicht liest Detlef ja noch mit - oder jemand anderes kundiges.
Grüße Sepp