オーディオ信号処理を行う必要のあるアプリに取り組んでいます。(コールバック関数を介して)取得した各バッファーのオーディオレベルを測定する必要があります。私はしばらくの間Webを検索してきましたが、CurrentlevelMeteringと呼ばれる組み込みのプロパティがあることがわかりました。
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;
私の質問は、バッファから正しい値を取得する方法ですか?このための組み込み関数\プロパティはありますか?または、オーディオレベルを自分で計算する必要がありますか?その方法は?
前もって感謝します。