为什么从MATLAB得到的卷积与理论计算得到的不同?

3
下面展示了指数函数与正弦函数卷积的理论结果。

enter image description here

当我直接使用Matlab绘制函数时,得到的结果如下: Direct plot of the analytical result 然而,使用Matlab conv命令得到的结果如下: Plot obtained from Matlab 这两个图看起来很相似,但并不完全相同,可以看到它们的刻度不同。Matlab的结果是理论结果的十倍。为什么会这样呢?
Matlab代码在此处。
clc;
clear all;
close all;
t = 0:0.1:50;
x1 = exp(-t);
x2 = sin(t);
x = conv(x1,x2);
x_theory = 0.5.*(exp(-t) + sin(t) - cos(t));

figure(1)
subplot(313), plot(t, x(1:length(t))); subplot(311), plot(t, x1(1:length(t))); subplot(312), plot(t, x2(1:length(t)))

figure(2)
subplot(313), plot(t, x_theory); subplot(311), plot(t, x1(1:length(t))); subplot(312), plot(t, x2(1:length(t)))
1个回答

6

conv实现的是离散时间卷积,而不是数学积分函数。在数值计算中,这基本上意味着对于每个点,将两个信号的结果相乘并加起来,每次都要进行一个信号的小偏移。

如果你思考一下,你会意识到信号采样会产生影响。也就是说,如果你每0.1个值或者0.001个值采样一次,你要相乘的点数是不同的,因此结果在值上是不同的(但形状相同)。

因此,每次进行数值卷积时,你都需要乘以采样率来“标准化”操作。

只需更改你的代码为

sampling_rate= 0.1;
t = 0:sampling_rate:50;
x = conv(x1,x2)*sampling_rate;

@ Ander 谢谢。它有所帮助,现在它们共享相同的比例,但我仍然可以看到图形之间存在一些小差异。分析结果略低于Matlab结果。 - Vikash
5
@Vikash 调整采样率。 请尝试0.5。现在尝试0.01。数值解始终只是对解析解的近似。这适用于所有数值近似,而不仅限于卷积。(幸运的是这就是为什么数学家仍然有工作的原因:D) - Ander Biguri
我刚刚将采样率增加到0.001。现在两个结果很匹配。太好了!但是,我该如何找到正确的采样率呢?如果我正在研究一个问题,并且没有分析结果可以进行比较,我该如何决定采样率的适当值? - Vikash
4
@Vikash,正确的采样率为“0”,即无限采样点。很显然这是不可能的。任何比零更大的采样率都会存在误差。这就是为什么通常希望通过分析方法解决问题的原因。 - Ander Biguri
3
@Vikash:您的正弦函数只需要每个周期略多于两个采样点就可以得到适当的采样。但指数函数无法被采样,您总是会出现误差。傅里叶分析显示了信号功率损失到混叠中的程度。这使您能够选择在应用中能够接受功率损失的采样率。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接