0

オーディオ信号処理を行う必要のあるアプリに取り組んでいます。(コールバック関数を介して)取得した各バッファーのオーディオレベルを測定する必要があります。私はしばらくの間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;

私の質問は、バッファから正しい値を取得する方法ですか?このための組み込み関数\プロパティはありますか?または、オーディオレベルを自分で計算する必要がありますか?その方法は?

前もって感謝します。

4

1 に答える 1

1

RMS電力の計算は正しいです。Appleよりもサンプル数が少ない、または似たようなものだと言いたくなりますが、それが違いを説明するでしょう。大きな正弦波を入力し、Apple(およびあなた)が1 / sqrt(2)でRMS電力を計算することを確認することで確認できます。

正当な理由がない限り、私はAppleの電力計算を使用します。私はそれらを使用しました、そしてそれらは私には良さそうです。さらに、通常、RMS電力は必要ありません。デシベルとしてのRMS電力が必要であるか、kAudioQueueProperty_CurrentLevelMeterDB定数を使用します。(これは、オーディオメーターを作成しようとしているのか、実際にオーディオパワーを表示しようとしているのかによって異なります)

于 2013-01-14T15:51:41.140 に答える