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





music signal-processing fft pitch-tracking (7)


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

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

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

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

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




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

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




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

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

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

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




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

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

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

Однако ни одно из них не будет работать, если фундаментальное значение отсутствует . :)

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

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

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




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

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




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

Если вы начинаете с необработанного 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 ;



Проверьте это

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile( loss = "categorical_crossentropy", 
               optimizer = sgd, 
               metrics=['accuracy']
             )

Ознакомьтесь с documentation

У меня были лучшие результаты с MNIST





audio music signal-processing fft pitch-tracking