2014-02-18 57 views
3

根据卷积定理,时域卷积是fft域中的乘积。有了正确的补零,它的工作原理:带有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 

然而,这个定理suposed工作的其他方式为好,在时域上的产品是在FFT域的卷积。我没有得到这部分:

d = a.*b; 
D=conv(fft(a_padded),fft(b_padded)); 
d_bis=ifft(D); 

这给出了一个复杂的向量为d_bis。 如何在频域中使用卷积反演在时域中产生的逐点产品?

回答

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