关于Objective C:ios音频队列-如何测量缓冲区中的音频电平?

ios audio queue - how to meter audio level in buffer?

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

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

此属性为我提供了平均或峰值音频电平,但未与当前缓冲区同步。
我发现我需要自己从缓冲区数据中计算音频电平,所以我有以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
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之间,但与我从内置音频电平表获得的数字相比,它们似乎是相当随机且低的。

录制音频格式为:

1
2
3
4
5
6
7
8
9
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;

我的问题是如何从缓冲区中获取正确的值?是否有内置的\\\\\\\\属性用于此目的?还是我应该自己计算音频电平,以及如何计算?

预先感谢。


您的RMS功率计算正确。我倾向于说您的样品数量比苹果少或类似,这可以解释两者之间的差异。您可以通过输入一个大正弦波来检查,并检查Apple(和您)是否以1 / sqrt(2)计算RMS功率。

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