如何在MATLAB中检查卷积定理?我的结果是错误的

时间:2019-04-12 01:28:20

标签: matlab signal-processing fft convolution

我正在尝试在MATLAB中检查卷积定理。我有一个叫sine_big_T的信号。然后,我有一个名为W的过滤器。 Wsine_big_T的长度相同。

卷积定理说fft(sine_big_T.*W)应该与fft(sine_big_T)fft(W)的卷积相同。

我对该定理非常困惑。 fft(sine_big_T.*W)将给我一个长度为length(sine_big_T)的数组。但是,conv(fft(sine_big_T), fft(W))给了我一个长度为length(sine_big_T) + length(W) - 2的数组。我尝试过推荐的conv(fft(sine_big_T), fft(W), 'same'),但是结果与fft(sine_big_T.*W)还是有很大不同。

T = 128;
big_T = 8*T;
small_T = T/8;
sine_big_T = zeros(1,129);
sine_small_T = zeros(1,129);
W = zeros(1,129);
for i = 0:T
    sine_big_T(1, i+1) = sin(2*pi/big_T*i);
    W(1, i + 1) = 1 - cos(2*pi/T * i);
end


figure
plot(1:129,fft(sine_big_T.*W));

I_fft = fft(sine_big_T);
W_fft = fft(W);
test = conv(I_fft, W_fft,'same');
figure
plot(1:length(I_fft), test)

根据定理,两个曲线应看起来相同。但是结果还差得远。我认为我使用conv的方式是不正确的。验证定理的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

conv'same'一起使用是正确的。您会看到两件事:

  1. fft定义第一个数组元素中的原点,而不是域的中间部分。此功能不适用于conv。改用它:

    test = ifftshift( conv( fftshift(I_fft), fftshift(W_fft), 'same' ) );
    

    fftshift函数将原点移到数组的中间,在conv'same'的情况下比较好,ifftshift将原点移回第一个元素。

  2. 规范化。通常对FFT进行归一化,以便频域中的乘法在空间域中是卷积。由于您正在频域中计算卷积,因此规范化处于关闭状态。要校正归一化,请绘制

    plot(1:129,fft(sine_big_T.*W)*length(W));