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