C 用于音频处理的int数组到fp的快速转换

C 用于音频处理的int数组到fp的快速转换,c,arrays,performance,floating-point,data-conversion,C,Arrays,Performance,Floating Point,Data Conversion,我必须在整数数组上进行浮点运算,速度快,音频应用的延迟低(多通道)。我的代码可以工作,但我想知道是否有更有效的处理方法。我得到了大约120帧16或24个通道的交错32位音频整数的缓冲区,然后我必须将其转换为浮点/双精度阵列进行处理(例如双四阶滤波器)。目前,我遍历数组,并将每个整数转换为浮点数组的一个元素。然后我处理这些数据并将它们转换回写缓冲区的int,然后将其传递回lib函数(我在linux上使用snd_pcm_readi和snd_pcm_writei)。大量的抄袭似乎是浪费 我能做得越快,

我必须在整数数组上进行浮点运算,速度快,音频应用的延迟低(多通道)。我的代码可以工作,但我想知道是否有更有效的处理方法。我得到了大约120帧16或24个通道的交错32位音频整数的缓冲区,然后我必须将其转换为浮点/双精度阵列进行处理(例如双四阶滤波器)。目前,我遍历数组,并将每个整数转换为浮点数组的一个元素。然后我处理这些数据并将它们转换回写缓冲区的int,然后将其传递回lib函数(我在linux上使用snd_pcm_readi和snd_pcm_writei)。大量的抄袭似乎是浪费

我能做得越快,延迟就越低,因此作为现场声音使用,整体性能就越好


我读过关于SSE和其他可以用gcc选项编译的扩展,一些参考文献提到可以传递数组以进行流线型转换等,我想知道这些是否有助于上述工作。或者也许我不应该费心转换为浮点数-将我的处理函数更改为使用整数,跟踪溢出,或者改用64位整数,或者为指数创建一个单独的数组-对我来说似乎非常深奥,但我想这并不难实现,只需要编码一次等等。我问了一个单独的问题“音频DSP数学是否需要FPM,或者,在返回到24位进行输出之前,是否可以使用32/64位整数数学?这是同一主题的一部分,但我认为应该将其拆分为另一个问题。

如果您的代码与许可证兼容,您可以使用GNU Radio项目中的向量优化内核库(VOLK),它有一个进行转换的内核

将输入的32位整数数据转换为浮点数据,并将每个浮点输出数据点除以标量值

它为SSE2、对齐和未对齐的数据提供了高度优化的实现


编辑:顺便问一下,为什么不直接用GNU无线电本身进行信号处理呢?

如果你发布代码呢?因此,开发人员可以尝试强调您的
代码可以改进的地方??这个类似的问题可能很有用:嗯,是的,它确实很有用,谢谢。我想正如mlwn所说,我应该发布代码,但是当前的代码太分散了,我必须编写一个示例代码段来实现这一点。在阅读了另一个问题并思考了一段时间的复杂性之后,我想我会坚持我正在做的事情,然后回到这个问题上来(如果有人在此期间发布重要信息,那就更好了)。很明显,转换是非常昂贵的,如果我能完全消除浮点运算并使用整数,我将受益匪浅,但在这种情况下,我必须自己实现psuedo fp。如果你要用整数做那种过滤,你应该考虑使用。Skype的编解码器中有一个免费提供的示例。只需在页面上搜索biquad.Degustaf,非常有趣,谢谢。很高兴看到有人这样做,我会看看这个例子。