2011-10-27 5 views
1

Я пытался реализовать алгоритм автокорреляции на iPhone с помощью библиотек vDSP, поставляемых Apple (Accelerate framework).Понимание автокорреляции с использованием FFT и ускорения рамки - iPhone

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

Когда я пытаюсь получить доступ к информации, все это я получаю нан, единственный раз, когда я получаю представление информации, когда я кастовал displaydata массив следующим образом:

SInt16 * ЬиЕ = (SInt16 *) displayData ;

Этапы расчета автокорреляции i выполняют следующие шаги: - Разделить реальный вход (ioData-> mBuffers [0] .mData) на четные и нечетные входы. - Выполнение БПФ (вперед) - Возьмите абсолютный квадрат значений, генерируемых БПФ. - Возьмите IFFT (обратный/обратный) - Преобразуйте комплексный раздел в реальный.

Может ли кто-нибудь дать мне несколько указателей/советов, как интерпретировать информацию в массиве displaydata, также, когда я просматриваю данные отображения, подобные этим, кажется, все одинаковые значения, хотя они различаются в зависимости от входа микрофона ,

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

Должен ли я сначала создать эхо-версию сигнала (с некоторым смещением) и использовать это в нескольких значениях БПФ?

Я ценю любой вход, также если вы можете вести меня к информации, которая объясняет это более четко, так как я довольно новичок в технике vDSP, особенно на iPhone. У меня есть математический опыт с сверткой и преобразованием Фурье, но на самом деле упаковка Apple заставляет меня гадать, где я могу найти информацию, которую я ожидаю получить от этого расчета.

ответ

1

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

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

+0

Спасибо за ваш вклад.Прежде чем я прочитал ваше предложение об отладке, я понял, что NAN, вероятно, вызван входными значениями до того, как я сделал преобразование вперед. Отладка типов данных C показала, что входной сигнал от микрофона был «SInt16», и я проверял поплавки. Преобразование этого входа в значения с плавающей точкой разрешило проблему. Благодаря! – Dacatri