Forum: Digitale Signalverarbeitung / DSP / Machine Learning Hüllkurve überlagertes Signal


von Chris M. (upt0zer0)


Angehängte Dateien:

Lesenswert?

Hallo Leute, ich habe ein überlagertes Signal aus 2 oder mehr 
Sinus-signalen.

Jetzt muss ich die äußere Hüllkurve bestimmen (siehe Anhang). Bei einer 
einfachen Sinusschwingung mache ich das indem ich die Maximas bestimme 
und dann interpoliere. Problem dabei (siehe Anhang) ist, dass bei der 
überlagerten Schwingung ja auch nicht nur die äußeren Maximas sondern 
alle Maximas gefunden werden. Führt dann zu einer verhubbelten 
Hüllkurve. Ich will jetzt aber eine schöne glatte Kurve.

Mir fällt leider kein Kriterium ein wie ich das MATLAB (ich arbeite mit 
MATLAB) beibringen soll.

Die erste Idee war einfach wieder die MAximas der verhubelten Hüllkurve 
zu bestimmen. Allerdings führt das in einigen Fällen zu einer einzigen 
oder 2 Geraden mit einem Eck (unerwünscht).

Falls jemand eine Idee hat bin ich sehr dankbar

von Markus B. (russenbaer)


Lesenswert?

Wie schauts aus wenn Du die maximas der Absolutbeträge nimmst?

von P. P. (p_g)


Lesenswert?

nutze google. Matlab sollte Möglichkeiten mitbringen, nicht nur linar 
sondern 2. oder 3. Grades, oder mit Splines zu interpolieren.
dazu sammelst du die Stützpunkte der ersten Hüllkurve in einem Vektor

von Chris M. (upt0zer0)


Lesenswert?

Also das mit den maximas der Absolutbeträge hat wirklich was geholfen, 
danke.

@P.P.: habe mich vllt nicht deutlich ausgedrückt. Aber wenn zwischen 2 
gewollten Stützstellen, also den absoluten Maximas, noch 4 "falsche" 
liegen, ist es eigentlich total egal wie ich interpoliere, weil ich die 
Stellen ja nicht haben will :-)

von Hagen R. (hagen)


Lesenswert?

du könntest die Max und Min-Peaks ermitteln, interpolieren und beide 
Kurven subtrahieren.

von Harald W. (wilhelms)


Lesenswert?

Chris M. schrieb:

> Hallo Leute, ich habe ein überlagertes Signal aus 2 oder mehr
> Sinus-signalen.
>
> Jetzt muss ich die äußere Hüllkurve bestimmen (siehe Anhang). Bei einer
> einfachen Sinusschwingung mache ich das indem ich die Maximas bestimme
> und dann interpoliere.

Dann wende DeinenAlgorithmus doch einfach zweimal hintereinander an.

von Guest (Gast)


Lesenswert?

mehr oder weniger massiv bandpass filtern, dann bleibt nur der Traeger 
uebrig. In matlab ist das eine Matrix-Vektor multiplikation.

von Gerald G. (gerald_g)


Lesenswert?

Fitten mit:

Oder Fourier Transformieren und die beiden Frequenzen bestimmen und 
bandpassfiltern.

Oder die Hüllkurve der Hüllkurve bestimmen.

von Guest (Gast)


Lesenswert?

Beim Fitten muss er aber vermutlich in die beiden Sinuse noch einen 
Phasenversatz fitten. Das wird wohl aufwaendig.

von Guest (Gast)


Lesenswert?

Chris M. schrieb:
> Also das mit den maximas der Absolutbeträge hat wirklich was geholfen,
> danke.

Duerfte aber falsche Ergebnisse liefern, auch wenn sie auf den ersten 
Blick gut aussehen. Die Abklingzeit duerfte deutlich zu lang sein 
dadurch.

von Jan K. (jan_k)


Lesenswert?

Bei nicht abklingenden Schwingungen nimmt man normalerweise die Hilbert 
Trafo: 
http://de.mathworks.com/help/signal/ug/envelope-extraction-using-the-analytic-signal.html

Wie gut das hier funktioniert müsstest du mal ausprobieren. Was 
passiert, wenn du in die Maxima nur eine abklingende E-Fkt fittest?

von Chris M. (upt0zer0)


Lesenswert?

