非常多长信号卷积的有效算法

信息处理 傅里叶变换 卷积
2022-02-08 20:39:18

我需要计算以下线性卷积

y[n]=h1[n]h2[n]h3[n]hk1[n]hk[n]

其中超过并且每个的长度超过我尝试了基于循环卷积/DFT 的方法,但它不起作用,因为每个必须为零填充,因此 DFT 会占用太多时间和内存。有没有其他可用的算法?k5000hi[n]100,000hi[n]

1个回答

所以,我对整个“通过使用常用工具,你的问题到底有多复杂?”变得有点臭名昭著。生意,但是很好:

我继续模拟你的卷积的“最后一个”,即我继续通过 100,000 个抽头的过滤器倾倒 5 亿个随机样本来拾取 FFT FIR(这是由 Jason R提到的重叠保存方法进行的卷积):

流程图

因此,此流程图平均产生 42 MS/s,即每秒 420 (500x100,000) 个卷积。完整的程序,包括抽头的初始 FFT、抽头和随机池的计算、库的加载和所有设置,大约需要 12 秒。所以,是的,这个精确的操作 5000 次将超过平均休息时间,并且需要将近 17 小时。

我尝试对抽头向量的初始 FFT 进行计时(FFT 滤波器会自动阻止),但我失败了——它比生成抽头向量本身花费的时间要短得多。所以我制作了一个单独的流程图,只对输入数据进行 100,000 次转换,并在我的速度估计中包含所有数据生成/复制开销。使用该流程图,我的 PC 每秒执行 1900 次 FFT,因此执行一次 FFT 大约需要半毫秒,或者执行 5,000 次大约需要 2.5 秒。

这也意味着,如果您很聪明,并且只使用FFT FIR 块中包含的重叠相加算法,并希望性能与您正在转换的输入向量的长度大致呈线性关系,那么每个卷积将花费大约比前一个长,给我们一个粗略的估计125 ms=2.4 msn=05000n2.4 ms8 h,25 min

显然,这为优化留下了一些空间。现在,Operlap-Add 和 Overlap-Save 实际上应该非常好地扩展到多核/分布式解决方案。此外,做一组长 FFT 听起来也像是 GPU 擅长的事情。