Law 发表于 2015-11-10 16:29

FFT和卷积的细节处理

一直听别人说:时域的卷积就是频域的相乘
但是 两个长度均为L的信号,在频域做FFT再做IFFT之后长度还是为L,卷积过后长度却为(2L-1){:{41}:}
问题是来了:
1.该怎么理解这么一回事
2.这里对卷积的结果该怎么截取才能得到和FFT做的一样的结果
谢谢!

dsp2008 发表于 2015-11-10 18:33

用FFT实现卷积的方法是这样的:
1、设序列x(n)的长度为L,h(n)的长度为M;则卷积y(n)的长度为N=L+M-1;
2、将x(n)和h(n)这两个序列都补零,使得补零后的它们的长度都变成N;
3、分别求x(n)和h(n)的FFT,得X(k)和H(k);
4、y(n) = IFFT。

dsp2008 发表于 2015-11-10 19:09

MATLAB程序示例:

x = ;
h = ;
y = ifft(fft(x,7) .* fft(h,7));

dsp2008 发表于 2015-11-10 19:14

当然,为了调用基-2 FFT函数,可将第3行程序改写为:
N = 2 .^ ceil(log((length(x) + length(h))));y = ifft(fft(x,N) .* fft(h,N));

然后,取y中的前length(x) + length(h) - 1项,即为线性卷积的结果。

TestGuru 发表于 2015-11-11 09:44

本帖最后由 TestGuru 于 2015-11-11 09:47 编辑

两个信号FFT或DFT后再相乘是两个信号的周期卷积,按L+M-1补零就把周期卷积变线性卷积了。

Law 发表于 2015-11-11 16:02

dsp2008 发表于 2015-11-10 19:09
MATLAB程序示例:

x = ;


如果我不要那个7,程序写成这样子
x = ;
h = ;
y = ifft(fft(x) .* fft(h));
这样得到的y就是只有4位,怎么用线性卷积来实现呢?

dsp2008 发表于 2015-11-11 18:32

Law 发表于 2015-11-11 16:02
如果我不要那个7,程序写成这样子
x = ;
h = ;


1、是用FFT来实现线性卷积,而不是用线性卷积来实现别的东西。请务必记住这一点!
2、若要用FFT来实现线性卷积,则必须满足N >= L+M-1的条件。

Law 发表于 2015-11-11 18:53

dsp2008 发表于 2015-11-11 18:32
1、是用FFT来实现线性卷积,而不是用线性卷积来实现别的东西。请务必记住这一点!
2、若要用FFT来实现线 ...

懂了,我知道我错在哪了。。。圆周卷积也有这个条件
页: [1]
查看完整版本: FFT和卷积的细节处理