iPhone AudioQueue - чтение входящих аудиоданных для определения BPM

Я пытаюсь определить количество ударов в минуту (BPM) с микрофона, используя звуковую энергию, я думаю, что понял часть, определяющую BPM, но у меня возникли небольшие проблемы с получением данных RAW.

Пример основан на приложении Apples SpeakHere - на функции обратного вызова AudioQueue, которую я использую:

SInt16 *buffer = (SInt16*)inBuffer->mAudioData;   
for (int i = 0; i < (inBuffer->mAudioDataByteSize)/sizeof(SInt16); i++)
{      
  printf("before modification %d\n", (int)*buffer); 
  buffer++;
}  

Но я получаю некоторые интересные значения - любой шанс, что кто-то может указать мне правильное направление, в котором я ошибаюсь, и сообщить, в какой диапазон я должен вернуться.

Настройка аудиоформатов:

mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
mRecordFormat.mBitsPerChannel = 16;
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;

Ваше здоровье,


person Josh    schedule 05.05.2011    source источник
comment
что в этом интересного? Попробуйте импортировать текстовый вывод в Excel, разделив его на пробелы и нанеся значения на график. У вас есть форма волны?   -  person AShelly    schedule 06.05.2011


Ответы (2)


Решено ...

Настройка аудиоформатов:

mRecordFormat.mFormatID = kAudioFormatLinearPCM;
mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
mRecordFormat.mBitsPerChannel = 16;
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;
mRecordFormat.mBytesPerPacket = 2 * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mBytesPerFrame = 2 * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;
mRecordFormat.mReserved = 0;

А теперь переберем его:

int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof (SInt16);
SInt16 *p = (SInt16*)inBuffer->mAudioData;
for (int i = 0; i < sampleCount; i++) {    
 SInt16 val = p[i];
}
person Josh    schedule 06.05.2011

В каком формате (AudioStreamBasicDescription: порядок байтов, количество бит на канал, канал на кадр и т. Д.) Вы настроили свою аудио-очередь? Конфигурация может сильно отличаться от массива Си SInt16.

person hotpaw2    schedule 05.05.2011
comment
Спасибо за ваш ответ; Настройка: mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; mRecordFormat.mBitsPerChannel = 16; mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame; mRecordFormat.mFramesPerPacket = 1; - person Josh; 05.05.2011