根据卷积定理,时域中的卷积是fft域中的乘积。使用正确的零填充,它可以工作:
% convolution in time domain
a = [1 2 3];
b = [4 5 6];
c = conv(a,b);
a_padded=[a 0 0]; b_padded=[b 0 0];
c_bis=ifft(fft(a_padded).*fft(b_padded));
% we do find c_bis=c
然而,这个定理也适用于其他方式,时域中的产品是fft域中的卷积。我不明白这一部分:
d = a.*b;
D=conv(fft(a_padded),fft(b_padded));
d_bis=ifft(D);
这给出了d_bis的复数向量。 如何使用频域中的卷积逆转时域中的逐点积?
答案 0 :(得分:4)
有趣的问题!
错误(虽然是一个微妙的错误)就是当你说
时时域中的乘积是FFT域中的卷积
傅立叶变换是正确的。使用Discrete Fourier transforms(DFT或FFT),correct formulation为
时域中的产品是FFT域中的循环卷积,除以序列长度
所以你必须在你的d_bis
计算中改变它:
如果您有信号处理工具箱,则可以使用cconv
来计算循环卷积:
N = length(a);
D = cconv(fft(a),fft(b), N)/N;
d_bis=ifft(D); %// now this equals d
为了确保第一种情况下的correct formulation(时域中的卷积在频域中提供产品)也涉及循环卷积:
时域中的循环卷积是FFT域中的乘积
(在这种情况下没有除以序列长度)
但是由于你在时域中用零填充,正常和循环卷积之间的差异消失了,你得到了正确的结果。没有填充,它将是:
c = cconv(a, b, N);
c_bis=ifft(fft(a).*fft(b)); %// this equals c