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

How to check convolution theorem in MATLAB? My result is wrong

我正在尝试在 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 的方式不正确。验证定理的正确方法是什么?

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

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

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

    fftshift函数将原点移到数组中间,这里对conv'same'有好处,ifftshift将原点移回第一个元素。

  2. 规范化。 FFT 通常被归一化,因此频域中的乘法是空间域中的卷积。由于您正在计算频域中的卷积,因此标准化已关闭。要更正归一化,plot

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