Forum: Digitale Signalverarbeitung / DSP / Machine Learning Methoden zur Identifikation von Minima in "Echtzeit"


von Max S. (schmidi)


Angehängte Dateien:

Lesenswert?

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!

von Gustl (Gast)


Lesenswert?

Ableiten, also Steigung berechnen und dann auf deren Vorzeichen achten. 
Wenn die Steigung von Negativ nach Positiv wechselt, dann war da wohl 
ein Minimum.

von sagjanur (Gast)


Lesenswert?

Das ist wie an der Börse :
Ein Minimum (oder Maximum) kann man erst hinterher erkennen ...

von Max S. (schmidi)


Lesenswert?

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?

von sagjanur (Gast)


Lesenswert?

rein theoretisch :
Hardware-Differenzierer mit nachgeschaltetem Nulldurchgangsdetektor ?

von Justin S. (Gast)


Lesenswert?

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 */

von chris_ (Gast)


Lesenswert?

>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.

von foobar (Gast)


Lesenswert?

> 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.

von Sigi (Gast)


Lesenswert?

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.

von Gustl (Gast)


Lesenswert?

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.

von Bongo (Gast)


Lesenswert?

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.

von Gustl B. (-gb-)


Lesenswert?

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
von Egon D. (Gast)


Lesenswert?

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.

von Bongo (Gast)


Lesenswert?

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.

von Gustl (Gast)


Lesenswert?

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.

von Jan K. (jan_k776)


Lesenswert?

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

von Bongo (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Detlef A (Gast)


Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Detlef _. (detlef_a)


Lesenswert?

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.

von Egon D. (Gast)


Lesenswert?

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.

von Detlef _. (detlef_a)


Lesenswert?

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

von M. Н. (Gast)


Lesenswert?

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