我需要计算以下线性卷积
其中超过并且每个的长度超过。我尝试了基于循环卷积/DFT 的方法,但它不起作用,因为每个必须为零填充,因此 DFT 会占用太多时间和内存。有没有其他可用的算法?
我需要计算以下线性卷积
其中超过并且每个的长度超过。我尝试了基于循环卷积/DFT 的方法,但它不起作用,因为每个必须为零填充,因此 DFT 会占用太多时间和内存。有没有其他可用的算法?
所以,我对整个“通过使用常用工具,你的问题到底有多复杂?”变得有点臭名昭著。生意,但是很好:
我继续模拟你的卷积的“最后一个”,即我继续通过 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 块中包含的重叠相加算法,并希望性能与您正在转换的输入向量的长度大致呈线性关系,那么每个卷积将花费大约比前一个长,给我们一个粗略的估计。
显然,这为优化留下了一些空间。现在,Operlap-Add 和 Overlap-Save 实际上应该非常好地扩展到多核/分布式解决方案。此外,做一组长 FFT 听起来也像是 GPU 擅长的事情。