Cepstral Анализ для обнаружения основного тона - PullRequest
30 голосов
/ 03 января 2011

Я хочу извлечь тональные сигналы из звукового сигнала.

Кто-то в IRC только что объяснил мне, как это достигается благодаря двойному БПФ.В частности:

  1. принять БПФ
  2. взять журнал квадрата абсолютного значения (можно сделать с помощью справочной таблицы)
  3. взять другое БПФ
  4. взятьабсолютное значение

Я пытаюсь сделать это, используя vDSP

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

Я пытаюсь добиться этого с помощью библиотеки vDSP.Похоже, у него есть функции для решения всех этих задач.

Однако мне интересно узнать точность конечного результата.

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

Я беспокоюсь, что эта точность будет потеряна при использовании этой техники.Я представляю здесь.

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

Поскольку это потенциально сложный процесс, может кто-то с некоторым опытом просто посмотреть, что я делаю, и проверить его на здравомыслие?

Кроме того, я слышал, что есть альтернативная методика, включающая наложение квадратика на соседние корзины.Это сопоставимая точность?Если это так, я бы предпочел это, так как это не включает запоминание фаз бина.

Итак, вопросы:

  • имеет ли этот подход смысл?Можно ли его улучшить?
  • Я немного обеспокоен компонентом "log square";кажется, есть функция vDSP для этого: vDSP_vdbcon.Тем не менее, нет никаких признаков того, что он предварительно вычисляет лог-таблицу - я предполагаю, что это не так, поскольку функция FFT требует, чтобы явная функция предварительного вычисления была вызвана и передана в нее.И эта функция этого не делает.
  • Существует ли какая-либо опасность возникновения гармоник?
  • Есть ли какой-нибудь хитрый способ заставить vDSP извлекать максимумы, сначала самые большие?
  • Может кто-нибудь подсказать мне какие-нибудь исследования или литературу по этой технике?

  • главный вопрос: достаточно ли это точно?Можно ли улучшить точность?Мне только что сказал эксперт, что точность INDEED недостаточна.Это конец строки?

Pi

PS Меня раздражает, когда я хочу создать теги, но не могу.: |Я предложил сопровождающим, чтобы ТАК отслеживал предпринятые теги, но я уверен, что меня проигнорировали.Нам нужны теги для vDSP, ускорение фреймворка, кепстральный анализ

Ответы [ 5 ]

77 голосов
/ 27 августа 2011

Хорошо, давайте пройдемся по одному:

Я ищу, чтобы извлечь высоты звука из звукового сигнала.

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

То, что вы описываете, - это "кепстральный анализ", который используется в основном для извлечения высоты звука из речи .Кепстральный анализ полностью опирается на обилие и силу обертонов вашего сигнала.Например, если вы проведете чистую синусоидальную волну через кепстральный анализ, вы получите ужасные результаты.Однако для речи, которая является сложным сигналом, существует большое количество обертонов.(Между прочим, обертоны - это элементы сигнала, которые колеблются в кратных основной частоты, то есть в той высоте, которую мы воспринимаем).Цепстральный анализ может быть надежным при обнаружении речи с отсутствующей основной частотой .То есть предположим, что вы построили функцию sin (4x) + sin (6x) + sin (8x) + sin (10x) .Если вы посмотрите на это, то ясно, что оно имеет ту же частоту, что и функция sin (2x).Однако, если вы примените к этой функции анализ Фурье, ячейка, соответствующая sin (2x), будет иметь ноль величину.Таким образом, считается, что этот сигнал имеет «отсутствующую основную частоту», потому что он не содержит синусоиды частоты, которой мы считаем ее.Таким образом, простое выделение наибольшего пика в преобразовании Фурье не будет работать с этим сигналом.

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

Я беспокоюсь, что эта точность будет потеряна сэту технику я представляю здесь.

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

