Понимание автокорреляции с использованием БПФ и ускорения фреймворка - iPhone - PullRequest
1 голос
/ 27 октября 2011

Я пытался реализовать алгоритм автокорреляции на 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 на месте заставляет меня догадываться, где я могу найти информацию, которую я ожидаю получить из этого расчета.

1 Ответ

1 голос
/ 27 октября 2011

Проверьте типы данных для каждой из вызываемых вами подпрограмм (vDSP и т. Д.) И убедитесь, что вы предоставляете правильный тип данных C.Используйте отладчик для проверки ввода в каждую подпрограмму, начиная непосредственно перед получением результата NaN и работая в обратном направлении, чтобы убедиться, что входные данные верны (тип и масштаб и т. Д.). Вы также можете скопировать данные в / из буферов, которыеотформатированы больше по вашему вкусу для целей отладки, чтобы вы могли видеть результаты до / после даже для вычислений на месте.

Также обратите внимание, что inNumberFrames может не иметь отношения к длине вектора, который вы хотитеавтокорреляция, в зависимости от того, какую информацию о результате вы хотите.Вам могут понадобиться дополнительные векторные буферы.

...