使用 FFT 和超过最小数量的样本计算卷积

信息处理 fft 卷积
2022-01-24 03:40:22

假设向量 s 是一组长度为 1000 的时间样本。假设向量 h 是一组长度为 50 的样本。

如果我想计算这些向量的卷积,结果将是 1000+50-1 = 1049 点,正如预期的那样。

如果我想使用 FFT 进行计算,我需要确保循环卷积不会混叠。因此,每个向量的 FFT 大小必须 >= 1049。但是,我想要一个有效的 FFT 长度,所以我计算每个向量的 2048 大小的 FFT,将它们相乘,然后取 ifft。这给我留下了 2048 分的答案。

在 Matlab 中: H = fftshift(fft(h,2048)); S = fftshift(fft(s,2048)); 结果 = fftshift(ifft(H.*S));

由于 fft 零填充,该结果包含“额外”样本。从理论上讲,它包含我需要丢弃的 999 个额外样本。有什么系统的方法可以准确地知道要丢弃结果向量的哪些样本?

1个回答

只需保留 IFFT 结果的前 1049 个样本,然后丢弃其余样本。

你不必做一个fftshift

y1 = conv(s,h);
y2 = ifft(fft(s, 2048) .* fft(h, 2048));
figure; plot(y1); hold on; plot(y2(1:length(y1)), '--');

s顺便说一句,与线性卷积相比,在h具有相似长度的情况下使用 FFT 效率更高。在您的情况下,将长信号统一s分成几个小块,然后应用重叠添加重叠保存应该是更好的解决方案。