2008-09-15 4 views
24

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

ответ

5

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

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

+3

Этот подход имеет серьезные проблемы с точностью, особенно в музыкальном контексте. Как указывает эндолит, FFT дает вам интенсивность в диапазоне частот; диапазон больше, чем меньше (и быстрее) размер окна FFT.Хуже того, общий диапазон составляет от 0 до 44100 Гц (для аудиорекордера), в то время как типичная музыкальная нота почти всегда намного ниже 1000 Гц, поэтому большая часть разрешения, которое у вас есть, теряется в более высоких частотных диапазонах. – MusiGenesis

1

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

Удачи.

4

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

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

+2

Я сомневаюсь, что они просто считают нулевые переходы. В типичном гитарном сигнале есть много пересечений ноль за цикл. http://www.flickr.com/photos/[email protected]/4180888094/ Они, вероятно, делают простую автокорреляцию. – endolith

+1

Больше нулевого пересечения на самом деле не имеет значения для простого тюнера. Помните, что тюнер не нуждается в точной частоте фундаментального. Он должен знать примечание. Считая больше перекрестков нуля за цикл, он может зависеть от более высокой октавы, но Cb по-прежнему будет Cb и два цента слишком высоки, все равно будет на два цента слишком высоким. Автокорреляция отлично подходит для более совершенной обработки, но для тюнера это слишком много. – Mendelt

4

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

Если начать с сырым 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 ; 
+0

Мне нравится краткая простота, но я подозреваю, что проблема связана с циклом for. Выход будет, конечно, не того же размера, что и вход – Waslap

+0

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

17

Существуют также и другие алгоритмы, которые в зависимости от времени, а не на основе частоты. Автокорреляция - относительно простой алгоритм определения высоты тона. Справка: 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, так что поняли термины, если вы используете код).

+2

Я хочу проголосовать за этот ответ несколько раз. БПФ - ужасное решение этой проблемы; это походит на вождение бака в продуктовый магазин. Конечно, это круто, но это действительно не лучший способ. Автокорреляция обычно считается ПРАВИЛЬНЫМ решением этой проблемы; vot Autotune/Melodyne/Singstar/вы называете это. Решения, основанные на нулевом пересечении, ТОЛЬКО ПРИМЕНЯЮТСЯ, когда у вас есть КОНКРЕТНЫЕ знания о гермоническом поведении. Автокорреляция может быть реализована очень эффективно. –

+5

Эй, что? Я не согласен. Решение частотной области абсолютно не является ужасным решением. Гармонический спектр продукта или цепстральные методы просты в применении и достаточно надежны. Автокорреляция не * обычно * считается ПРАВИЛЬНЫМ решением любыми способами; это одно из нескольких действительных решений. Правда, хотя: пересечение нуля не является надежным индикатором высоты тона. –

+1

Автокорреляция обычно более интенсивно вычислительна, чем БПФ. Мы часто используем FFT, чтобы делать автокорреляции, по сути, потому что это быстрее. Использование наивной автокорреляции, когда вы можете сделать это с помощью БПФ, - это как управлять танком через стенку продуктового магазина вместо использования входной двери. – endolith

19

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

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

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

Ни один из них не будет работать, если fundamental is missing, хотя. :)

я изложил несколько различных алгоритмов here и интерполированная FFT обычно является наиболее точным (хотя это работает только when the fundamental is the strongest harmonic - в противном случае вы должны быть умнее о поиске ее), с нуля, переездов второе место (хотя это работает только for waveforms with one crossing per cycle). Ни одно из этих условий не является типичным.

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

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

+1

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

3

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^