Хотя я не эксперт и имеюпрошел минимальную формальную подготовку, думаю, я знаю лучший ответ на эту проблему.За последние несколько лет я провел много поиска, чтения и экспериментов.Я согласен с тем, что метод автокорреляции является на сегодняшний день лучшим детектором основного тона с точки зрения компромисса между точностью, сложностью, помехоустойчивостью и скоростью.Если у вас нет особых обстоятельств, я бы почти всегда рекомендовал использовать автокорреляцию.Подробнее об этом позже позвольте мне ответить на другие ваши вопросы.
То, что вы описываете, - это "кепстральный анализ", который используется в основном для извлечения высоты звука из речи .Кепстральный анализ полностью опирается на обилие и силу обертонов вашего сигнала.Например, если вы проведете чистую синусоидальную волну через кепстральный анализ, вы получите ужасные результаты.Однако для речи, которая является сложным сигналом, существует большое количество обертонов.(Между прочим, обертоны - это элементы сигнала, которые колеблются в кратных основной частоты, то есть в той высоте, которую мы воспринимаем).Цепстральный анализ может быть надежным при обнаружении речи с отсутствующей основной частотой .То есть предположим, что вы построили функцию 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 - ваш друг.Хорошие условия поиска: автокорреляция, определение высоты тона, отслеживание высоты тона, извлечение высоты тона, оценка высоты тона, кепстр и т. Д.