Если вы параболически интерполируете FFT блока данных 4098 с частотой 44100 Гц с шагом около 440 Гц, это будет означать, что он будет между 40-м (430,66 Гц) и 41-м (441,430664064) бином.Предполагая, что эта статья приблизительно верна в общем случае, она говорит, что параболическая интерполяция увеличивает разрешение более чем на один порядок.Это оставляет разрешение не менее 1 Гц, что является порогом человеческого слуха.На самом деле, если вы используете идеальное гауссовское окно, параболическая интерполяция будет точной на пиках (верно, точно. Помните, однако, что вы никогда не сможете использовать истинное гауссовское окно, потому что оно расширяется навсегда в обоихнаправления.) Если вы все еще беспокоитесь о том, чтобы получить более высокую точность, вы всегда можете дополнить БПФ.Это означает добавление нулей в конец БПФ перед преобразованием.Выясняется, что это эквивалентно "sinc-интерполяции", которая является идеальной функцией интерполяции для частотно-ограниченных сигналов.

Я полагаю, что этот метод можно использовать после второго БПФ для точного получения фундаментального значения.Но похоже, что информация теряется на шаге 2.

Это правильно.Метод фазового вокодера основан на том факте, что последовательные кадры связаны и имеют определенное фазовое соотношение.Однако логарифмическая величина FFT последовательных кадров не показывает не такое же соотношение с точки зрения фазы, поэтому было бы бесполезно использовать это преобразование для второго FFT.

  • имеет ли этот подход смысл?Можно ли его улучшить?

Да и да, в конце я остановлюсь на улучшении моего бита по автокорреляции.

  • I 'Я немного обеспокоен И логарифм квадратного компонента;Кажется, есть функция vDSP, которая делает именно это: vDSP_vdbcon, однако, нет никаких указаний на то, что она предварительно вычисляет таблицу журналов - я предполагаю, что это не так, поскольку функция FFT требует, чтобы явная функция предварительного вычисления была вызвана и переданавнутрь.и эта функция этого не делает.

Я не знаю специфики библиотеки vDSP, извините.

  • Есть ли какая-то опасностьгармоники подбираются?

В вашей оригинальной методике выбора пиков фазоводного вокодера?да.С кепстральным методом?нет, не совсем, все дело в том, что он рассматривает все гармоники, чтобы получить свою оценку частоты.Например, скажем, наша частота равна 1. Наши обертоны - 2,3,4,5,6,7,8,9, и т. Д. Мы должны были бы убрать все нечетные гармоники, т.е. оставить 2,4,6,8 и т. Д., и удаляют основную частоту до того, как ее начнут путать с одним из ее обертонов.

  • Есть ли какой-нибудь хитрый способ заставить vDSP отключитьсямаксимумы, сначала самые большие?

Не знаю vDSP, но в общем случае вы обычно просто перебираете все из них и отслеживаете самые большие.

  • Может кто-нибудь подсказать мне какие-нибудь исследования или литературу по этой технике?

Ссылка, которую я дал вам в комментарии, казалась хорошей.

Кроме того, этот веб-сайт предлагает невероятно глубокое и удивительно широкое объяснение тем DSP, включая все виды извлечения высоты тона, манипуляции и т. Д., Как теоретическим, так и практическим способом.( this является более общей ссылкой на индекс на сайте).Я всегда возвращаюсь к этому.Иногда это может быть немного ошеломляющим, если вы прыгаете в середину, но вы всегда можете следовать каждому объяснению до основных строительных блоков.

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

На практике корреляция со всеми этими задержанными по времени копиями сигнала идет медленно. Вместо этого он обычно реализуется следующим образом (что математически эквивалентно):

Zero-Pad это удвоить его оригинальную длину. Возьмите БПФ. Затем замените все коэффициенты их квадратной величиной, кроме первого, для которого вы установили 0. Теперь возьмите IFFT. Разделите каждый элемент на первый. Это дает вам автокорреляцию. Математически вы используете теорему о круговой свертке (посмотрите на нее) и используете заполнение нулями для преобразования задачи линейной свертки в задачу с круговой сверткой, которая может быть эффективно решена.

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