Also ihr habt mir schon sehr weitergeholfen. Die eingehüllte Kurve sieht 
sehr schön aus. Jetzt will ich das ganze mathematisch beschreiben und 
habe versucht eine Kurve anzufitten (fit(x,y,...)) Was nur bedingt gut 
funktioniert. Vorne ist es praktisch eine e-Funktin aber hinten ist es 
dann ein sehr langer praktisch linearer Teil. Jemand eine Idee wie ich 
sowas möglichst perfekt "gefittet" bekomme?

von Thomas W. (Gast)


Lesenswert?

Chris M. schrieb:
> Vorne ist es praktisch eine e-Funktin aber hinten ist es
> dann ein sehr langer praktisch linearer Teil. Jemand eine Idee wie ich
> sowas möglichst perfekt "gefittet" bekomme?

Mit einer e-Funktion und einer zusätzlichen Geraden (Offset, Steigung) 
;-)

Der lange lineare Teil deutet auf einen zweiten Prozess hin, der dir in 
das abklingende Signal reinstreut.

von Chris M. (upt0zer0)


Angehängte Dateien:

Lesenswert?

Ok also ich muss mich nochmal melden.

Es ist so gesehen eine E-Funktion, das Geraden ähnliche Stück wirkt nur 
aufgrund der Größe der Werte linear, verläuft aber eigentlich genauso 
expontentiell.

Mein neues Problem:

Ich muss das ganze mathematisch beschreiben können. Also MATLAB genommen 
und ein Funktionsfitting versucht mit:

(1) fit(x,y,'exp1') => A * exp(B*x)
und
(2) fit(x,y,'exp2') => A * exp(B*X) + C * exp(D*x)

Die Ergebnisse seht ihr in den Bildern. Alles andere als ideal, gerade 
das die gerittete Funktion unter die eigentliche Kurve fällt (sie wird 
mit den Maximas bestimmt) ist denke ich nicht gut.

Kennt sich hier jemand aus und weiß was ich machen kann damit der Fit 
noch deutlich besser wird?

Danke schonmal

von C Programmierer (Gast)


Lesenswert?

Wie wärs mit a*exp(b*x)*cos(omega*x-phi)+d?

von Chris M. (upt0zer0)


Lesenswert?

a*exp(b*x)*cos(omega*x-phi)+d?

damit würde ich ja den gedämpften Sinus ansich anfitten, ich will ja 
aber eine Kurve ( e-Fkt) haben, die den Verlauf der Dämpfung beschreibt

von derguteweka (Gast)


Lesenswert?

Chris M. schrieb:
> damit würde ich ja den gedämpften Sinus ansich anfitten, ich will ja
> aber eine Kurve ( e-Fkt) haben, die den Verlauf der Dämpfung beschreibt

a*exp(b*x)*      1        +d?

Gruss
WK

von Chris M. (upt0zer0)


Angehängte Dateien:

Lesenswert?

Ok habe ich jetzt mal angefangen.

Folgende Plots dazu.

1.jpg - Eingangssignal mit Fehler und erstellter Hüllkurve
Der Fit sieht schonmal nicht schlecht aus, allerdings ist er im Bereich 
bis 2000 alles andere als gut.

Wenn ich diesen Fit benutze, 1/f(x) mache und dann mein Signal mit der 
Umkehrfunktion multipliziere kommt Bild 2.jpg raus. Alls andere als eine 
gute Kompensation.

Da die krassen Werte am Anfang wohl eher schlecht auf den Fit wirken, 
habe ich einfach mal gesagt ich schließe die ersten 150 x-Werte vom Fit 
aus. Der Fit dazu in Plot 3.jpg.
Vorne nicht besonders, dafür dann schon früher näher dran. Das Pendant 
zu Bild 2.jpg dann in Bild 4.jpg.

Auch nicht wirklich brauchbar.

Zoomt man Plot 3.jpg näher ran (siehe Plot 5.jpg) sieht man, dass der 
fit auch hier eher schlecht als recht ist.

Ich verstehe nicht warum das hier so mega schlecht wird. Ich habe es an 
einem deutlich einfacheren Signal probiert und hier ist das Ergebnis 
ziemlich gut, siehe Plot 6.jpg.

