Замедленное воспроизведение музыки при сохранении частоты

10

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

Hans
источник
1
В дополнение к ответу, приведенному ниже, см. Эту ссылку для получения дополнительной информации.
a_a

Ответы:

5

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

Область времени:

В Time Domain вы можете попробовать некоторые методы, такие как:

  • TDHS (Гармонический сакалинг во временной области)
  • SOLA (синхронное добавление с перекрытием)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (добавление перекрытия формы волны)

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

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

Частотная область:

Все временные интервалы, которые я знаю в частотной области, основаны на методах фазового вокодера .

Плюсы: будут работать в полифонических или монофонических звуках.

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

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

Для datailed взглянуть в Миллер Пакетт и Portnoff бумаги

ederwander
источник
Спасибо за ваш ответ. В чем проблема с наиболее наивными подходами: расширить временной сигнал в целом как функцию на весь временной интервал, не переходя в ряд Фурье, и умножить все частоты на постоянную. Я понимаю, что любая локальная ошибка во временной области повлияет на все коэффициенты Фурье. Помимо этого, в чем заключаются подводные камни этого наивного нелокализованного подхода?
Ганс
Я никогда не пробовал ничего подобного, это может сработать, очевидная проблема в том, что это может быть довольно дорого. Конечно, это не эффективный способ, представьте, что у вас есть фрагмент аудио (1 минута), сэмплированный на частоте 44100 Гц, теперь Делая то, что вы предлагаете, вам придется применять Фурье в 44100 * 60 = 2646000точках сразу и обрабатывать, поэтому забудьте о любой попытке обработки в реальном времени, такой как это ,
ederwander
1
Я не думаю, что то, что я предлагал ранее, сработало бы в чисто математическом смысле (без учета стоимости и чувствительности к ошибкам).
Ганс
3

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

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

скорый
источник
Большое спасибо за ответ. Есть ли у вас какие-либо ссылки на применение вейвлета к этой проблеме?
Ганс
Пожалуйста, смотрите мой комментарий ниже ответа ederwander, а также. Спасибо.
Ганс
2

Ниже приведена ссылка на простую и полезную учебную функцию в C ++ (smbPitchShift.cpp) Стефана М. Бернзее, которая может замедлять или ускорять музыку, не меняя ее высоту.

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

Я также включил ссылку на веб-сайт Бернзее, который содержит его подробные описания о растяжении по времени и смещении звука звуковых сигналов, таких как музыка.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/

Джеймс Пол Миллард
источник
Оригинальный код не применяется time stretch, оригинальный код применяется Pitch Shift, в этом случае, чтобы применить модификацию шкалы времени, которую вам нужно будет объединить Pitch Shifit + Resample (interpolation), код Бернси работает хорошо, используя окно размера, которое 4096вы сможете изменить на одну октаву (выше или ниже) , это означает, что соответственно вы сможете создавать временную шкалу только с хорошим качеством, используя коэффициенты от 2,0x до 0,5x, хорошо построенный фазовый вокодер может достигать лучших результатов, используя тот же размер окна, и вы сможете экстраполировать эти факторы с лучшим качеством
ederwander
К сожалению, теперь я вспомнил, что мне пришлось применить повторную выборку, чтобы завершить растягивание по времени, чтобы исходная высота не изменилась. Похоже, что Бернзее внес некоторые изменения в свой код с версии, связанной с GitHub. Его новый код для доступен для скачивания с его сайта - он может увеличить диапазон отклонения от его оригинальной спецификации. Я подправил его исходный код, чтобы я мог сдвинуть его на 8 раз.
Джеймс Пол Миллард
нет никакой разницы между вашим кодом и страницей Бернзее, основная математика все та же. Я вижу сильную разницу в размере окна = 8192в кодах со страницы загрузки, так что вам придется в 4 раза больше обрабатывать Я возвращаюсь, чтобы сказать, что с половиной размера окна 8192/2=4096вы можете сделать то же самое, используя некоторые секреты фазового вокодера, суть в том, что вы можете сохранить качество с гораздо меньшей обработкой.
ederwander
Хотя я предоставил ссылку GitHub на BatPhone, это НЕ мой код. Я просто вытащил его из поиска в Интернете, чтобы просмотреть smbPitchShift (). Мой код сильно изменен по сравнению с версией Бернси и находится в этом файле: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
Джеймс Пол Миллард,
Да, теперь я вижу, это действительно повторный пример, вам может быть интересно увидеть / услышать мой фазовый вокодер в действии.
ederwander