オーディオのピークメーターをリアルタイムで描画する必要があります。1秒あたり最小44100サンプル×最小40ストリーム。各バッファは64〜1024サンプルです。各バッファーからabsmaxを取得する必要があります。(これらは、一種のローパスフィルターを介して供給され、約20ms間隔で描画されます。)
for(int i = 0; i < numSamples; i++)
{
absMaxOfBuffer = MAX( fabs( buffer[i] ), absMaxOfBuffer);
}
それが私が今それをする方法です。もっと早くやりたいです。バッファには-1から1の範囲のフロートがあるため、ファブがあります。
質問、これをより速く行うためのトリッキーなcomp-sciクイックソート風の方法はありますか?
それができない場合、フロート用のブランチレスABSおよびMAX関数は存在しますか?
編集:プライマリプラットフォームはLinux / gccですが、Windowsポートが計画されています(おそらくmingwを使用)。
編集、2番目:
質問の中心であった実際のアルゴ構造に関するビットのために、私は1人ずつ受け入れました。
ループを一度に4に展開し、符号ビットをゼロにしてから、SSE(maxps命令)で最大値を取得して、バナナが剥がれないかどうかを確認します。提案をありがとう、私は次点者としてあなたの何人かに賛成票を投じました。:)