Я пытался реализовать алгоритм автокорреляции на iPhone с использованием библиотек vDSP, поставляемых Apple (Accelerate Framework).
До сих пор я создал аудиоустройство по примеру 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 ++ в этом посте: Использование Apple FFT и Accelerate Framework
Однако у меня возникли некоторые проблемы с пониманиеминформация в массиве displaydata.
Когда я пытаюсь получить доступ к информации, все, что я получаю, это nan, единственный раз, когда я получаю представление об этой информации, это когда я приводю массив displaydata следующим образом:
SInt16 * buf = (SInt16 *) displayData;
Шаги для вычисления автокорреляции. Я выполняю следующие шаги: - Разделим реальный вход (ioData-> mBuffers [0] .mData) на четные и нечетные входы.- Выполнить БПФ (вперед) - Возьмите абсолютный квадрат значений, сгенерированных БПФ.- Возьмите IFFT (обратный / обратный) - Преобразуйте сложное разбиение в реальное.
Может кто-нибудь дать мне несколько советов / советов о том, как интерпретировать информацию в массиве displaydata, даже когда я проверяю данные отображения, такие какэти значения кажутся одинаковыми, хотя они различаются в зависимости от входа микрофона.
Ожидается, что на входе микрофона будет сигнал с некоторыми эхосигналами от исходного сигнала, цель автокорреляциисостоит в том, чтобы определить задержку, где пики автокорреляции, так что я могу определить смещение эха к исходному сигналу.
Должен ли я сначала создать отраженную версию сигнала (с некоторым смещением) и использовать ее для умножения значений БПФ?
Я ценю любые входные данные, также, если вы можете направлятьмне информацию, которая объясняет это более четко, так как я довольно новичок в технологиях vDSP, особенно на iPhone.У меня есть математический опыт работы со свертками и преобразованиями Фурье, но упаковка Apple на месте заставляет меня догадываться, где я могу найти информацию, которую я ожидаю получить из этого расчета.