FFT Pitch Detection - извлечение мелодии
Я создаю программу обнаружения основного тона, которая извлекает основную частоту из спектра мощности, полученного из БПФ кадра. Это то, что я до сих пор:
- разделить входной аудиосигнал на кадры.
- умножить кадр с окном Хэмминга
- вычислить БПФ и величину кадра sqrt(реальное ^2 + img^2)
- найти основную частоту (пик) по спектру гармонических произведений
- преобразовать частоту пика (частоту дискретизации) в примечание (например, ~440 Гц - A4)
Теперь программа выдает целое число со значением от 0 до 87 для каждого кадра. Каждое целое число соответствует примечанию фортепьяно согласно формуле, которую я нашел здесь. Сейчас я пытаюсь имитировать мелодии во входном сигнале, синтезируя звуки на основе рассчитанных нот. Я попытался просто создать синусоидальную волну с амплитудой и частотой, соответствующей основной частоте, но результат звучал совсем не так, как оригинальный звук (почти звучал как случайные гудки).
Я не очень понимаю музыку, поэтому, основываясь на том, что у меня есть, могу ли я генерировать звук с мелодиями, похожими на вход (инструмент, голос, инструмент + голос), основываясь на информации, которую я получаю с основной частоты? Если нет, то какие другие идеи я могу попробовать использовать код, который у меня есть на данный момент.
Спасибо!
4 ответа
Это во многом зависит от музыкального контента, с которым вы хотите работать - извлечение высоты тона монофонической записи (т. Е. Одного инструмента или голоса) - это не то же самое, что извлечение высоты тона одного инструмента из полифонической смеси (например, извлечение тона мелодия из полифонической записи).
Для извлечения монофонического тона есть различные алгоритмы, которые вы можете попробовать реализовать как во временной, так и в частотной области. Несколько примеров включают в себя Инь (временная область) и HPS (частотная область), ссылки на дополнительную информацию об обоих приведены в Википедии:
Однако ни один из них не будет работать хорошо, если вы хотите извлечь мелодию из полифонического материала. Извлечение мелодии из полифонической музыки все еще является проблемой исследования, и нет простого набора шагов, которые вы можете выполнить. Существует несколько инструментов, предоставляемых исследовательским сообществом, которые вы можете опробовать (только для некоммерческого использования), а именно:
И, наконец, при синтезе вашего выхода я бы рекомендовал синтезировать непрерывную кривую основного тона, которую вы извлекаете (самый простой способ сделать это - оценить высоту звука каждые X мс (например, 10) и синтезировать синусоидальную волну, которая меняет частоту каждые 10 мс, обеспечивая непрерывную фазу). Это сделает ваш результат более естественным, и вы избежите дополнительной ошибки, связанной с квантованием непрерывной кривой основного тона в дискретные ноты (что само по себе является другой проблемой).
Вы, вероятно, не хотите выбирать пики из БПФ для расчета высоты тона. Вы, вероятно, хотите использовать автокорреляцию. Я написал длинный ответ на очень похожий вопрос здесь: Cepstral Analysis для обнаружения основного тона
Ваш метод может работать для синтетической музыки, используя ноты, синхронизированные для соответствия времени и длине кадра БПФ, и используя только звуки ноты, полный спектр которых совместим с вашей оценкой высоты тона HPS. Ничто из этого не относится к обычной музыке.
В более общем случае автоматическая транскрипция музыки все еще остается проблемой для исследования, поскольку не существует простого 5-шагового решения. Пек является человеческим психоакустическим явлением. Люди будут слышать заметки, которые могут присутствовать или не присутствовать в местном спектре. Алгоритм оценки высоты тона HPS намного более надежен, чем использование пика БПФ, но все равно может не работать для многих видов музыкальных звуков. Кроме того, БПФ любых кадров, которые пересекают границы нот или переходные процессы, может не содержать четкого единого шага для оценки.
Ваш подход не будет работать ни для какого общего музыкального примера по следующим причинам:
Музыка по самой своей природе динамична. Это означает, что каждый звук, присутствующий в музыке, модулируется различными периодами молчания, атаки, сустейна, затухания и снова молчания, иначе называемыми огибающей звука.
Ноты музыкальных инструментов и человеческие вокальные ноты не могут быть должным образом синтезированы одним тоном. Эти ноты должны быть синтезированы фундаментальным тоном и множеством гармоник.
Однако недостаточно синтезировать основной тон и гармоники ноты музыкального инструмента или вокальной ноты, необходимо также синтезировать огибающую ноты, как описано в пункте 1 выше.
Кроме того, чтобы синтезировать мелодический отрывок в музыке, будь то инструментальный или вокальный, необходимо синтезировать пункты 1-3 выше для каждой ноты в отрывке, а также синтезировать время каждой ноты относительно начала отрывка.
Аналитическое извлечение отдельных инструментов или человеческих голосов из записи окончательного микса является очень сложной проблемой, и ваш подход не решает эту проблему, поэтому ваш подход не может должным образом решить проблемы 1-4.
Короче говоря, любой подход, который пытается извлечь практически идеальную музыкальную транскрипцию из окончательного микса музыкальной записи, используя строгие аналитические методы, в худшем случае почти наверняка обречен на неудачу, а в лучшем случае попадает в область передовых исследований.
Как выйти из этого тупика, зависит от того, какова цель работы, о чем ОП не упомянула.
Будет ли эта работа использоваться в коммерческом продукте или это хобби-проект?
Если коммерческая работа, оправданы различные дальнейшие подходы (дорогостоящие или очень дорогие), но детали этих подходов зависят от того, каковы цели работы.
В заключение, ваш синтез звучит как случайный гудок из-за следующего:
Ваш основной детектор тонов привязан к времени ваших кадров FFT, которые фактически генерируют поддельный основной тон в момент начала каждого кадра FFT.
Почему обнаруженные основные тона, вероятно, являются поддельными? Потому что вы произвольно подрезаете музыкальный образец в (FFT) кадры и, следовательно, вероятно, обрезаете много одновременно звучащих нот где-то в середине ноты, тем самым искажая спектральные сигнатуры нот.
Вы не пытаетесь синтезировать конверты обнаруженных заметок, как и вы, потому что нет способа получить информацию о конвертах на основе вашего анализа.
Следовательно, синтезированный результат, вероятно, представляет собой серию чистых синусоидальных микросхем, разнесенных во времени с помощью дельта-t скользящего FFT-кадра. Каждый ЛЧМ может быть разной частоты, с разной величиной огибающей и с огибающими, которые, вероятно, имеют прямоугольную форму.
Чтобы увидеть сложную природу музыкальных нот, взгляните на эти ссылки:
Спектр музыкальных инструментов до 102,4 кГц
Спектры нот музыкальных инструментов и их огибающие во временной области
Обратите внимание, в частности, на множество чистых тонов, составляющих каждую ноту, и сложную форму огибающей временной области каждой ноты. Переменная синхронизация нескольких нот относительно друг друга является дополнительным существенным аспектом музыки, как и многоголосие (одновременное звучание нескольких голосов) в типичной музыке.
Все эти элементы музыки призваны сделать строгий аналитический подход к автономной музыкальной транскрипции, чрезвычайно сложным.