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의 포장재로 인해이 계산에서 얻을 수있는 정보를 어디에서 찾을 수 있는지 짐작하게합니다.
입력 해 주셔서 감사합니다.전에 디버그에 대한 제안을 읽기 전에 NAN이 입력 값에 의해 야기되었다는 것을 알아 냈습니다. 그 전에는 순방향 푸리에 변환을 수행했습니다. C 데이터 유형을 디버깅하면 마이크에서 입력 한 값이 'SInt16'값이었고 float를 검사하고있는 것으로 나타났습니다. 이 입력을 실수 값으로 변환하면 문제가 해결됩니다. 감사! – Dacatri