c - 将 int 数组快速转换为 fp 以进行音频处理

标签 c arrays performance floating-point data-conversion

我必须对音频应用程序(多 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),该项目具有执行该转换的内核

32i_s32f_convert_32

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/

相关文章:

c - GotoXY 没有像我预期的那样工作

c - 在给定某个文件(或标准输入)的一行中,我如何减少额外的空格并将制表符转换为单个空格?

c# - 以大写形式显示句子中的最后一个单词

javascript - 为什么我们在 `Number.prototype.valueOf` 函数内部使用 `map()`

javascript - 没有分页的 YUI 数据表和大数据集

performance - Hive - 如何以最佳性能重用 Hive 中的子查询

c++ - gcc 链接到未使用的库对构建系统性能的影响

php - 在 C 中执行和存储命令的结果

javascript - PHP数组转JS数组并重构

C - 以可变大小打印流数组字节