我正在开发一个应该进行一些音频信号处理的应用程序。我需要测量我获得的每个缓冲区中的音频电平(通过回调函数)。我在网上搜索了一段时间,发现有一个内置的属性叫做电流电平表:
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;
我的问题是如何从缓冲区中获取正确的值?是否有为此的内置函数 \ 属性?或者我应该自己计算音频电平,以及如何计算?
提前致谢。