Уповільнення відтворення музики, зберігаючи частоту


10

Відтворення музичного аудіо з меншою швидкістю знизило б його висоту (частоту). Чи є інструмент та теорія для уповільнення відтворення пісні, зберігаючи частоту однаковою? Я припускаю, що можна зробити перетворення Фур'є або вейвлет. Здається, потрібно або попередньо вибрати розмір вікна, або динамічно вибрати основу вейвлетів. Чи є якась конкретна і детальна теорія та застосування для цього?


1
Окрім наведеної нижче відповіді, перегляньте це посилання для отримання додаткової інформації.
A_A

Відповіді:


5

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

Часовий домен:

У Time Domain ви можете спробувати деякі методи, такі як:

  • TDHS (Гармонічне масштабування в часовій області)
  • SOLA (Додати синхронне перекриття)
  • PSOLA (додавання синхронного перекриття шага)
  • WSOLA (Додати подібність форми перекриття хвилі)

Плюси: швидко, деякі алгоритми легко зрозуміти, хороша якість в однотонних звуках.

Мінуси: Зазвичай вам потрібна дуже гарна пікова доріжка, щоб сплавитись у потрібному положенні, це важко зробити :-(, тож якщо ваш крок не виходить з ладу або не працює в поліфонічних звуках, ці алгоритми дадуть багато збоїв / артефактів у вихідному звуці.

Домен частоти:

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

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

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

Я можу сказати, що розмір вікна та розмір хопу є однією з ключових для якості фазового вокодера, зазвичай ми обираємо 4xперекриття для ресинтезу. 4096Для моїх вух вистачить одного розміру вікна Ханна (звичайно, якщо у вас є потужність обробки для цих розмірів) , стандартний факторний вокодер може додати деякі зворотні ефекти, щоб спробувати уникнути подібних проблем, можливо, вам потрібно заблокувати фазу.

Щоб отримати докладнішу інформацію, подивіться у папері Міллера та Портнофф


Спасибі за вашу відповідь. У чому полягає проблема з найбільш наївним з підходів: розширюйте часовий сигнал у цілому як функцію на весь часовий інтервал, не відкриваючи рядів Фур'є і множуйте всі частоти на постійну. Я розумію, що будь-яка локальна помилка у часовій області вплине на всі коефіцієнти Фур'є. Окрім цього, у чому полягає підступність цього наївного не локалізованого підходу?
Ганс

Я ніколи не пробував нічого подібного, можливо, це спрацює. Очевидна проблема полягає в тому, що це може бути досить дорогим. Це, звичайно, не ефективний спосіб, уявіть, що у вас є аудіо (1 хвилина), відібраний на 44100 Гц, тепер, щоб робити те , що ви пропонуєте , вам доведеться застосувати Фур'є в 44100 * 60 = 2646000точках одночасно і процес, так що забудьте будь-яку спробу в режимі реального часу обробки такого це ,
ederwander

1
Я не думаю, що те, що я пропонував раніше, працювало б у чистому математичному сенсі (без урахування вартості та чутливості до помилок).
Ганс

3

Описаний вами інструмент / теорія - це дійсно велика область досліджень музичних технологій, що в народі називається звуковою модифікацією часового масштабу. Великою складовою цього поля є те, як ви можете запобігти чутним змінам частоти після розтягування часу. Це можна вирішити як методами частоти, так і часової області, залежно від обмежень або цілей вашої програми. Запис у вікіпедії для модифікації часового масштабу / тону звуку - хороша відправна точка.

Якщо ви прагнете використовувати підхід, використовуючи частоту / вейвлет, розмір вікна та вибір бази впливатимуть на те, наскільки добре ви зможете локалізувати сигнал. Щоб використовувати приклад STFT, довге вікно буде добре працювати при стаціонарних синусоїдах, але знищить перехідні процеси. Більш коротке вікно забезпечить кращу перехідну реакцію за рахунок локалізації частотної області. Продуктивність інших баз вейвлет буде залежати від характеру проекції вашого сигналу на основу.


Дуже дякую за відповідь. Чи є у вас посилання на застосування вейвлетів до цієї проблеми?
Ганс

Будь ласка, дивіться також мій коментар нижче відповіді ederwander. Дякую.
Ганс

2

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

Він випустив цей код під ліцензією The Wide Open License (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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.