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功率为分贝,或使用