Подтвердить что ты не робот

Как вы анализируете основную частоту образца PCM или WAV?

У меня есть образец, хранящийся в буфере от DirectX. Это образец заметки, которую играют и захватывают с инструмента. Как я могу анализировать частоту выборки (например, гитарный тюнер)? Я считаю, что FFT участвуют, но у меня нет указателей на HOWTO.

4b9b3361

Ответ 1

БПФ может помочь вам определить, где частота, но она не может точно сказать, что такое частота. Каждая точка в БПФ - это "бит" частот, поэтому, если есть пик в вашем БПФ, все, что вы знаете, это то, что частота, которую вы хотите, находится где-то внутри этого бункера или диапазона частот.

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

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

Ни одно из них не будет работать, если отсутствует basic..:)

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

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

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

Ответ 2

Существуют и другие алгоритмы, основанные на времени, а не основанные на частоте. Автокорреляция - относительно простой алгоритм определения высоты тона. Ссылка: http://cnx.org/content/m11714/latest/

Я написал С# реализаций автокорреляции и других доступных алгоритмов. Проверьте http://code.google.com/p/yaalp/.

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio Перечисляет файлы, а PitchDetection.cs - тот, который вы хотите.

(Проект GPL, так что понимайте термины, если используете код).

Ответ 3

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

Надеюсь, еще один SO-читатель сможет заполнить пробелы, которые я оставляю между теорией и кодом!

Ответ 4

Гитарные тюнеры не используют FFT или DFT. Обычно они просто считают нулевые переходы. Вы не можете получить основную частоту, потому что у некоторых осциллограмм больше пересечений нуля, чем у других, но вы обычно можете получить кратность основной частоты. Этого достаточно, чтобы получить заметку, хотя вы можете отключить одну или несколько октав.

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

Ответ 5

Чуть более конкретно:

Если вы начинаете с необработанного PCM во входном массиве, то у вас в основном есть график амплитуды волны против времени. БПФ преобразует это в частотную гистограмму для частот от 0 до 1/2, входную частоту дискретизации, Значение каждой записи в массиве результатов будет "силой" соответствующей подчастоты.

Итак, чтобы найти частоту корня, заданную входным массивом размера N, отобранным на S samples/second:

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 ;

Ответ 6

Извлечение фундаментальных частот в аудиосигнале ИКМ является сложной задачей, и о ней многое будет говорить...

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

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

Наконец, если мы пытаемся оценить основную частоту одной ноты, методы FFT/DFT в порядке. Вещи меняются для полифонического контекста, в котором частичные части разных звуков перекрываются и суммируют/отменяют их амплитуду в зависимости от их разности фаз, и поэтому один спектральный пик может принадлежать различным гармоническим содержимым (принадлежащим разным нотам). Корреляция в этом случае не дает хороших результатов...

Ответ 7

Примените DFT, а затем выведите основную частоту из результатов. Поиск в Google DFT-информации даст вам необходимую информацию - я бы связал вас с кем-то, но они сильно отличаются ожиданиями математического знания.

Удачи.