0

我正在开发一个应该进行一些音频信号处理的应用程序。我需要测量我获得的每个缓冲区中的音频电平(通过回调函数)。我在网上搜索了一段时间,发现有一个内置的属性叫做电流电平表:

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(和您)是否以 1/sqrt(2) 计算 RMS 功率。

除非有充分的理由,否则我会使用 Apple 的功率计算。我用过它们,它们对我来说似乎很好。此外,通常您不需要 RMS 功率,您希望 RMS 功率为分贝,或使用kAudioQueueProperty_CurrentLevelMeterDB常数。(这取决于您是尝试构建音频表,还是真正显示音频功率)

于 2013-01-14T15:51:41.140 回答