Это само по себе даст вам очень хорошее обнаружение высоты звука по всем критериям. Тем не менее, иногда вы можете столкнуться с проблемой с делением высоты вдвое и удвоением высоты. В основном проблема заключается в том, что если сигнал повторяется каждую 1 секунду, он также повторяется каждые две секунды. Точно так же, если у него очень сильный обертон, вы можете получить высоту , делающую пополам . Так что самая большая вершина не всегда может быть той, которую вы хотите. Решением этой проблемы является алгоритм MPM Филиппа Маклеода. Идея такова:

Вместо того, чтобы выбирать самый большой пик, вы хотите выбрать первый пик, который является достаточно большим, чтобы его можно было рассмотреть. Как вы определяете, является ли пик достаточно большим, чтобы его можно было рассмотреть? Если он, по крайней мере, столь же высок, как и A *, самый большой пик, где A - некоторая постоянная величина. Я думаю, что Филипп предлагает значение А около 0,9. На самом деле программа, которую он написал, Tartini, позволяет сравнивать несколько разных алгоритмов определения высоты звука в реальном времени. Я настоятельно рекомендую загрузить и попробовать его (он реализует Cepstrum, прямую автокорреляцию и MPM): (если у вас возникли проблемы со сборкой, попробуйте инструкции здесь .

И последнее, что я должен отметить, - это управление окнами. В общем, подойдет любое гладкое окно. Окно Ханнинга, окно Хэмминга и т. Д. Надеюсь, вы должны знать, как окно. Я бы также предложил сделать перекрывающиеся окна, если вы хотите более точные временные измерения.

Кстати, классное свойство автокорреляции состоит в том, что если частота линейно изменяется в измеряемой оконной секции, она даст вам правильную частоту в центре окна.

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

Если вы ищете дополнительную информацию, как всегда, Google - ваш друг.Хорошие условия поиска: автокорреляция, определение высоты тона, отслеживание высоты тона, извлечение высоты тона, оценка высоты тона, кепстр и т. Д.

8 голосов
/ 13 февраля 2013

Это краткий анализ кепстра, используемого для определения высоты тона.

Сначала давайте рассмотрим синтетический сигнал.

На графике ниже показан Cepstrum синтетической стационарной ноты E2, синтезированной с использованием типичного компонента, близкого к постоянному току, основного тона при 82,4 Гц и 8 гармоник при целых кратных 82,4 Гц. Синтетическая синусоида была запрограммирована для генерации 4096 образцов.

Соблюдайте заметный пик без постоянного тока на 12,36. Ширина Cepstrum равна 1024 (выход второго БПФ), поэтому пик соответствует 1024 / 12,36 = 82,8 Гц, что очень близко к 82,4 Гц истинной основной частоте.

Cepstrum of synthetic E2 note

Теперь давайте рассмотрим реальный слуховой сигнал.

На графике ниже показан Cepstrum реальной ноты E2 для акустической гитары. Сигнал не был оконным до первого БПФ. Соблюдайте заметный пик без постоянного тока на 542,9. Ширина Cepstrum равна 32768 (выход второго БПФ), поэтому пик соответствует 32768 / 542,9 = 60,4 Гц, что довольно далеко от 82,4 Гц истинной основной частоты.

Cepstrum of acoustic guitar E2 note, not windowed

На графике ниже показан Cepstrum той же ноты E2 той же настоящей акустической гитары, но на этот раз сигнал был обработан Ханном до первого FFT. Соблюдайте заметный пик без постоянного тока на 268,46. Ширина Cepstrum равна 32768 (выход второго БПФ), поэтому пик соответствует 32768 / 268,46 = 122,1 Гц, что еще дальше от 82,4 Гц истинной основной частоты.

Cepstrum of acoustic guitar E2 note, Hann windowed

Нота акустической гитары E2, использованная для этого анализа, была дискретизирована на частоте 44,1 кГц с высококачественным микрофоном в студийных условиях, она практически не содержит фонового шума, никаких других инструментов или голосов и никакой постобработки.

Это иллюстрирует значительную проблему использования Cepstral анализа для определения высоты звука в реальных акустических сигналах.

Ссылки:

Реальные данные аудиосигнала, генерация синтетического сигнала, графики, БПФ и Cepstral анализ были сделаны здесь: Кепстр музыкального инструмента

5 голосов
/ 03 января 2011

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

Что касается квадратичного соответствия, это упоминается в этой статье Теда Ноултона, которая недавно возникла в другом вопросе SO, но я никогда не использовал его.

Я должен добавить, чтотехника квадратичного подбора, по крайней мере, как указано в справке от Knowlton, зависит от использования прямоугольного окна на первом БПФ.Как объяснил Пол R в другом из ваших вопросов, если вы выполняете обработку звука, вы должны использовать окно Ханна или Хемминга на первом БПФ.Поэтому я думаю, что общий алгоритм может выглядеть следующим образом:

  • Возьмите буфер временной области x, сделайте копию в виде окна w.
  • Sx = FFT(x), Sw = FFT(w)
  • c = Log of square magnitude of Sw
  • Cx = FFT(c)
  • Оцените фундаментальные (и, возможно, гармонические) значения, используя Cx
  • Используйте Sw, чтобы сделать хитрый фазовый трюк на фундаментальном(или) высшая гармоника) ячейка (и)
  • и / или использование Sx для подбора квадратичной ячейки вокруг основной (или высшей гармоники)

