点乘积与FFT

4
根据卷积定理,在时间域中的卷积是在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提供复向量。

1个回答

5

有趣的问题!

错误(虽然是微妙的)在于你说

时域中的乘积是FFT域中的卷积

这在傅里叶变换中是正确的。对于离散傅里叶变换(DFT或FFT),正确的表述

时域中的乘积是FFT域中的循环卷积除以序列长度

因此,在你的d_bis计算中,你必须进行以下更改:

  • 使用循环卷积,而不是卷积;
  • 除以序列长度;
  • 不要应用填充。

如果你有信号处理工具箱,可以使用cconv来计算循环卷积:

N = length(a);
D = cconv(fft(a),fft(b), N)/N;
d_bis=ifft(D); %// now this equals d

为确保第一种情况(时域卷积在频域中得到乘积)中的正确公式也涉及循环卷积,需要注意以下内容:

时域中的循环卷积是FFT域中的乘积

(在这种情况下不需要除以序列长度)

但由于在时域中填充了零,正常卷积和循环卷积之间的差异消失,因此可以得到正确的结果。如果不填充,则结果将如下所示:

c = cconv(a, b, N);
c_bis=ifft(fft(a).*fft(b)); %// this equals c

1
谢谢……这澄清了很多事情。 - sten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接