Irgendjemand eine Idee was man drehen kann? Ein bisschen was erreicht 
man, wenn man dem fit Startwerte vorgibt, aber berauschend ist das auch 
nicht, zumal ich nicht weiß wie ich auf ideale komme für a,b,d 
(a*exp(b*x)+d)?

von Detlef _. (detlef_a)


Lesenswert?

Hi,

wollte Du nicht zwei überlagerte abklingende Sinüsse filtern. Jetzt nur 
noch einer?

Wenn nur einer, dann hier zwei links, in denen ich das Problem final 
löse :-))) (geht aber nicht für zwei überlagerte)

http://www.dsprelated.com/showarticle/795.php
http://www.mathworks.com/matlabcentral/fileexchange/50756-fit-a-damped-sine-wave

Cheers
Detlef

von Gerald M. (gerald_m17)


Angehängte Dateien:

Lesenswert?

Also wenn du die Funktion fitten möchtest, musst du auch die Theorie 
dahinter richtig verstehen.
Natürlich kannst du eine Funktion, die so aussieht:
nicht mit einer normalen exp() Funktion fitten.
Geb mal die Daten.

Edit: Keine Ahnung warum mir der LaTeX code nicht richtig angezeigt 
wird.

: Bearbeitet durch User
von Chris M. (upt0zer0)


Lesenswert?

Ich glaub wir verstehen uns hier etwas falsch. Ich will nicht die 
Funktion ansich anfitten sondern die Dämpfung die auf der Funktion liegt 
mit einer E-Funktion darstellen...

Und die Dämpfung entspricht in meinen Augen doch wohl eindeutig dem 
Verlauf einer E-Funktion oder?

von Possetitjel (Gast)


Lesenswert?

Chris M. schrieb:

> Ich glaub wir verstehen uns hier etwas falsch. Ich will nicht
> die Funktion ansich anfitten sondern die Dämpfung die auf der
> Funktion liegt mit einer E-Funktion darstellen...

Kruzitürken.

Wenn Du eine Approximation für die "Funktion ansich" hast, wirst
Du doch wohl in der Lage sein, den Teilterm mit e^x, der die
Dämpfung beschreibt, herauszulösen?!

> Und die Dämpfung entspricht in meinen Augen doch wohl eindeutig
> dem Verlauf einer E-Funktion oder?

Und was glaubst Du, was der Teilterm "exp(-omega*t)" in Geralds
Modellfunktion beschreibt?

von Chris M. (upt0zer0)


Lesenswert?

Oh ok jetzt habe ich geschlafen... habt natürlich recht, dachte nur es 
war ein Missverständnis. Sorry!

von Chris M. (upt0zer0)


Lesenswert?

Ok Leute, vielen dank das ganze geht jetzt schon viel viel besser.

Jetzt eine andere hypotetische Frage. Wenn ich ein Signal mit der 
inversen Hüllkurve multipliziere bekomme ich ja die Dämpfung raus. 
Vorausgesetzt, mein Signal ist um Null symmetrisch, heißt die positiven 
Werte werden auf 1 und die negativen auf -1 gezogen.

Wenn ich jetzt ein nicht zu Null symmetrisches Signal habe, gehen wir 
einfach mal davon aus das es um 50 herum schwingt. Ich weiß, ist ein 
Offset, klug wäre es, denn herauszuziehen. Wenn ich das Signal aber 
zuerst kompensiere und dann denn Offset rausziehe sollte das eine 
genauere Offset Bestimmung ermöglichen.

Problem ist, ich nehme nicht an, dass es eine Möglichkeit gibt, dass 
Signal so zu multiplizieren, dass alle Werte unter < 50 nachher von der 
Amplitude her 49 sind und alle > 50 auf 51.... sehe zumindest keine 
mathematische Möglichkeit dazu... oder gibt es da irgendeine?

Also kurz: statt -1:0:1 hätte ich gerne 49:50:51... was in meinen Augen 
aber nicht geht, fragen kostet ja aber nichts...

von Gerald M. (gerald_m17)


Lesenswert?

Hoppla, habe jetzt erst deine Frage gesehen.
Wenn die Kurve einen Offset hat, musst du den natürlich einfach in die 
Fit-Funktion einfügen, also ein: "+y" hinten dran und fertig ist das 
Ding. Der Sinus darf natürlich auch eine andere Amplitude als 1 haben.

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.