Как вы анализируете основную частоту выборки PCM или WAV?
У меня есть образец в буфере из DirectX. Это образец ноты, сыгранной и захваченной с инструмента. Как мне проанализировать частоту сэмпла (как это делает гитарный тюнер)? Я считаю, что БПФ участвуют, но у меня нет указателей на HOWTO.
7 ответов
БПФ может помочь вам определить, где находится частота, но он не может точно сказать , что это за частота. Каждая точка в БПФ является "корзиной" частот, поэтому, если в вашем БПФ есть пик, все, что вы знаете, это то, что вы хотите, чтобы частота находилась где-то внутри этого бина, или диапазона частот.
Если вы хотите, чтобы он был действительно точным, вам нужен длинный БПФ с высоким разрешением и большим количеством бинов (= много памяти и много вычислений). Вы также можете угадать истинный пик из БПФ с низким разрешением, используя квадратичную интерполяцию в логарифмическом спектре, которая работает на удивление хорошо.
Если вычислительные затраты наиболее важны, вы можете попытаться преобразовать сигнал в форму, в которой вы можете сосчитать пересечения нуля, и чем больше вы будете считать, тем точнее будет ваше измерение.
Ничего из этого не сработает, если фундаментальное значение отсутствует.:)
Я изложил здесь несколько различных алгоритмов, и интерполированное БПФ обычно является наиболее точным (хотя это работает только тогда, когда фундаментальная является самой сильной гармоникой- в противном случае вам нужно быть умнее в ее поиске), когда пересечение нуля занимает близкую секунду (хотя это работает только для сигналов с одним пересечением за цикл). Ни одно из этих условий не является типичным.
Имейте в виду, что частоты выше основной частоты не являются идеальными гармониками во многих инструментах, таких как фортепиано или гитара. Каждая часть на самом деле немного не в порядке или негармонична. Таким образом, высокочастотные пики в БПФ не будут точно соответствовать целочисленным коэффициентам основной частоты, и форма волны будет слегка меняться от одного цикла к следующему, что исключает автокорреляцию.
Чтобы получить действительно точное показание частоты, я бы сказал, что нужно использовать автокорреляцию, чтобы угадать фундаментальную, а затем найти истинный пик с помощью квадратичной интерполяции. (Вы можете выполнить автокорреляцию в частотной области, чтобы сэкономить циклы ЦП.) Есть много ошибок, и правильный способ использования действительно зависит от вашего приложения.
Существуют также другие алгоритмы, основанные на времени, а не на частоте. Автокорреляция - это относительно простой алгоритм определения высоты тона. Ссылка: http://cnx.org/content/m11714/latest/
Я написал C# реализации автокорреляции и других алгоритмов, которые читаются. Проверьте http://code.google.com/p/yaalp/.
http://code.google.com/p/yaalp/source/browse/ Содержит список файлов, и PitchDetection.cs - тот, который вам нужен.
(Проект GPL; поэтому понимайте условия, если используете код).
Гитарные тюнеры не используют FFT или DFT. Обычно они просто считают пересечения нуля. Вы можете не получить основную частоту, потому что некоторые сигналы имеют больше пересечений нуля, чем другие, но обычно вы можете получить кратность основной частоты таким образом. Этого достаточно, чтобы получить примечание, хотя вы можете быть на одну или несколько октав.
Низкочастотная фильтрация перед подсчетом пересечений нуля обычно позволяет избавиться от лишних пересечений нуля. Настройка фильтра нижних частот требует некоторого знания диапазона частот, который вы хотите обнаружить, хотя
БПФ (быстрые преобразования Фурье) действительно будут участвовать. БПФ позволяют аппроксимировать любой аналоговый сигнал суммой простых синусоидальных колебаний фиксированных частот и различных амплитуд. По сути, вы будете делать выборку и разбивать ее на пары амплитуды> частоты, а затем брать частоту, соответствующую наибольшей амплитуде.
Надеюсь, другой читатель SO сможет заполнить пробелы, которые я оставляю между теорией и кодом!
Чуть конкретнее:
Если вы начнете с необработанного PCM во входном массиве, у вас в основном будет график зависимости амплитуды волны от времени. Выполнение БПФ преобразует это в частотную гистограмму для частот от 0 до 1/2 входной частоты дискретизации. Значением каждой записи в массиве результатов будет "сила" соответствующей подчастоты.
Таким образом, чтобы найти корневую частоту, используя входной массив размера N, сэмплированный со скоростью S выборок / секунду
FFT(N, input, output);
max = max_i = 0;
for(i=0;i<N;i++)
if (output[i]>max) max_i = i;
root = S/2.0 * max_i/N ;
Извлечение основных частот в аудиосигнале PCM является сложной задачей, и о ней было бы много говорить...
В любом случае, обычно метод, основанный на времени, не подходит для полифонических сигналов, потому что сложная волна, заданная суммой различных гармонических составляющих из-за множества основных частот, имеет скорость пересечения нуля, которая зависит только от самой низкой частотной составляющей... Также в частотная область БПФ не является наиболее подходящим методом, так как разнос частот между нотами следует по экспоненциальной шкале, а не по линейной. Это означает, что постоянное разрешение по частоте, используемое в методе FFT, может быть недостаточным для разрешения примечаний с более низкой частотой, если размер окна анализа во временной области недостаточно велик.
Более подходящим методом было бы преобразование с постоянным Q, которое применяют DFT после процесса фильтрации нижних частот и прореживания на 2 (т. Е. Вдвое уменьшая частоту дискретизации каждого шага) сигнала, чтобы получить разные поддиапазоны с различной частотой. разрешающая способность. Таким образом, расчет DFT оптимизирован. Проблема в том, что разрешение по времени также является переменным и увеличивается для нижних поддиапазонов...
Наконец, если мы пытаемся оценить основную частоту одной ноты, методы БПФ / ДПФ в порядке. Ситуация меняется для полифонического контекста, в котором частички разных звуков перекрываются и суммируют / компенсируют свою амплитуду в зависимости от разности фаз, поэтому одиночный спектральный пик может принадлежать разным гармоническим содержимым (принадлежащим разным нотам). Корреляция в этом случае не дает хороших результатов...
Применить ДПФ и затем получить основную частоту из результатов. Поиск информации о DFT даст вам необходимую информацию - я бы связал вас с некоторыми, но они сильно различаются в ожидании знаний по математике.
Удачи.