2011-10-27 7 views
1

Apple에서 제공 한 vDSP 라이브러리 (가속 프레임 워크)를 사용하여 iPhone에서 자동 상관 알고리즘을 구현하려고했습니다.FFT를 사용한 자동 상관 이해 및 프레임 워크 가속화 - iPhone

지금까지 Apple의 auriotouch 예제를 따라 오디오 장치를 만들었지 만, auriotouch의 예제 코드에서 이전 구현 대신 자기 상관을 수행하기 위해 가속 프레임 워크를 사용하고 싶습니다.

가 IORemote 오디오 유닛 내 renderCallBack 방법과 같이 저점 라우팅 :

{ 
    AudioGraphController *controller = (AudioGraphController *) inRefCon; 

    // Remove DC component 
for(UInt32 i = 0; i < ioData->mNumberBuffers; ++i) 
    controller.dcFilter[i].InplaceFilter((SInt32*)(ioData->mBuffers[i].mData),   inNumberFrames, 1); 

    OSStatus result = AudioUnitRender(controller.inputUnit, ioActionFlags, inTimeStamp, 1,  inNumberFrames, ioData); 

    if (result) { printf("InputRenderCallback: error %d\n", (int)result); return result; } 

    controller.manager->ProcessAudioData(inNumberFrames, ioData); 

    return noErr; 
} 

입력 데이터를 마이크로폰으로부터 자기 상관을 수행하는 ProcessAudioData 방법으로 전송되어있어서 상기 C++ 니핏이 게시물 : Using the Apple FFT and Accelerate Framework

그러나 displaydata 배열의 정보를 이해하는 데 어려움이 있습니다.

내가 얻을 모두가 NaN, 나는 내가 displaydata 배열과 같이 캐스팅 할 때 정보의 아이디어가 얻을 수있는 유일한 시간 정보에 액세스하려고 할 때 :

SInt16 * 버피 = (SInt16 *) displayData를 ;

자기 상관을 계산하는 단계는 다음과 같습니다. - 실제 입력 (ioData-> mBuffers [0] .mData)을 짝수 및 홀수 입력으로 분할합니다. - FFT 수행 (앞으로) - FFT에 의해 생성 된 값의 절대 제곱을 취합니다. - IFFT 가져 오기 (역방향/역방향) - 복잡한 분할을 실제로 변환합니다.

누군가 나에게 displaydata 배열의 정보를 해석하는 방법에 대한 조언을 해줄 수 있습니까? 예를 들어이 같은 디스플레이 데이터를 검사 할 때도 모두 동일한 값인 것처럼 보이며 마이크 입력에 따라 달라집니다. .

마이크의 입력은 원래 신호의 일부 에코가있는 신호로 예상됩니다. 자기 상관의 목표는 자기 상관 피크가있는 지점을 결정하는 것입니다. 따라서 i에 대한 반향의 오프셋을 결정할 수 있습니다. 원래 신호.

신호의 에코 버전을 먼저 생성하고 (오프셋을 사용하여)이를 FFT의 여러 값으로 사용해야합니까?

아이폰에서 특히 vDSP 기술을 처음 접한 이래로 내가 더 명확하게 설명하는 정보를 안내해 주시면 감사하겠습니다. 컨볼 루션 및 푸리에 변환에 대한 수학적 경험이 있지만 Apple의 포장재로 인해이 계산에서 얻을 수있는 정보를 어디에서 찾을 수 있는지 짐작하게합니다.

답변

1

호출하는 각 루틴 (vDSP 등)의 데이터 유형을 확인하고 올바른 C 데이터 유형을 제공하는지 확인하십시오. 디버거를 사용하여 각 서브 루틴에 대한 입력을 확인하고 NaN 결과를 얻기 직전부터 역방향으로 작업하여 입력 데이터가 올바른지 확인하십시오 (유형 및 크기 등). 또한 데이터를 복사 할 수있는 버퍼 디버그 목적에 따라 원하는대로 형식이 지정되어 있으므로 내부 계산을 위해 이전/이후 결과를 볼 수 있습니다.

또한 원하는 결과 정보에 따라 inNumberFrames가 자동 상관하려는 벡터의 길이와 관련이 없을 수 있습니다. 여분의 벡터 버퍼가 필요할 수 있습니다.

+0

입력 해 주셔서 감사합니다.전에 디버그에 대한 제안을 읽기 전에 NAN이 입력 값에 의해 야기되었다는 것을 알아 냈습니다. 그 전에는 순방향 푸리에 변환을 수행했습니다. C 데이터 유형을 디버깅하면 마이크에서 입력 한 값이 'SInt16'값이었고 float를 검사하고있는 것으로 나타났습니다. 이 입력을 실수 값으로 변환하면 문제가 해결됩니다. 감사! – Dacatri