我必须对音频应用程序(多 channel )快速且低延迟地对整数数组进行 float 学运算。我的代码可以工作,但我想知道是否有更有效的处理方法。我获得了大约 120 帧的 16 或 24 channel 交错 32 位音频整数的缓冲区,然后我必须将其转换为浮点/ double 组进行处理(例如双二阶滤波器)。目前,我迭代数组并将每个整数转换为 float 组的元素。然后我处理这些并将它们转换回写入缓冲区的整数,然后将其传递回 lib 函数(我在 Linux 上使用 snd_pcm_readi 和 snd_pcm_writei)。有很多复制,看起来很浪费。
我做得越快,延迟就越低,因此现场声音使用的整体性能就越好。
我读过有关 SSE 和其他可以使用 gcc 选项进行编译的扩展,并且一些引用文献暗示能够传递数组以进行简化的转换等,我想知道这些是否可能对上述内容有所帮助。或者也许我不应该费心转换为 float - 更改我的处理函数以使用整数,跟踪溢出,也许使用 64 位整数,或者为指数创建一个单独的数组 - 对我来说似乎相当深奥,但我想它不是这很难实现,只需要编码一次等等。我问了一个单独的问题“音频 DSP 数学是否需要 FPM,或者可以在四舍五入到 24 位输出之前以 32/64 位整数数学来完成吗?” '这是同一主题的一部分,但我认为我应该将其分成不同的问题。
最佳答案
如果您的代码与许可证兼容,您可以使用 GNU Radio 项目中的 vector 优化内核库 (VOLK),该项目具有执行该转换的内核
converts the input 32 bit integer data into floating point data, and divides the each floating point output data point by the scalar value
它针对 SSE2、对齐和未对齐数据进行了高度优化的实现。
编辑:顺便说一下,为什么不在 GNU Radio 本身中进行信号处理呢?
关于c - 将 int 数组快速转换为 fp 以进行音频处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25725569/