2011-05-05 13 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++; 
} 

그러나 내가 잘못 가고있는 곳에서 내가 돌아 가야하는 범위를 알려주십시오.

오디오 포맷 설정 : (: 엔디안, 채널 당 비트, 프레임 당 채널 등 AudioStreamBasicDescription) 당신이 당신의 오디오 큐 구성 않았다 어떤 형식에서

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

건배,

+0

? 텍스트 출력을 Excel로 가져 와서 공백으로 나누고 값을 플로팅 해보십시오. 파형을 얻었습니까? – AShelly

답변

0

? 구성이 SInt16의 C 배열과 매우 다를 수 있습니다.

+0

답변 해 주셔서 감사합니다. 설치 : mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; mRecordFormat.mBitsPerChannel = 16; (mRecordFormat.mBitsPerChannel/8) 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]; 
}