오디오의 피크 미터를 실시간으로 그릴 필요가 있습니다. 초당 최소 44100 샘플, 최소 40 스트림. 각 버퍼는 64 샘플과 1024 샘플 사이에 있습니다. 각 버퍼에서 abs max를 가져와야합니다. (그런 다음 이들은 일종의 저역 통과 필터를 통해 공급되고 약 20ms 간격으로 그려집니다.)float 배열의 빠름 abs-max
for(int i = 0; i < numSamples; i++)
{
absMaxOfBuffer = MAX(fabs(buffer[i]), absMaxOfBuffer);
}
그게 지금하는 방법입니다. 훨씬 더 빨리하고 싶습니다. 버퍼에는 -1에서 1 범위의 부동 소수점이 있으므로 팹을 사용합니다.
질문 :이 작업을보다 빠르게 수행 할 수있는 까다로운 방법이 있습니까?
브랜치가없는 ABS와 MAX가 수레에 대해 기능하지 않는다면, 그것들이 존재합니까?
편집 : 기본 플랫폼은 Linux/gcc이지만 Windows 포트가 계획되어 있습니다 (아마도 mingw와 함께).
두 번째 편집 : 두 번째 :
나는 질문의 중심이었던 실제적인 알 고 구조에 관한 약간의 이유 때문에 하나의 동의를 받았다.
나는 루프를 4 개로 풀어서 시그니처를 제로로 만든 다음 SSE (maxps 명령)로 최대 값을 얻고 바나나를 떼어 내지 않는지 확인합니다. 제안 주셔서 감사 드리며, 나는 주자들과 같이 여러분 중 몇 명을 선정했습니다. :)
어떤 컴파일러입니까? 어떤 플랫폼? gcc를 사용하는 경우 __builtin_expect와 같은 것에 관심을 가질 수 있습니다. –