Примечание (or higher harmonic) применяется, еслиу вас действительно есть подавленные основы.

И я упомянул об этом в вашем другом вопросе, но с чего вы взяли, что журнал требует справочную таблицу?Почему бы просто не вызвать функцию журнала?Я полагаю, что время, затрачиваемое двумя БПФ (O (n * logn)), затмевает любую другую обработку, которую вы можете выполнить.

4 голосов
/ 04 января 2011

Анализ кепстра - это форма гомоморфной обработки, описанная в книге Оппенхайма и Шафера «Обработка сигналов с дискретным временем». Когда-то считалось полезным для отделения частоты возбудителя от огибающей формент (возможно, до сих пор, не знаю). Кажется, что он работает лучше, когда дано достаточно длинное окно стационарных данных.

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

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

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

3 голосов
/ 13 февраля 2014

Этот ответ предназначен для прочтения в дополнение к посту Джереми Сальвена, а также для ответа на вопрос о литературе.

Прежде всего, важно рассмотреть, какова периодичность сигнала.Является ли сигнал ближе к полностью периодическому сигналу для данного окна анализа.

Подробное объяснение термина и математики см. Здесь https://en.wikipedia.org/wiki/Almost_periodic_function#Quasiperiodic_signals_in_audio_and_music_synthesis

Короткий ответ: еслидля данного окна анализа сигнал является полностью периодическим, или если сигнал является квазипериодическим, и окно анализа является достаточно маленьким, чтобы периодичность достигалась, тогда автокорреляции достаточно для задачи.Примеры сигналов, которые удовлетворяют этим условиям:

  • Чистый синусоидальный тон
  • Струнные инструменты с длинными сустейнами и стабильной высотой звука (без вибрато), особенно верно в части сустейна, не так вернона переходных процессах.
  • Удушительные инструменты, которые дуют достаточно долго.

Примеры сигналов, которые не удовлетворяют этим условиям:

  • Ударные звуки
  • Струнные или духовые инструменты, играемые с каждой нотой, которая держится очень коротко или меняется в течение короткого времени
  • Сложная музыка или, в основном, комбинация нескольких инструментов, играемых на разных тонах.

Для обнаружения основного тона с использованием автокорреляции в Praat есть учебное пособие:

  • http://www.pinguinorodriguez.cl/blog/pitch-in-praat/ Pitch in Praat Краткое описание алгоритма определения основного тона Praat,Здесь описывается алгоритм с именем 'ac'.
  • www.fon.hum.uva.nl / paul / praat.html Точный кратковременный анализ основной частоты и отношения гармоник к шуму выборки.звук.Пол БурсмаIFA Proceedings 17: 97-110.

