БПФ на iPhone, чтобы игнорировать фоновый шум и найти более низкие частоты - PullRequest
7 голосов
/ 25 августа 2011

Я реализовал проект Demetri Pitch Detector для iPhone и столкнулся с двумя проблемами.1) любой фоновый шум посылает бананам показания частоты и 2) звуки более низкой частоты не передаются правильно.Я попытался настроить свою гитару, и, пока работали более высокие струны - тюнер не мог правильно различить низкий E.

Код обнаружения высоты тона находится в RIOInterface.mm и выглядит примерно так ...

// get the data
AudioUnitRender(...);

// convert int16 to float
Convert(...);

// divide the signal into even-odd configuration
vDSP_ctoz((COMPLEX*)outputBuffer, 2, &A, 1, nOver2);

// apply the fft
vDSP_fft_zrip(fftSetup, &A, stride, log2n, FFT_FORWARD);

// convert split real form to split vector
vDSP_ztoc(&A, 1, (COMPLEX *)outputBuffer, 2, nOver2);

Затем Деметрий определяет «доминирующую» частоту следующим образом:

float dominantFrequency = 0;
int bin = -1;
for (int i=0; i<n; i+=2) {
    float curFreq = MagnitudeSquared(outputBuffer[i], outputBuffer[i+1]);
    if (curFreq > dominantFrequency) {
        dominantFrequency = curFreq;
        bin = (i+1)/2;
    }
}
memset(outputBuffer, 0, n*sizeof(SInt16));

// Update the UI with our newly acquired frequency value.
[THIS->listener frequencyChangedWithValue:bin*(THIS->sampleRate/bufferCapacity)];

Для начала, я считаю, что мне нужно применить ФИЛЬТР НИЗКОГО ПРОХОДА ... но яне эксперт FFT и не уверен точно, где и как это сделать для данных, возвращаемых функциями vDSP.Я также не уверен, как улучшить точность кода на низких частотах.Кажется, существуют другие алгоритмы для определения доминирующей частоты, но, опять же, ищем толчок в правильном направлении при использовании данных, возвращаемых платформой Apple Accelerate.

ОБНОВЛЕНИЕ:

Среда ускоренияна самом деле имеет некоторые оконные функции.Я настраиваю базовое окно, подобное этому

windowSize = maxFrames;
transferBuffer = (float*)malloc(sizeof(float)*windowSize);
window = (float*)malloc(sizeof(float)*windowSize);
memset(window, 0, sizeof(float)*windowSize);
vDSP_hann_window(window, windowSize, vDSP_HANN_NORM); 

, которое затем применяю, вставляя

vDSP_vmul(outputBuffer, 1, window, 1, transferBuffer, 1, windowSize); 

перед функцией vDSP_ctoz.Затем я изменяю оставшуюся часть кода, чтобы использовать 'TransferBuffer' вместо outputBuffer ... но до сих пор не заметил каких-либо существенных изменений в окончательном предположении основного тона.

Ответы [ 4 ]

7 голосов
/ 25 августа 2011

Шаг не совпадает с частотным интервалом пиковой величины (это то, что БПФ в структуре ускорения может дать вам напрямую).Таким образом, любой детектор пиковой частоты не будет надежным для оценки основного тона.Фильтр нижних частот не поможет, если нота имеет отсутствующий или очень слабый фундаментальный (часто встречающийся в некоторых звуках голоса, фортепиано и гитары) и / или множество мощных обертонов в своем спектре.

Посмотрите на широкий-полосный спектр или спектрограф ваших музыкальных звуков, и вы увидите проблему.

Обычно для более достоверной оценки музыкальной высоты звука необходимы другие методы.Некоторые из них включают в себя методы автокорреляции (AMDF, ASDF), кепстральный / кепстральный анализ, спектр гармонических произведений, фазовый вокодер и / или составные алгоритмы, такие как RAPT (надежный алгоритм для отслеживания основного тона) и YAAPT.БПФ полезен только как часть некоторых из вышеперечисленных методов.

3 голосов
/ 25 августа 2011

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

Достаточно простого Ханна (он же Ханнинга ).

1 голос
/ 21 августа 2012

Функция АЧХ iPhone падает ниже 100 - 200 Гц (см. Пример http://blog.faberacoustical.com/2009/ios/iphone/iphone-microphone-frequency-response-comparison/).

Если вы пытаетесь обнаружить основной режим низкой гитарной струны, микрофон может выступать в качестве фильтра и подавлять интересующую вас частоту. Есть несколько вариантов, если вы заинтересованы в использовании данных fft, которые вы можно получить - вы можете отобразить данные в частотной области вокруг заметки, которую вы пытаетесь обнаружить, так что все, что вы можете видеть, это первый режим, даже если он имеет меньшую амплитуду, чем более высокие режимы (т.е. есть переключатель для настройки первой строки и поставить его в этом режиме).

Или вы можете выполнить низкочастотную фильтрацию звуковых данных - вы можете сделать это либо во временной области, либо даже проще, поскольку у вас уже есть данные в частотной области, в частотной области. Очень простой фильтр низких частот во временной области состоит в создании фильтра скользящих средних во времени. Очень простой фильтр нижних частот в частотной области - это умножить ваши значения БПФ на вектор с 1 в низкочастотном диапазоне и линейным (или даже ступенчатым) понижением на более высоких частотах.

1 голос
/ 25 августа 2011

Какова частота дискретизации и размер блока?Низкий E составляет около 80 Гц, поэтому вам нужно убедиться, что ваш блок захвата достаточно длинный, чтобы захватывать много циклов на этой частоте.Это связано с тем, что преобразование Фурье делит частотный спектр на элементы шириной несколько Гц.Например, если вы производите выборку на частоте 44,1 кГц и имеете выборку во временной области 1024 точки, каждая ячейка будет иметь ширину 44100/1024 = 43,07 Гц.Таким образом, низкий E будет во втором бункере.По ряду причин (связанных со спектральной утечкой и природой конечных временных блоков), практически говоря, вы должны рассматривать первые 3 или 4 ячейки данных в результате БПФ с крайним подозрением.

Если вы отброситечастота дискретизации до 8 кГц, тот же самый размер блока дает вам ширину бинов 7,8125 Гц.Теперь низкий Е будет в 10-м или 11-м бине, что намного лучше.Вы также можете использовать более длинный размер блока.

А так как Пол R указывает на , вы ДОЛЖНЫ использовать окно для уменьшения спектральной утечки.

...