Подтвердить что ты не робот

Анализ Cepstral для определения высоты тона

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

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

  • принять FFT
  • взять лог квадрата абсолютного значения (может быть сделано с помощью таблицы поиска)
  • возьмите еще один FFT
  • принять абсолютное значение

Я пытаюсь использовать vDSP

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

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

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

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

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

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

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

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

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

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

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

Р

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

4b9b3361

Ответ 1

Хорошо, пропустите один за другим:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Есть ли какая-то опасность появления гармоник?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Наблюдайте заметный пик без DC в 12.36. Ширина кепстра составляет 1024 (выход второго БПФ), поэтому пик соответствует 1024/12.36 = 82.8 Гц, что очень близко к 82.4 Гц, истинная основная частота.

Cepstrum of synthetic E2 note

Теперь рассмотрим реальный акустический сигнал.

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

Cepstrum of acoustic guitar E2 note, not windowed

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

Cepstrum of acoustic guitar E2 note, Hann windowed

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

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

Литература:

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

Ответ 3

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

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

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

  • Возьмите буфер домена времени 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

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

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

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

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

Ответ 5

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

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

См. здесь подробное объяснение термина и математики en.wikipedia.org/wiki/Almost_periodic_function#Quasiperiodic_signals_in_audio_and_music_synthesis

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

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

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

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

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

  • www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html Pitch in Praat Краткое объяснение алгоритма обнаружения шага Praat. Это описывает алгоритм с именем "ac".
  • www.fon.hum.uva.nl/paul/praat.html Точный кратковременный анализ основной частоты и отношения гармоник к шуму отбираемого звука. Пол Боерсма. Труды IFA 17: 97-110.

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

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

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

  • Удалите DC из сигнала, который будет окончен (x - x_avg)
  • Окно сигнала с использованием функции конусности (он утверждает, что для него используется окно Ганна или, лучше, гауссово окно)
  • Автокорреляция сигнала
  • Разделите функцию автокорреляции с автокорреляцией используемого окна.
  • Peak-picking (аналогично предыдущим алгоритмам)

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

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

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

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

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

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

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

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

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

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

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