如何在 MATLAB 中检查卷积定理?我的结果是错误的
How to check convolution theorem in MATLAB? My result is wrong
我正在尝试在 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
的方式不正确。验证定理的正确方法是什么?
使用 conv
和 'same'
是正确的。您看到两件事:
fft
定义第一个数组元素的原点,而不是域的中间。这不适用于 conv
。改用这个:
test = ifftshift( conv( fftshift(I_fft), fftshift(W_fft), 'same' ) );
fftshift
函数将原点移到数组中间,这里对conv
和'same'
有好处,ifftshift
将原点移回第一个元素。
规范化。 FFT 通常被归一化,因此频域中的乘法是空间域中的卷积。由于您正在计算频域中的卷积,因此标准化已关闭。要更正归一化,plot
plot(1:129,fft(sine_big_T.*W)*length(W));
我正在尝试在 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
的方式不正确。验证定理的正确方法是什么?
使用 conv
和 'same'
是正确的。您看到两件事:
fft
定义第一个数组元素的原点,而不是域的中间。这不适用于conv
。改用这个:test = ifftshift( conv( fftshift(I_fft), fftshift(W_fft), 'same' ) );
fftshift
函数将原点移到数组中间,这里对conv
和'same'
有好处,ifftshift
将原点移回第一个元素。规范化。 FFT 通常被归一化,因此频域中的乘法是空间域中的卷积。由于您正在计算频域中的卷积,因此标准化已关闭。要更正归一化,plot
plot(1:129,fft(sine_big_T.*W)*length(W));