В документе подробно описывается использование несмещенной автокорреляции (термин, используемый Джереми Сальвеном) для обнаружения основного тона, а также показано, что он превосходит смещенныйавтокорреляция для определения высоты тона.Хотя в нем отмечается, что результаты автокорреляции значимы только для половины размера окна, вычислять вторую половину не нужно.

Смещенная автокорреляция выполняется путем оконного преобразования сигналов с использованием сужающегося окна, а затемделаю автокорреляцию.Это уменьшает влияние низкочастотной модуляции (изменение амплитуды в медленном масштабе времени), которая наносит ущерб обнаружению основного тона, поскольку в противном случае части с большей амплитудой будут давать больший коэффициент автокорреляции, который будет предпочтительным.

Алгоритм, используемый в работе Бурсма, может быть описан в 5 шагов:

  1. Удаление постоянного тока из сигнала, который будет оканчиваться (x - x_avg)
  2. Окно сигнала с помощью функции сужения(Он утверждает, что для него используется окно Ханна, или, лучше, гауссовское окно) *
  3. Автокоррелирует сигнал
  4. Разделите автокорреляционную функцию на автокорреляцию используемого окна.
  5. Выбор пика (аналогично предыдущим алгоритмам)

Важно отметить, что окно будет стремиться к нулю с обоих концов, а автокорреляция окна также будет стремиться к нулю.Вот почему вторая половина беспристрастной автокорреляции бесполезна, это деление на ноль около конца окна.

Далее идет Инь: - Де Шевинье, Ален и Хидеки Кавахара.«Инь, фундаментальный частотный оценщик речи и музыки».Журнал Акустического общества Америки 111.4 (2002): 1917-1930.

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

Последнее - это SNAC и WSNAC Филиппа Маклеода (ужесвязан Джереми Салвеном):

  • Philip McLeod, Быстрые, точные инструменты определения высоты тона для анализа музыки, кандидатская диссертация, факультет компьютерных наук, Университет Отаго, 2008.
  • Маклеод. P, Wyvill. G, "Разумный способ найти поле", учеб. Международная конференция по компьютерной музыке, Барселона, Испания, 5-9 сентября 2005 г., стр. 138-141.
  • Маклеод. P, Wyvill. G, "Визуализация музыкальной смолы", учеб. Computer Graphics International, Токио, Япония, 9-11 июля 2003 г., стр. 300-303.

Их можно найти на miracle.otago.ac.nz/tartini/papers.html

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

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

Джереми Салвен:

То есть, предположим, вы построили функцию sin (4x) + sin (6x) + sin (8x) + sin (10x). Если вы посмотрите на это, то ясно, что оно имеет ту же частоту, что и функция sin (2x). Однако, если вы примените к этой функции анализ Фурье, ячейка, соответствующая sin (2x), будет иметь нулевую величину. Таким образом, считается, что этот сигнал имеет «отсутствующую основную частоту», поскольку он не содержит синусоиды частоты, которой мы считаем ее.

Я хотел бы доказать, что хотя данный сигнал является периодическим при \ omega = 2, он не совпадает с частотой, равной функции sin (2x). Как показывает анализ Фурье, компонент sin (2x) имеет нулевую величину. Это связано с тем, что существует связь между высотой тона, частотой и основной частотой сигнала, но они различны и не взаимозаменяемы. Важно помнить, что высота звука является субъективным измерением, что она зависит от человека как человека, который его воспринимает. Похоже, что он имеет ту же частоту, что и грех (2х), именно так мы воспринимаем это визуально. Тот же эффект также происходит аналогичным образом в отношении восприятия высоты звука и звука. Пример, который сразу пришёл в голову, - это Beats, то есть воспринимаемая высота звука, которая слышна, когда есть две синусоидальные точки с близкими, но разными частотами.

...