Как использовать кепстраль? - PullRequest
5 голосов
/ 07 февраля 2011

Недавно я задал этот вопрос: Как получить основную частоту от БПФ? (вам на самом деле не нужно ее читать)

Мое сомнение сейчас это: как использовать алгоритм кепстрал?

Я просто не знаю, как его использовать, потому что единственный язык, который я знаю, это ActionScript 3, и по этой причине у меня мало ссылок на родные функции, найденные в C, Java и т. Д., И на то, как я должен реализовать их на AS. Большинство статей об этих языках = / (хотя, приветствуются ответы на языках, отличных от AS , просто объясните, как работает скрипт)

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

сигнал → FT → abs () → квадрат → log → FT → abs () → квадрат → энергетический кепстр

математически: | F {журнал (| F {е (т)} | ²)} | ²

Важная информация:

  • Я занимаюсь разработкой GUITAR TUNER во флэш-памяти
  • Впервые я имею дело с продвинутым звуком
  • Я использую БПФ для извлечения частотных интервалов из сигнала, который достигает микрофона пользователя, но я застрял в получении основной частоты от него

Я не знаю:

  • Как применить квадрат в массиве (я имею в виду, что данные, которые дает мне мой FFT, являются массивом. Должен ли я умножить его сам? Отладка ActionScript выдает ошибки при попытке выполнить fftResults * fftResults)
  • Как применить «журнал». Я бы не знал, как его применить, даже если бы у меня был один номер.
  • В чем разница между комплексным кепстральным и властным кепстральным. Кроме того, какой из них я должен использовать? Я пытаюсь разработать гитарный тюнер.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Обратите внимание, что вывод БПФ представляет собой массив комплексных значений, то есть каждый бин = re + j*im. Я думаю, что вы можете просто объединить abs и квадратные операции и вычислить re*re + im*im для каждого бина. Это дает вам одно положительное значение для каждой ячейки, и, очевидно, вы можете довольно легко вычислить значение для каждой ячейки. Затем вам нужно сделать второе БПФ для этих данных квадрата журнала и снова, используя выходные данные этого второго БПФ, вы будете вычислять re*re + im*im для каждого бина. Затем у вас будет массив положительных значений, который будет иметь один или несколько пиков, представляющих основную частоту или частоты вашего входа.

2 голосов
/ 09 февраля 2011

Автокорреляция - это самый простой и логичный подход, который лучше всего начинать.

Чтобы это заработало, начните с простой автокорреляции , а затем, при необходимости, улучшите ее, следуя схеме, предоставленной YIN. (Инь основан на автокорреляции с уточнениями. Но понадобятся ли вам эти уточнения или нет, зависит от деталей вашей ситуации.) Таким образом, вы также можете учиться на ходу, а не пытаться понять все это в одном кадре.

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

1 голос
/ 07 февраля 2011

Есть много способов найти основную частоту (F0).

Для таких языков, как Java и т. Д., Есть много библиотек с уже реализованными алгоритмами такого типа (вы можете изучить их источники).

  • MFCC (на основе cepstral) реализован в Comirva (с открытым исходным кодом).
  • Audacity (бета-версия!) (С открытым исходным кодом) представляет кепстр, автокорреляцию, улучшенную автокорреляцию,
  • Инь на основе автокорреляции ( пример )
  • Поискмаксимальные значения сигнала после FFT

Все эти алгоритмы могут быть очень полезны для вас.Однако самый простой способ получить F0 (одно значение в Гц) - это использовать Инь.

...