Я работаю над приложением, которое должно обрабатывать аудиосигнал. Мне нужно измерить уровень звука в каждом из получаемых буферов (с помощью функции обратного вызова). Некоторое время я искал в Интернете и обнаружил, что есть встроенное свойство под названием Current level metering:
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;
У меня вопрос, как получить правильные значения из буфера? Есть ли для этого встроенная функция \ свойство? Или я должен сам рассчитать уровень звука, и как это сделать?
Заранее спасибо.