我需要实时绘制音频峰值表。每秒最少 44100 个样本乘以最少 40 个流。每个缓冲区介于 64 到 1024 个样本之间。我需要从每个缓冲区中获取最大绝对值。(然后将它们通过一种低通滤波器馈入并以大约 20 毫秒的间隔绘制。)
for(int i = 0; i < numSamples; i++)
{
absMaxOfBuffer = MAX( fabs( buffer[i] ), absMaxOfBuffer);
}
我现在就是这样做的。我想做得更快。缓冲区的浮点数在 -1 到 1 范围内,因此是 fabs。
问题,是否有一些棘手的 comp-sci quicksort-esque 方法可以更快地做到这一点?
如果做不到这一点,浮点数的无分支 ABS 和 MAX 函数,它们存在吗?
编辑:主要平台是 Linux/gcc,但计划了一个 windows 端口(可能与 mingw)。
编辑,第二个:
我接受了一个人,因为关于实际算法结构的一点是问题的核心。
我将尝试将循环展开到四个,将符号位归零,然后使用 SSE(maxps 指令)获得最大值,看看是否不会剥皮。感谢您的建议,我投票赞成你们中的一些人,作为亚军。:)