2011-05-05 6 views
2

私は音エネルギーを使ってマイクからビートパーツ(BPM)を決定しようとしていますが、私はBPMを決定する部分を考え出しましたが、生データ。iPhone AudioQueue - 受信オーディオデータを読み込んでBPMを判断する

例はリンゴ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; 

乾杯、どのような形式(AudioStreamBasicDescription:などエンディアン、チャネルあたりのビット、フレームごとにチャネル、)で

+0

?テキスト出力をExcelにインポートし、スペースを分割して値をプロットしてみてください。あなたは波形を取得しますか? – AShelly

答えて

0

あなたのオーディオキューを設定しましたか?構成がSInt16のC配列と大きく異なる可能性があります。

+0

お返事ありがとうございます。 セットアップ: mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; mRecordFormat.mBitsPerChannel = 16; mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame =(mRecordFormat.mBitsPerChannel/8)* mRecordFormat.mChannelsPerFrame; mRecordFormat.mFramesPerPacket = 1; – Josh

+0

エンディアンが大きいか小さいですか? – hotpaw2

+0

符号付き16ビットリトルエンディアン – Josh

1
解決

...

オーディオフォーマットの設定:

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]; 
} 
関連する問題