Hallo zusammen, ich habe eine Frage: Welche Methoden kennt ihr, die gängig sind, Minima in einem fortlaufenden Messsignal mit einem Mikrocontroller zu identifizieren. Ich bin leider etwas unbedarft und benötige eine V0, damit ich weiß wonach ich am besten suchen/recherchieren soll. Vielleicht kennt ihr sogar einen Ansatz, der direkt dazu passt. Ziel ist das Finden des Zeitpunkts der Minima, um die Zeitdifferenz zwischen diesen berechnen zu können. Das soll in „Echtzeit“ passieren, um diese direkt weiter nutzen zu können. Mich interessieren nur Zeitdifferenz, die eigentlichen Messwerte der Minima sind für mich uninteressant. Das normierte Messsignal sieht ungefähr wie folgt aus, wobei der Wert des Minimums immer etwas variiert (siehe Anhang). Die Abtastrate beträgt 50 kHz, wobei das Auftreten der Minima etwa mit 5 kHz erfolgt. Also sollte das Nyquist-Shannon-Abtasttheorem eingehalten sein. Ich würde mich freuen, wenn ihr mir ein wenig weiterhelfen könnt. 😊 Ich wünsche euch schon mal einen schönen Ersten Mai!
Ableiten, also Steigung berechnen und dann auf deren Vorzeichen achten. Wenn die Steigung von Negativ nach Positiv wechselt, dann war da wohl ein Minimum.
Das ist wie an der Börse : Ein Minimum (oder Maximum) kann man erst hinterher erkennen ...
Danke für die Antworten. sagjanur schrieb: > Das ist wie an der Börse : > Ein Minimum (oder Maximum) kann man erst hinterher erkennen ... Ja das ist mir bewusst. Darum habe ich das Echtzeit auch in Anführungszeichen gesetzt. Das Bild zeigt einen aufgenommenen Signalverlauf. Ich denke, dass grundsätzlich muss ein Zeitfenster definiert sein muss, in dem das Minimum gesucht wird. Optimalerweise sollte es so gewählt sein, dass nur ein Minimum enthalten ist. Entsprechend müsste ich dann nur ein "globales" Minimum finden. Da die Messwerte geringfügig rauschen, was gibt es für weitere Möglichkeiten?
rein theoretisch : Hardware-Differenzierer mit nachgeschaltetem Nulldurchgangsdetektor ?
1) Problem Rauschen muss bedacht werden. 2) Problem Sattelpunkte, die eigentlich Minima sind, ebenfalls. Eine mögliche Abhilfe: Tiefpass mit fc ~ 5 kHz Sonst: if ( x[n-2] > x[n-1] && x[n] > x[n-1] ) /* n - 1 ist ein Minimum */
>if ( x[n-2] > x[n-1] && x[n] > x[n-1] ) > /* n - 1 ist ein Minimum */ Puh ... zum Glück gibt es keinerlei Rauschen auf dem Signal.
> if ( x[n-2] > x[n-1] && x[n] > x[n-1] ) > 1) Problem Rauschen muss bedacht werden. Den Einfluß des Rauschens kann man verringern, wenn man statt -1 und -2 eine größere Schrittweite d nimmt (also -d und -2d, im Endeffekt ein Resampling auf fs/d). d sollte passend gewählt werden, so dass genügend viele Resampling-Punkte innerhalb dieser Sinus-Halbwellen liegen.
Etwas aufwendiger, dafür aber mit Rauschfilter: Du kannst dein Signal per Bestapproximation lokal approximieren, z.B. mit Polynomen von Grad 3. Damit erhälst du die Koeffizienten (p0,p1,p2,p3), anhand derer du schnell entscheiden kannst, ob und WO!! ein Minimum oder Maximum vorliegt. Aber Achtung: 1. je Wert ist eine Approximation zu berechnen 2. für benachbarte Werte sind die Approximanten iE gleich. Das Problem lässt sich aber z.B. durch ein Flag lösen, dass beim ersten Extremum gesetzt und erst nach z.B. k Werten wieder gelöscht wird. 3. Ein berechnetes Extremum kann evtl. auch vor dem aktuellen Werte liegen. In diesem Fall: ignorieren Das ganze habe ich schon öfters für Spektrenanzeigen gemacht, wo ja auch die Maxima interessieren.
foobar schrieb: > Den Einfluß des Rauschens kann man verringern, wenn man statt -1 und -2 > eine größere Schrittweite d nimmt Oder gleich zwei gleitende Mittelwerte. Man guckt sich z. B. immer 16 Samples an und zieht dabei für die Steigung den Mittelwert der ersten 8 Samples vom Mittelwert der letzten 8 ab.
Gustl schrieb: > Oder gleich zwei gleitende Mittelwerte. Man guckt sich z. B. immer 16 > Samples an und zieht dabei für die Steigung den Mittelwert der ersten 8 > Samples vom Mittelwert der letzten 8 ab. Das ist aber ein sehr störanfälliges Filter. Besser wäre ein richtiger Tiefpass, als Filter gegen Rauschen. Wenn die Schwinungsfrequenz= Krümmung bekannt ist, kann man auch diesen Sinus lokal einpassen.
Bongo schrieb: > Das ist aber ein sehr störanfälliges Filter. Ja. Du kannst die Mittelwerte jeweils über mehr Samples machen. Bongo schrieb: > Besser wäre ein richtiger Tiefpass, als Filter gegen Rauschen. Kann man. Dadurch wird aber auch die Latenz größer. Bongo schrieb: > Wenn die Schwinungsfrequenz= Krümmung bekannt ist, kann man auch diesen > Sinus lokal einpassen. Auch das geht. Kostet aber Rechenleistung. Die Lösung ist vermutlich irgendein Kompromiss aus Rechenleistung, Latenz, Qualität des Ergebnisses, ... _____________________ Und auch danke für die negativen Bewertungen oben. Da haben wohl Manche noch nicht verstanden, dass man auch numerisch ableiten kann, nennt sich Differenzenquotient.
:
Bearbeitet durch User
Gustl B. schrieb: > Da haben wohl Manche noch nicht verstanden, dass man > auch numerisch ableiten kann, Natürlich KANN man -- aber es ist selten eine gute Idee.
Gustl B. schrieb: > Bongo schrieb: >> Besser wäre ein richtiger Tiefpass, als Filter gegen Rauschen. > > Kann man. Dadurch wird aber auch die Latenz größer. Nö, das hängt nur von der Zahl der Samples ab, die betrachtet werden. Der "richtige" Tiefpass entsteht durch passendes Wichten der Samples, also des Einpassens der Tiefpassantwort. Das erzeugt mehr Rechenleistung aber nicht mehr Latzenz.
Nein. Wenn du eine niedrige Grenzfrequenz haben willst brauchst du einen Tiefpass der auf einen längeren Zeitraum wirkt. Also entweder mehr Samples oder niedrigere Samplerate. Aber du hast zum Teil Recht, denn wenn die Anzahl der zu betrachtenden Samples gleich ist, dann ist ein "richtiger" Tiefpass steilflankiger als der gleitende Mittelwert. Die Anführungszeichen deshalb weil ka auch der gleitende Mittelwert ein FIR Filter ist, nur haben eben alle Koeffizienten den Wert 1, das ist also einfach zu rechnen.
Alternative zum separaten Filtern gegen Rauschen und dann ableiten, kann man das auch kombinieren, z.B. durch Savitzky Golay Filter. Da fittet man lokale Polynome und nimmt davon analytisch die Ableitung. Das kann als FIR Filter formuliert werden. Einziger Parameter ist dann die Fensterlänge. Du musst im Prinzip nur die Koeffizienten ablesen/berechnen und als normales FIR Filter implementieren. Die Abtastrate muss fix sein. Das Ergebnis dann auf Nulldurchgang, ggf. mit leichter Hysterese prüfen. Ist natürlich dann immer um die Hälfte der Filterlänge verzögert. Siehe z.B. https://dsp.stackexchange.com/questions/54539/what-exactly-is-savitzky-golay-differentiation-filter https://de.wikipedia.org/wiki/Savitzky-Golay-Filter http://www.statistics4u.info/fundstat_eng/cc_savgol_coeff.html
Gustl schrieb: > Nein. Wenn du eine niedrige Grenzfrequenz haben willst brauchst du einen > Tiefpass der auf einen längeren Zeitraum wirkt. ???? Es ging darum, dass deine Aussage war: Bongo schrieb: > Gustl B. schrieb: >> Bongo schrieb: >>> Besser wäre ein richtiger Tiefpass, als Filter gegen Rauschen. >> >> Kann man. Dadurch wird aber auch die Latenz größer. Ich schrieb zuvor, die Samples mit den Koeffizienten zu wichten, statt nur den gleitenden Mittelwert zu nehmen. Dadurch ändert sich nichts an der Latenz.
Max S. schrieb: > Mich interessieren nur > Zeitdifferenz, die eigentlichen Messwerte der Minima sind für mich > uninteressant. Max S. schrieb: > Die Abtastrate beträgt 50 kHz, wobei das Auftreten der Minima etwa mit 5 > kHz erfolgt. Also hast du so etwa 10 Samples pro Periode, macht 5 pro Halbwelle. Das ist nicht sehr fein aufgelöst, folglich wirst du um eine Sinus-Approximation im einfachsten Falle nicht drumherum kommen. Hmm, das riecht für mich danach, daß man lieber die Nulldurchgänge berechnet als das Ergebnis an den Minima festmachen zu wollen. Hier eine brutale Linearversion: Immer dann, wenn das Vorzeichen gewechselt hat, eine Linie zum vorherigen Sample berechnen und deren Nulldurchgang ausrechnen. Das kostet keine Winkelfunktionen sondern nur die Grundrechenarten. Ja, ich weiß, sowas ist wohl das Gegenteil von schön. Andererseits halte ich es für eine augesprochen ungünstige Sache, den Zeitpunkt von Extrema als Basis für Nachfolgeberechnungen ermitteln zu wollen. Eben weil der Anstieg dort durch 0 geht. So, und noch was zur erwartbaren Latenzzeit: Bei nur 10 Samples pro Periode muß man mit wenigstens 10% der Periode als Latenzzeit rechnen. Dazu kommt noch die Zeit für's Rechnen, wofür nur insgesamt 200µs zur Verfügung stehen. Da hat man auf vielen DSP keine Zeit für wirklich umfängliche Berechnungen, sondern nur für ein eher schlankes Verfahren. W.S.
Ich würde in einem 10 samples breiten Fenster eine quadratische Regression berechnen, also die Halbwelle als Parabel approximieren. Als Kriterium für das Minimum würde ich die minimale Fehlerenergie verwenden. Damit erreichst Du subsample Auflösung. Der Aufwand ist paar Multiplikationen und zwei Divisionen per sample, sollte gehen. Nochmal langsam: Du löst für die 10 xn und die 10 yn das überbestimmte Gleichungssystem a*xn^2+b*xn+c=yn mit minimalen Fehlerquadraten. Das ist eine quadratische, keine lineare Regression. Die a,b,c sind die Parameter der Parabel. Diese Parabel hat ihr Minimum xm bei der Nullstelle der Ableitung: 2*a*xm+b=0 . Dort ist das Extremum der Parabel im Fenster. Liegt denn das Fenster korrekt? Das berechnest Du über die Fehlerenergie, die quadratische Abweichung der Messwerte vom Fit: Summe über 1..10 (a*xn^2+b*xn+c - yn)^2 . Die Fehlerenergie hat ein Minimum wenn die Parabel am besten 'passt'. Wenn man eins danebenliegt ist auch nicht schlimm, das holt der fit wieder raus. Lad mal die Daten hoch, dann probier ich das mal aus. math rulez ! Cheers Detlef
Detlef A schrieb: > Ich würde in einem 10 samples breiten Fenster eine quadratische > Regression berechnen, also die Halbwelle als Parabel approximieren. Wenn das Signal rauscharm ist, kann man auch den tiefsten Punkt, den davor und den danach direkt für eine Näherungsparabel nutzen. Zeitliches und wertliches Minimum ergeben eine einfache geschlossene Formel.
Detlef A schrieb: > Ich würde in einem 10 samples breiten Fenster eine quadratische > Regression berechnen, ... Großartig! So wie es er TO schreibt, hast du pro Periode nur so etwa 10 Samples. Da ist bei deinem Beispiel auch immer ein Maximum dabei. Vielleicht ginge es mit einem 3 Samples breiten Fenster... W.S.
W.S. schrieb: > Da ist bei deinem Beispiel auch immer ein Maximum dabei. Genau darum gehts', das hast Du verstanden. Die 10 statt der 3 machen Dir die Ergebnisse besser.
Detlef _. schrieb: > W.S. schrieb: >> Da ist bei deinem Beispiel auch immer ein Maximum dabei. > > Genau darum gehts', das hast Du verstanden. Die 10 statt > der 3 machen Dir die Ergebnisse besser. Nee. Wir reden von 10 Samples pro Periode , also pro Vollwelle . Dein Vorschlag läuft aber, wenn ich Dich richtig verstehe, darauf hinaus, die maximale Zahl Samples je Halbwelle zu verwenden. Das wären im vorliegenden Fall fünf Punkte.
Mein Gott, so schwer ist das doch nicht. 50kHz / 5 kHz ist 10. Deswegen ein 10er Fenster. das steht links und rechts von der Parabel noch etwas über das beeinflußt den quadratischen fit nicht. EOM Cheers Detlef
Egon D. schrieb: > Nee. > Wir reden von 10 Samples pro Periode , also pro Vollwelle . > > Dein Vorschlag läuft aber, wenn ich Dich richtig verstehe, > darauf hinaus, die maximale Zahl Samples je Halbwelle zu > verwenden. Das wären im vorliegenden Fall fünf Punkte. Da kommt dann irgendwie sowas hier raus: https://www.desmos.com/calculator/fw0jrqxqqd Solange der "Sinus" Achsensymmetrisch um sein Minimum ist, ist das tatsächlich für den Fit egal. Lediglich die Breite der Parabel und die Ordinate des gefitteten Minimums werden davon beeinflusst. Beides interessiert den TO aber nicht. Man kann es zumindest mal versuchen.
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.