我正在尝试在MATLAB中检查卷积定理。我有一个叫sine_big_T
的信号。然后,我有一个名为W
的过滤器。 W
和sine_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
的方式是不正确的。验证定理的正确方法是什么?
答案 0 :(得分:3)
将conv
与'same'
一起使用是正确的。您会看到两件事:
fft
定义第一个数组元素中的原点,而不是域的中间部分。此功能不适用于conv
。改用它:
test = ifftshift( conv( fftshift(I_fft), fftshift(W_fft), 'same' ) );
fftshift
函数将原点移到数组的中间,在conv
和'same'
的情况下比较好,ifftshift
将原点移回第一个元素。
规范化。通常对FFT进行归一化,以便频域中的乘法在空间域中是卷积。由于您正在频域中计算卷积,因此规范化处于关闭状态。要校正归一化,请绘制
plot(1:129,fft(sine_big_T.*W)*length(W));