2017-11-14 12 views
0

Ich möchte die Laplace-Transformation eines diskreten stochastischen Signal I Probe von einem Kommunikationsgerät auswerten.Wie wird eine numerische Laplace- und inverse Laplace-Transformation in Matlab für ein diskretes Eingangssignal durchgeführt?

Als ein einfacher Testfall versuche ich das ilaplace zu verwenden, um das ursprüngliche Signal zu erhalten, aber ich bin nicht sicher, ob meine Annäherung plausibel ist.

x = sym('x','real'); 
y = sym('y','real'); 
t=linspace(0,1000,1000); 
f=sin(t); 
s = x+i*y;    
F_s=sum(f.*exp(-s*t)); 
ilaplace(F_s) 

Die oben vielleicht albern erscheinen, obwohl in meinem wirklichen Problem, das ich das Medium Green's function zu schätzen, ich versuche, die ilaplace(2*F_s/(-s*F_s +f(0))) der Form ist.

Ich habe auch versucht, ein Signal symbolische Variable s zu verwenden, und es gibt mir einen Zug von Deltas, die ich nicht sicher bin, ist es richtig, und was ist die Fehlerschätzung.

syms s;         
F_s = symfun(sum(sin(t).*exp(-s*t)), s); 
ilaplace(F_s) 

Antwort

1

Ok, so dass der Weg, ich Matlab verwendet zu tun laplace für ein diskretes Signal umwandeln und zurückgewonnen es mit ilaplace zu Validierungszwecken zurück:

t=linspace(0,10,500); 
f=exp(-t/0.2); 
syms s;         
F_s = sum(f.*exp(-s*t)); 
f_t = (ilaplace(F_s)); 
F_t = (int(f_t)); 

y=subs(F_t,t); 
Ft_recovered = diff(double(y)); 


subplot(2,2,1) 
plot(t,f) 
title('numerical input exp(-t/0.2)') 


subplot(2,2,2) 
ezplot(F_s) 
title('numerical laplace') 


subplot(2,2,3) 
plot(t(1:end-1), Ft_recovered) 
title('recovered signal') 


subplot(2,2,4) 
syms x; 
fx = symfun(exp(-x/0.2),x); 
ezplot(laplace(fx)) 
title('symbolic laplace transform') 

die große Schwierigkeit dabei ist Matlab zu bewerten die Summe des Dirac-Delta-Zuges zu machen, so habe ich diesen Trick: integriert, um den Ausdruck zu konvertieren von heaviside Funktionen zu trainieren, werte es aus und zeichne dann die Ableitung:

F_t = (int(f_t)); 
y=subs(F_t,t); 
Ft_recovered = diff(double(y)); 

enter image description here

2

Versuchen die Anzahl der Elemente in t Erhöhung genauer die Sinusfunktion Probe oder das Signal vor Berechnungen zu glätten. Ein anderes Problem, dem Sie gegenüberstehen, ist, dass die umgekehrte Laplace-Transformation erwartet, dass eine Funktion für s>0 definiert wird, d. H. Bis unendlich. Sie kürzen Ihr Signal bei t=1000 ab, also geht auch die Laplace-Transformation nicht ins Unendliche.

Nach der documentation of ilaplace wird versucht, jeden einzelnen Begriff in Ihrem Array F_s zu transformieren. Dies hat eine Summe von tausend Einträgen einiger Konstanten mal eine Exponentialform der Form exp(-s*t), deren inverse Transformation ein Delta-Impuls ist, siehe this Wikipedia page, second entry of the table. Daher ist Ihre inverse Transformation von F_s eine Serie von tausend Delta-Impulsen, die vermutlich genau die tausend Eingangspunkte sein werden, die Sie mit Ihrer sin(t) erzeugt haben, bis zu einem numerischen Fehler, der bei der Vorwärts- und Rückwärts-Laplace-Transformation auftrat.

Schließlich: MATLAB erwartet, wie in der Dokumentation angegeben, eine einzige symbolische Variable s. Sie haben s bestehen aus zwei symbolischen Variablen. Während MATLAB mathematisch korrekt ist, nimmt MATLAB nur die erste symbolische Variable als die Transformationsvariable an, daher erhalten Sie eine Antwort mit Delta-Impulsen multipliziert mit irgendeiner exp(1i*y) Funktion. Verwenden Sie den folgenden Code, Sie zumindest loszuwerden dieses Problem (aber offensichtlich die Summe von Delta-Impulsen halten):

t=linspace(0,1000,1000); 
f=sin(t); 
syms s 
F_s=sum(f.*exp(-s*t)); 
ilaplace(F_s) 
+0

Gibt es einen guten Weg, um den Fehler für eine zufällige Eingabefunktion zu schätzen? – 0x90

+0

@ 0x90 nicht sicher; Ich habe Laplace nur von Hand transformiert. Was ich von oben denken kann, ist die Verwendung einer Kleinste-Quadrate-Lösung für Ihr Eingangssignal (die vermutlich eine Überlagerung von Sinus/Kosinus sein wird), und das Ergebnis davon als symbolische Eingabe in 'ilaplace', Dadurch erhält man eine transformierbare * Funktion * anstelle von * Punkten *. Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun. – Adriaan

Verwandte Themen