Forum: Digitale Signalverarbeitung / DSP / Machine Learning Gleichanteil sehr sauber entfernen


von Chris M. (upt0zer0)


Lesenswert?

Hallo Leute,

mir liegt ein gedämpftes, sinusförmiges Signal vor. Das ganze hat einen 
Gleichanteil, nennen wir ihn mal g und sagen wir dieser beträgt 50. 
Also:

g = 50

Diesen Gleichanteil will ich nun entfernen. Soweit ich mich eingelesen 
habe macht man das meistens so:

(Signal ohne Gleichanteil) = (Signal mit Gleichanteil) - 
(Runden(Mittelwert(Signal mit Gleichanteil)))

oder als Matlabcode:

sig = sig - round(mean(sig));

Soweit so gut, funktioniert auch. Jetzt habe ich aber eine Dämpfung auf 
dem Signal, was dazu führt, dass mir der Mittelwert nicht zu 50 sondern 
zu z.B. 50,06 bestimmt wird.

Jetzt zum eigentlichen Problem. Nachdem ich den Gleichanteil vom Signal 
weggenommen habe muss ich dieses im Zuge der weiteren Verarbeitung 
multiplizieren. Jetzt ist es aber leider entscheidend mit welchem 
Vorzeichen ich multipliziere. Ziehe ich jetzt einen etwas zu großen 
Gleichanteil ab führt das demnach zu einem Fehler.

Erster Ansatz war jetzt den Mittelwert nicht über das gesamte, sondern 
nur über die zweite Hälfte des Signals zu bilden um so die krassen 
"Überschwinger" aus der ersten Hälfte herauszubekommen. Leider brachte 
auch das keinen Erfolg. Selbes Problem.

Hat irgendjemand eine Idee wie ich das Abfangen kann bzw den 
Gleichanteil anders entfernen kann ohne dieses Problem zu haben?

Danke für jede Meinung und Hilfe!

von Sven B. (scummos)


Lesenswert?

Warum denn das Runden? Der DC-Offset ist genau dann weg wenn du genau 
den Mittelwert vom Signal abziehst, quasi per Definition. Wenn du den 
rundest, wird's natürlich falsch ...

Das mit dem Vorzeichen erschließt sich mir auch nicht, das ist nicht 
verständlich ohne zu wissen wie genau dein Signal aussieht und was du 
vor hast.

von Achim S. (Gast)


Lesenswert?

Hm, eigentlich suchst du nicht nach dem Gleichanteil, sondern nach dem 
Endwert eines Einschwingvorgangs, oder? Beide Werte sind sich zwar 
ähnlich, aber halt nicht gleich (die erste Auslenkung ist halt immer die 
größte).

Was mir so in den Sinn käme:
- Einschwingvorgang anfitten. Entweder den Fitparameter "Endwert" von 
der Messkurve abziehen und dann die korrigierten Messwerte weiter 
verwenden, oder gleich die gefittete Theoriekurve weiter verwenden
- Den Einschwingvorgang vor der Mittelwertbildung und Weiterverarbeitung 
"entdämpfen" (also mit exp. ansteigender Funktion multiplizieren, so 
dass die Extrema der Kurve immer den gleichen Wert erreichen. Nach 
hinten raus wird dann halt auch das Rauschen ziemlich groß, aber so ist 
das halt bei der Kurvenform.

Auf theoretisch-idealen Kurven sollten beide Ansätze dir helfen. Ob es 
bei deinen realen Messkurven auch hilft, ist natürlich nicht sicher.

von Chris M. (upt0zer0)


Lesenswert?

Danke erstmal.

Das mit dem "entdämpfen" versuche ich bereits hier:

Beitrag "Hüllkurve überlagertes Signal"

Grob umschrieben: Maxima finden, Kurve anfitten -> f(x) dann Signal mit 
1/f(x) multiplizieren

Leider bisher ohne großen Erfolg. finde leider auch wenig brauchbares 
dazu auf google.

Das mit dem stationären Endwert muss ich mal anschauen, vielleicht hilft 
das weiter, danke!

von C Programmierer (Gast)


Lesenswert?

Ich könnte mir vorstellen, dass eine ganz klassische Tiefpassfilterung 
1. Ordnung hier weiterhelfen könnte. => Je länger eine starke Abweichung 
her ist, desto weniger wird sie gewichtet.

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.