我必须在整数数组上做浮点数学,快速和音频应用程序(多通道)的低延迟。我的代码可以工作,但我想知道是否有更有效的方法在地方处理。我得到了大约120帧16或24声道的交错32位音频整数的缓冲区,然后我必须将其转换为浮点数/双精度数组进行处理(例如双四元滤波器)。目前,我迭代了数组,并将每个整数转换为一个浮点数组的元素。然后我对它们进行处理,并将它们转换回int以用于写缓冲区,然后将它们传递回lib函数(我在使用snd_pcm_readi和snd_pcm_writei的linux上)。有很多拷贝,而且看起来很浪费。
我可以做得越快,我的延迟就越低,这样整体性能就越好,因为它用于现场声音使用。
我读过关于SSE和其他扩展的文章,这些扩展可以用gcc选项编译,一些引用提到能够传递数组进行流线型转换等,我想知道这些是否会对上面的事情有所帮助。或者也许我不应该费心转换成浮点数-改变我的处理函数来使用整数,跟踪溢出,也许使用64位整数代替,或者为指数创建一个单独的数组-对我来说似乎很深奥,但我猜它并不那么难实现,只需要编码一次等等。我已经问了一个单独的问题‘音频DSP数学需要FPM吗,或者在舍入到24位输出之前,它可以在32/64位整数数学中完成吗?’这是同一主题的一部分,但我认为我应该把它分成不同的问题。
发布于 2015-01-10 10:43:01
如果您的代码是许可证兼容的,则可以使用GNU Radio项目中的Vector optimized library of kernels (VOLK),该项目具有一个执行该转换的内核
将输入的32位整数数据转换为浮点数据,并将每个浮点输出数据点除以标量值
它为SSE2、对齐和未对齐的数据提供了高度优化的实现。
编辑:顺便说一下,为什么不直接在GNU无线电中进行信号处理呢?
https://stackoverflow.com/questions/25725569
复制相似问题