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

时间:2017-11-14 05:47:55

标签: matlab symbolic-math

我想评估来自通信设备的离散随机信号I样本的拉普拉斯变换。

作为一个简单的测试案例,我试图使用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)

以上可能看起来很愚蠢,但在我真正的问题中,我正在尝试估算ilaplace(2*F_s/(-s*F_s +f(0)))形式的中Green's function

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

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

2 个答案:

答案 0 :(得分:2)

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

判断documentation of ilaplace尝试转换数组F_s中的每个单词。这具有一些常数的千个条目的总和exp(-s*t)形式的指数,其逆变换是增量脉冲,参见this Wikipedia page, second entry of the table。因此,F_s的逆变换是一系列的一千个增量脉冲,可能正好是您使用sin(t)生成的千个输入点,直到前进和出现的一些数值误差。向后拉普拉斯变换。

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

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

答案 1 :(得分:1)

好的,这就是我使用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));

enter image description here