只需将代码更改为以下内容:
x = randn(1,1000);
h = [1 2 3 4 5];
y = conv(x,h);
plot((abs(fft(h,1024))).*(abs(fft(x,1024)))); % It's |H(w)||X(w)|
hold on
plot(abs(fft(y,1024)),'--r')
您错误地将脉冲响应的 DFT 提高到了二次方。您可以看到幅度有点偏离,但峰值和谷值在同一点上更少。
此外,我在我的 MATLAB 2014a 中注意到,运行原始代码后出现错误。那是因为向量x
是一个行向量,并且y
是一列。
这部分是为了回答Drazick,声称这种方法会产生一些错误(已经出现在我的解决方案中)。
在@jojek 代码中没有相等性,因为他在乘法之前通过对两个信号应用 abs 运算符来忽略相位(与卷积定理相反)。
如果过滤器有更苛刻的相位,他的结果会有更大的误差。
首先请阅读我的 MATLAB 代码,也许你会注意到--r
第二个绘图函数的开关。我故意使用虚线,否则我们只会有红色的情节而根本没有蓝色。
但是,让我们切入正题。代码现在稍作修改,因为随机信号被带有随机系数的长滤波器过滤。这就是我们比较和时域卷积:|H(ω)X(ω)||H(ω)||X(ω)|
让我们放大:
所以三个都是平等的。脚本还提供了两种方法之间的最大差异,大约为。下面的脚本重现结果:10−13
clc, close all
x = randn(1,1000);
h = randn(1,200); % some crazy filter
y = conv(x,h);
N = length(y);
Y = abs(fft(h,N)).*abs(fft(x,N)); % |H(w)||X(w)|
YY = abs(fft(h,N).*fft(x,N)); % |H(w)X(w)|
plot(YY,'go');
hold on
plot(Y,'b')
plot(abs(fft(y,N)),'--r')
grid on
legend({'|H(w)X(w)|','|H(w)||X(w)|','conv'})
display(sprintf('Max error: %e', max(abs(YY-Y))))