Хорошо, давайте пройдемся по одному:
Я ищу, чтобы извлечь поля из звукового сигнала.
Хотя я не эксперт и прошел минимальное формальное обучение, я думаю, что знаю лучший ответ на эту проблему. За последние несколько лет я много искал, читал и экспериментировал. Я согласен с тем, что метод автокорреляции безусловно является лучшим детектором основного тона с точки зрения компромисса между точностью, сложностью, устойчивостью к шуму и скоростью. Если у вас нет особых обстоятельств, я бы почти всегда рекомендовал использовать автокорреляцию. Подробнее об этом позже, позвольте мне ответить на ваши другие вопросы.
То, что вы описываете, называется «кепстральным анализом», который в основном используется для извлечения высоты тона из речи. Кепстральный анализ полностью зависит от обилия и силы обертонов вашего сигнала. Если, например, вы пропустите чистую синусоиду через кепстральный анализ, вы получите ужасные результаты. Однако для речи, которая представляет собой сложный сигнал, имеется большое количество обертонов. (кстати, обертоны — это элементы сигнала, которые колеблются с частотой, кратной основной частоте, т. е. воспринимаемому нами тону). Кепстральный анализ может быть надежным средством обнаружения речи с отсутствующей основной частотой. То есть, предположим, вы построили график функции sin(4x)+sin(6x)+sin(8x)+sin(10x). Если вы посмотрите на это, станет ясно, что она имеет ту же частоту, что и функция sin(2x). Однако, если применить к этой функции анализ Фурье, бин, соответствующий sin(2x), будет иметь нулевую величину. Таким образом, считается, что этот сигнал имеет «отсутствующую основную частоту», потому что он не содержит синусоиды частоты, которую мы считаем. Таким образом, простой выбор самого большого пика на преобразовании Фурье не будет работать с этим сигналом.
Ранее я использовал метод, который просматривает частотные элементы одного БПФ для локальных максимумов. когда он сталкивается с одним из них, он использует хитрый метод (изменение фазы с момента последнего БПФ), чтобы более точно поместить фактический пик в ячейку.
То, что вы описываете, - это метод фазового вокодера для более точного измерения частоты данного частного. Однако базовая техника выбора самого большого бина вызовет у вас проблемы, если вы используете сигнал с отсутствующей или слабой составляющей основной частоты.
Я беспокоюсь, что эта точность будет потеряна с помощью техники, которую я здесь представляю.
Прежде всего, помните, что метод фазового вокодера более точно измеряет частоту одного партиала. Он игнорирует информацию, содержащуюся в более высоких частях о основной частоте. Во-вторых, при приличном размере БПФ вы можете получить очень хорошую точность, используя пиковую интерполяцию. Кто-то еще здесь указал вам на параболическую интерполяцию. Я также предложил бы это.
Если вы параболически интерполируете БПФ блока данных из 4098 выборок с частотой 44 100 Гц с шагом около 440 Гц, это будет означать, что он будет находиться между 40-м (430,66 Гц) и 41-м (441,430664064) бинами. Предполагая, что эта статья приблизительно верна в общем случае, в ней говорится о параболической интерполяции увеличивает разрешение более чем на порядок. Это оставляет разрешение не менее 1 Гц, что является порогом человеческого слуха. На самом деле, если вы используете идеальное гауссово окно, параболическая интерполяция будет точной на пиках (верно, точной. Помните, однако, что вы никогда не сможете использовать истинное гауссово окно, потому что оно бесконечно расширяется в в обоих направлениях.) Если вы все еще беспокоитесь о повышении точности, вы всегда можете дополнить БПФ. Это означает добавление нулей в конец БПФ перед преобразованием. Получается, что это эквивалентно «синхронной интерполяции», которая является идеальной функцией интерполяции для сигналов с ограниченной частотой.
Я предполагаю, что эту технику можно было бы использовать после второго БПФ, чтобы получить точное фундаментальное значение. Но похоже, что информация потеряна на шаге 2.
Это правильно. Метод фазового вокодера основан на том факте, что последовательные кадры соединены и имеют определенное фазовое соотношение. Однако логарифмическая величина БПФ последовательных кадров не показывает ту же взаимосвязь с точки зрения фазы, поэтому было бы бесполезно использовать это преобразование для второго БПФ.
- имеет ли этот подход смысл? Можно ли его улучшить?
Да и да, в конце я подробно расскажу об улучшении автокорреляции.
- Я немного беспокоюсь о компоненте логарифмического квадрата; Кажется, есть функция vDSP, которая делает именно это: vDSP_vdbcon, однако нет никаких указаний на то, что она предварительно вычисляет таблицу журналов — я предполагаю, что это не так, поскольку функция БПФ требует, чтобы вызывалась и передавалась явная функция предварительного расчета. внутрь. а этой функции нет.
Я не знаю специфики библиотеки vDSP, извините.
- Есть ли опасность захвата гармоник?
В вашей оригинальной технике пикового пика фазового вокодера? да. Кепстральным методом? нет, не совсем, все дело в том, что он учитывает все гармоники, чтобы получить оценку частоты. Например, предположим, что наша частота равна 1. Наши обертоны 2,3,4,5,6,7,8,9 и т. д. Мы должны убрать все нечетные гармоники, т.е. оставить 2,4,6, 8 и т. д., и удалите основную частоту, прежде чем ее начнут путать с одним из ее обертонов.
- Есть ли какой-нибудь хитрый способ заставить vDSP вытягивать максимумы, сначала самые большие?
Не знаю vDSP, но в общем случае вы обычно просто перебираете их все и отслеживаете самые большие.
- Может ли кто-нибудь указать мне на некоторые исследования или литературу по этой технике?
Ссылка П., которую я дал вам в комментарии, показалась хорошей.
Кроме того, этот веб-сайт предлагает невероятно глубокое и удивительно широкое объяснение DSP. темы, включая все виды извлечения высоты тона, манипуляции и т. д., как в теоретическом, так и в практическом плане. (это более общая ссылка на указатель на сайте). Я всегда ловлю себя на том, что возвращаюсь к нему. Иногда это может быть немного ошеломляюще, если вы прыгнете в середину, но вы всегда можете следовать каждому объяснению, возвращаясь к основным строительным блокам.
Теперь об автокорреляции. В основном техника такова: вы берете свой (оконный) сигнал и задерживаете его на разное время. Найдите сумму, которая лучше всего соответствует исходному сигналу. Это фундаментальный период. Это имеет большой теоретический смысл. Вы ищете повторяющиеся части вашего сигнала.
На практике получение корреляции со всеми этими задержанными во времени копиями сигнала происходит медленно. Обычно это реализуется таким образом (что математически эквивалентно):
Обнулите его, чтобы удвоить его первоначальную длину. Возьмите БПФ. Затем замените все коэффициенты их квадратными величинами, кроме первого, который вы установили равным 0. Теперь возьмите IFFT. Разделите каждый элемент на первый. Это дает вам автокорреляцию. Математически вы используете теорему о круговой свертке (поищите ее) и используете заполнение нулями для преобразования задачи линейной свертки в задачу круговой свертки, которую можно эффективно решить.
Однако будьте осторожны при выборе вершины. При очень малых задержках сигнал будет очень хорошо согласовываться с самим собой просто потому, что он непрерывен. (Я имею в виду, что если вы задержите его до нуля, он идеально коррелирует сам с собой). Вместо этого выберите самый большой пик после первого пересечения нуля. Вы можете параболически интерполировать функцию автокорреляции, а также другие методы, чтобы получить гораздо более точные значения.
Это само по себе даст вам очень хорошее определение высоты тона по всем критериям. Однако иногда вы можете столкнуться с проблемой половинного и удвоения высоты тона. В основном проблема заключается в том, что если сигнал повторяется каждую секунду, он также повторяется каждые две секунды. Точно так же, если у него очень сильный обертон, вы можете уполовинить высоту тона. Таким образом, самый большой пик не всегда может быть тем, который вам нужен. Решением этой проблемы является алгоритм MPM Филиппа Маклеода. Идея такова:
Вместо того, чтобы выбирать самый большой пик, вы хотите выбрать первый пик, который достаточно велик, чтобы его можно было рассмотреть. Как определить, достаточно ли велик пик, чтобы его можно было рассмотреть? Если он не меньше A*, то самый большой пик, где A — некоторая константа. Филипп предлагает значение A около 0,9, я думаю. На самом деле написанная им программа Tartini позволяет сравнивать несколько различных алгоритмов определения высоты тона в режиме реального времени. Я настоятельно рекомендую загрузить его и попробовать (в нем реализованы Cepstrum, прямая автокорреляция и MPM). ): (если у вас возникли проблемы со сборкой, воспользуйтесь инструкциями здесь а>.
Последнее, что я должен отметить, касается работы с окнами. В общем, подойдет любое гладкое окно. Окно Ханнинга, окно Хэмминга и т. д. Надеюсь, вы знаете, как работать с окном. Я бы также предложил делать перекрывающиеся окна, если вам нужны более точные временные измерения.
Между прочим, классным свойством автокорреляции является то, что если частота изменяется линейно в измеряемой области окна, она даст правильную частоту в центре окна.
И еще: то, что я описал, называется смещенной автокорреляционной функцией. Это связано с тем, что при более высоких временных задержках перекрытие между исходным сигналом и версией с временной задержкой становится все меньше и меньше. Например, если вы посмотрите на окно размером N, в котором были задержаны N-1 сэмплов, вы увидите, что перекрывается только один сэмпл. Таким образом, корреляция при этой задержке явно будет очень близкой к нулю. Вы можете компенсировать это, погружая каждое значение функции автокорреляции на количество перекрывающихся отсчетов, чтобы получить его. Это называется несмещенной автокорреляцией. Однако, как правило, при этом вы получите худшие результаты, так как более высокие значения задержки автокорреляции очень зашумлены, так как они основаны всего на нескольких выборках, поэтому имеет смысл взвешивать их меньше.
Если вам нужна дополнительная информация, как всегда, Google вам в помощь. Хорошие условия поиска: автокорреляция, обнаружение основного тона, отслеживание основного тона, извлечение основного тона, оценка основного тона, кепстр и т. д.
person
Jeremy Salwen
schedule
27.08.2011