2011-05-05 5 views
2

Я пытаюсь определить Beats Per Minute (BPM) из микрофона с использованием звуковой энергии, я думаю, что я выяснил часть, определяющую BPM, но с небольшими трудностями получив Необработанные данные.iPhone AudioQueue - Чтение входящих аудиоданных для определения BPM

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

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

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

Audio Format Setup:

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

Cheers,

+0

что интересно об этом? Попробуйте импортировать текст в excel, разбив на пробелы и построив значения. Вы получаете сигнал? – AShelly

ответ

0

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

+0

Спасибо за ваш ответ; Установка: mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; mRecordFormat.mBitsPerChannel = 16; mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel/8) * mRecordFormat.mCannelsPerFrame; mRecordFormat.mFramesPerPacket = 1; – Josh

+0

Большая или маленькая энтианс? – hotpaw2

+0

подписан 16-разрядный малоподобный – Josh

1

решаемые ...

Audio Format Setup:

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]; 
}