2013-01-14 3 views
0

일부 오디오 신호 처리를해야하는 앱을 만들고 있습니다. 콜백 함수를 통해 얻을 수있는 각각의 버퍼에서 오디오 레벨을 측정해야합니다. 나는 몇 시간 동안 웹 검색 있었고, 나는 빌드 -라는 속성 현재 수준의 측정이 있음을 발견ios audio queue - 버퍼의 오디오 레벨을 측정하는 방법은 무엇입니까?

AudioQueueGetProperty(recordState->queue,kAudioQueueProperty_CurrentLevelMeter,meters,&dlen); 

이 속성은 내게 평균 또는 피크 오디오 레벨 얻을 수 있지만 동기화 아니에요 현재의 버퍼 나는 나 자신에 의해 버퍼 데이터의 오디오 레벨을 계산해야 알아 냈어, 그래서이 있었다 :

double calcAudioRMS (SInt16 * audioData, int numOfSamples) 
{ 
double RMS, adPercent; 
RMS = 0; 

for (int i=0; i<numOfSamples; i++) 
{ 
    adPercent=audioData[i]/32768.0f; 
    RMS += adPercent*adPercent; 
} 
RMS = sqrt(RMS/numOfSamples); 
return RMS; 
} 

이 함수는 현재 버퍼에 샘플 (Sint16로 주조) 오디오 데이터의 수를 가져옵니다 . 내가 얻은 숫자는 실제로 0에서 1 사이이지만, 내장 된 오디오 레벨 미터링에서 얻은 수치와 비교할 때 무작위 적으로 낮습니다.

기록 용 오디오 형식은 다음과 같습니다

format->mSampleRate = 8000.0; 
format->mFormatID = kAudioFormatLinearPCM; 
format->mFramesPerPacket = 1; 
format->mChannelsPerFrame = 1; 
format->mBytesPerFrame = 2; 
format->mBytesPerPacket = 2; 
format->mBitsPerChannel = 16; 
format->mReserved = 0; 
format->mFormatFlags = kLinearPCMFormatFlagIsSignedInteger |kLinearPCMFormatFlagIsPacked; 

내 질문은 버퍼에서 올바른 값을 얻는 방법인가? 이것에 대한 내장 함수 \ 속성이 있습니까? 또는 직접 오디오 레벨을 계산해야합니까? 어떻게해야합니까?

미리 감사드립니다.

+0

소스 코드를 공유 할 수 있습니까? – iosMentalist

답변

1

RMS 전원 계산이 정확합니다. 나는 애플이하는 것보다 적은 수의 샘플을 가지고 있다고 말할 수있다. 비슷한 점이 있다면 그 차이를 설명 할 수있을 것이다. 커다란 사인파를 입력하고 Apple (및 귀하)이 RMS 전력을 1/sqrt (2)로 계산하는지 확인할 수 있습니다.

좋은 이유가없는 한, Apple의 전력 계산을 사용합니다. 나는 그들을 사용했고, 그들은 나에게 좋게 보인다. 또한 일반적으로 RMS 전력을 원하지 않으며 RMS 전력을 데시벨로 사용하거나 kAudioQueueProperty_CurrentLevelMeterDB 상수를 사용합니다. (오디오 미터를 만들거나 진정한 오디오 출력을 표시하려는 경우에 따라 달라집니다.)

+0

감사합니다 jfaller. 나는 커다란 순수한 사인파를 시험해보고 Apple의 CurrentLevelMeter를 1로, 내 최대 값은 0.70으로 잡았다. 우리가 무엇을 만들까요? –

+0

Apple은 1/sqrt (2)를 수정하고 있습니다. 결과에 sqrt (2)를 곱하면 Apple의 것에 동의하게됩니다. – jfaller