如何在 Matlab 中对离散输入信号执行拉普拉斯数值变换和拉普拉斯逆变换?

How to perform a numerical Laplace and inverse Laplace transforms in Matlab for a discrete input signal?

我想评估从通信设备采样的离散随机信号的拉普拉斯变换。

作为一个简单的测试用例,我尝试使用 ilaplace 来获取原始信号,但我不确定我的方法是否合理。

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)

上面的内容可能看起来很愚蠢,但在我的实际问题中,我正在尝试估计 Green's function 的形式 ilaplace(2*F_s/(-s*F_s +f(0))).

我也尝试过使用信号符号变量 s,它给了我一列增量,我不确定它是否正确以及错误估计是什么。

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

尝试增加 t 中的元素数量以更准确地对正弦函数进行采样,或在计算前平滑信号。您面临的另一个问题是拉普拉斯逆变换需要为 s>0 定义一个函数,即直到无穷大。您在 t=1000 截断信号,因此拉普拉斯变换也不会无穷大。

判断documentation of ilaplace it tries to transform each individual term in your array F_s. This has a sum of a thousand entries of some constant times some exponential of the form exp(-s*t), whose inverse transform is a delta pulse, see this Wikipedia page, second entry of the table。因此,F_s 的逆变换是一系列一千个增量脉冲,这可能恰好是您用 sin(t) 生成的一千个输入点,直到正向和向后拉普拉斯变换。

最后:如文档中所述,MATLAB 需要一个符号变量 s。您使 s 由两个符号变量组成。虽然在数学上是正确的,但 MATLAB 仅将第一个符号变量作为变换变量,因此您得到的答案是增量脉冲乘以某个 exp(1i*y) 函数。使用下面的代码,你至少摆脱了那个问题(但显然保留了增量脉冲的总和):

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

好的,这就是我使用 matlab 对离散信号进行拉普拉斯变换并使用 ilaplace 恢复它以进行验证的方法:

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')

这里最大的困难是让 matlab 评估狄拉克三角洲列车的总和,所以我做了这个技巧:整合表达式将其转换为重函数列车,评估它然后绘制导数:

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