Алгоритм (и) для змішування звукових сигналів без відсікання


49

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

Фізично «правильний» спосіб зробити це підсумовування зразків. Однак, коли ви додаєте два довільних вибірки, отримане значення може бути вдвічі перевищує максимальне значення.

Наприклад, якщо ваші вибірки мають 16-бітні значення, результат буде до 65536 * 2. Це призводить до відсікання.

Наївне рішення тут - ділити на N, де N - кількість каналів, що змішуються. Однак це призводить до того, що кожен зразок є 1 / Nth таким же гучним, що абсолютно нереально. У реальному світі, коли грають два інструменти одночасно, кожен інструмент не стає наполовину гучнішим.

Зчитавши, загальний метод змішування - це результат = A + B - AB, де A і B - це два змішаних нормалізованих зразка, а AB - термін, який забезпечує більш гучні звуки "м'які".

Однак це вводить спотворення сигналу. Чи прийнятний цей рівень спотворень у високоякісному синтезі звуку?

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

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


Цікаво, як часто можна уникнути обрізання, просто трохи змістивши сигнали.
Себастьян Рейхельт

Хороша ідея, хоча я підозрюю, що це не зовсім так просто, особливо коли у вас не так багато пошуку (наприклад, у режимі реального часу). Проблема полягає в тому, що ви повинні заздалегідь знати зразок, щоб знати, який вид зрушення часу буде відповідним. Це говорить про те, що в більшості музики ви маєте велику ймовірність кореляції, тому трохи випадкового зсуву часу може працювати дуже добре. Хтось має досвід звернутись сюди?
брихойт

2
@bryhoyt: Справжні змішувачі підсумовують сигнали разом. Це воно. Не потрібно затримок часу або нелінійної обробки. Відсікання не є проблемою, оскільки оригінальні сигнали не були такими гучними.
ендоліт

2
16 + 16bit = 17bits ;-)
nikwal

1
просто розділіть на кількість входів, тоді відсікання буде неможливим. і якщо звук занадто тихий, підключіть підсилювач…
Sarge Borsch

Відповіді:


14

Дуже важко вказати на відповідні методи, не знаючи жодного контексту для вашої проблеми.

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

Перекоси, введені A + B - AB, просто неприйнятні. Це створює дзеркальні зображення A з кожної сторони гармонік B - еквівалентні модуляції кільця - що дуже жахливо, якщо A і B мають багатий спектр гармонік, які не мають цілих співвідношень. Спробуйте, наприклад, на двох квадратних хвилях при частоті 220 і 400 Гц.

Більш "природною" функцією відсікання, яка працює на основі вибірки на зразок, є функція tanh - вона фактично відповідає поведінці м'яких обмежень деяких аналогових елементів. Крім того, ви можете вивчити класичні методи динамічного стиснення - якщо ваша система може заздалегідь заздалегідь побачити піки, це ще краще.


4
Доповнення та жорсткий відсікання. Просто подивіться на будь-який програвач мод з відкритим кодом. Використовуючи додаток для змішування, з введеннями відповідно масштабується, щоб мінімізувати відсікання, а потім жорсткий обмежувач (необов'язково м'який) є нормою, а не винятком ...
pichenettes

4
У більшості ситуацій це не відповідальність розробника за вирішення проблеми. Ви надаєте користувачеві / композитору можливість регулювання гучності кожного каналу, і користувач повинен виконати суміш, щоб відсікання було прийнятним для них. Наприклад, у Renoise за замовчуванням коефіцієнт посилення кожного інструменту / ноти дорівнює 1, і все починає погано відсікатися при додаванні доріжок - користувач повинен регулювати гучність приміток або інструментів у модулі, щоб запобігти обрізанню на основний трек (якщо не бажано). Ось скріншот, на якому показано, що: i.imgur.com/KVxDt.png .
пікенети

2
IIRC, FastTracker був більш консервативним, оскільки він застосовував ослаблення на кожній доріжці, а потім мав глобальний "посилення макіяжу" в діалоговому вікні налаштувань від x1 до x32. Я пам’ятаю, що коли мені довелося передати всі свої модулі на .WAV для CD, я повинен був спробувати значення коефіцієнта посилення, поки я не знайшов найнижчого, яке не викликало відсікання ...
pichenettes

2
Щодо рівня ослаблення, якщо ви не можете мати користувача в циклі; 1/32 - це абсолютно безпечний рівень (без відсікання). Якщо припустити, що канали не співвідносяться (що не дуже вірно для музики - правильніше при змішуванні фонових амбіансів), значення 1 / sqrt (32) було б хорошим компромісом між імовірністю гучності та відсікання. Найкращим рішенням все-таки буде використання 1/32, а потім після обробки ваших зразків динамічним компресором.
пікенети

3
Доповнення. Ось що роблять апаратні мішалки, і це так, як люди очікують, що так поводиться. Змішувачі системного рівня просто затискають. Було б великою проблемою, якби системні драйвери впровадили будь-яку нелінійну обробку - я б уявив собі біль майстра, що освоїв, намагаючись розібратися, що вони чують - це налаштування їх компресора або якась динамічна обробка на рівні системи. Програмне забезпечення для створення музики пропонує широку палітру модулів для стиснення динамічної компресії, користувачі повинні переконатися, що їх суміш не затискається.
пікенети

16

Фізично «правильний» спосіб зробити це підсумовування зразків. Однак, коли ви додаєте два довільних вибірки, отримане значення може бути вдвічі перевищує максимальне значення. ... Наївне рішення тут - ділити на N, де N - кількість каналів, що змішуються.

Це не "наївне" рішення, це єдине рішення. Це робить кожен аналоговий та цифровий мікшер, адже це те, що робить повітря, і це те, що робить ваш мозок.

На жаль, це, як видається, є поширеною помилкою, про що свідчать інші невірні нелінійні алгоритми "змішування" (спотворення):

"Розділення на N" називається прогоном ; додатковий простір для піків, що виділяється вище рівня RMS у формі хвилі. Обсяг заголовка, необхідний для сигналу, визначається коефіцієнтом гребеня сигналу . (Нерозуміння рівнів цифрового сигналу та зал, ймовірно, частково винен у війні " Голос" та " Елефанк" .)

В аналоговому обладнанні запас може бути 20 дБ. У апаратному DSP часто використовують фіксовану точку з нерухомим заголовком; Наприклад, SigmaDSP AD має 24 дБ заголовка . У комп'ютерному програмному забезпеченні обробка звуку зазвичай виконується в 32-бітовій плаваючій точці, тому запас простору величезний.

В ідеалі вам взагалі не потрібно ділити на N, ви просто зведете сигнали разом, тому що ваші сигнали не генеруються в першу чергу при 0 dBFS.

Зверніть увагу, що більшість сигналів взагалі не співвідносяться один з одним, тому рідко всі канали змішувача конструктивно втручаються в один і той же момент. Так, змішування 10 однакових фазових синусоїд збільшить піковий рівень у 10 разів (20 дБ), але змішування 10 некогерентних джерел шуму лише підвищить піковий рівень у 3,2 рази (10 дБ). Для реальних сигналів значення буде між цими крайностями.

Для того, щоб вивести змішаний сигнал з ЦАП без відсікання, ви просто зменшите коефіцієнт посилення суміші. Якщо ви хочете, щоб рівень RMS суміші був високим без жорсткого відсікання, вам потрібно застосувати певний тип стиснення для обмеження піків форми хвилі, але це не є частиною змішування, це окремий крок. Спочатку ви змішуєтесь з великою кількістю запасів, а потім, якщо бажаєте, згодом ставите її за допомогою стиснення динамічного діапазону.


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

3
@bryhoyt: Так, але ви також повинні пам’ятати, що хвилі рідко співвідносяться між собою, тому додавання разом 5 звуків не робить піків у 5 разів вище.
ендоліт

1
Дякую, @endolith, я думаю, що це насправді в основі всього цього, і пояснює мені, чому це не так вже й велика проблема, як я вперше думав.
bryhoyt

Отже, якщо 10 некогерентних джерел дають 10 дБ, чи поділення на sqrt (кількість джерел) було б розумним евристичним? Тобто, якщо у вас є 3 джерела, підсумуйте їх і розділіть на sqrt (3)? (вибачте за коментар до старовинної
теми

@ nerdfever.com Ось так поєднуються рівні RMS, так що ... ймовірно?
ендоліт

6

формула

result=A+BAB

AB=AB

result=g(A+B)

g1

g=0.5g=1/2

g

result[i]=g[i](A[i]+B[i])

g[i]ABgresult

Можливо, це:

g[i]=f(A[i]+B[i],g[i1])

ОНОВЛЕННЯ: Як запропонував hotpaw2, ви можете затримати вхідний сигнал, але не придушення посилення. Це називається "обмежувачем вперед".


Під "AB" я маю на увазі "A * B". Я розумію, що амплітуда може бути як позитивною, так і негативною. Ви маєте рацію, моє рівняння не має великого сенсу для комбінації, що включає негативні амплітуди.
брихайт

Я повинен змішати 8 - 10 (N) різних синусових хвиль. Емпірично я знав, що правильне значення було приблизно 0,3 ... 1 / √N здається правильним ... будь-яке посилання на те, чому ця формула правильна?
Зібрі

5

Один із способів це можна зробити для змішування в режимі реального часу, щоб використовувати AGC з випередженням, коли коефіцієнт посилення одного або обох каналів знижується зі складно сприйнятливою швидкістю, перш ніж амплітуда суми перевищує межу відсікання. Чим менше доступний погляд вперед, чи регулювання посилення AGC стане чутнішим, або максимальний коефіцієнт посилення для більш м’якої рампи регулювання посилення наблизиться до 0,5 на канал на межі. Для джерел звуку, що мають певну передбачуваність, можна також використовувати статистику щодо поведінки конверта з часом, щоб адаптивно вгадати межу посилення, але з певною вірогідністю виходу з ладу (що було б різким коригуванням посилення AGC).


Це обмежувач перегляду вперед, а не AGC, спрямований на випередження.
Бйорн Рош

2
@BjornRoche: Чи не можна обмежувач вважати типом AGC?
ендоліт

Деякі обмежувачі - це АТС, але обмежувальний вузол обмеження не є АРУ.
Бйорн Рош

1
@BjornRoche добре, це автоматично і контролює посилення ...
Olli Niemitalo

2

Я спілкувався з дизайнером мікшерів кінця 1990-х та перших 2000-х, що йшов на цифровій хвилі (після того, як на пальцях). Я думаю, що хлопець був дизайнером для SPL, але, можливо, не такий великий, я абсолютно не пам'ятаю ні назви, ні марки, я просто пам’ятаю, наскільки насправді велика і дорога машина.

Ми говорили довго і, нарешті, розповіли про методи, які дійсно гарантують, що їхні канали 64/128 @ 24 біт, змішані разом, залишаються 24-бітовим точно змішаним вихідним каналом без відсікання.

Техніка, яку він пояснив, була досить простою. 64 канали (на 24 біти) були додані в канал 48 біт, де відсікання не може відбутися. Прямо.

Я не можу сказати, як цей сигнал тоді був пошкоджений 48 назад від 24 біт. Можливо, саме тут застосовуються хитрі кухонні рецепти.

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


2

Знизити глобальний обсяг. Імпульсний трекер класично виводить канали приблизно за 33% максимуму за замовчуванням.

Це, здається, є достатньо гучним для музики з кількома каналами (4-канальний Amiga MOD) і досить м'яким для пісень з 50 каналами (оскільки вміст каналу, як правило, не співвідноситься, тому гучність не збільшує швидкість за певний рівень ... плюс кілька каналів будуть виводитись на максимум гучності з тим, що відбувається багато). Це також залишає достатньо місця для загострень ліворуч або жорстко праворуч на панорамних каналах (які використовують 66% діапазону).

Крім того, ви не хочете додавати свої канали разом у 16 ​​біт, ви хочете додати їх у 32 біти, а потім вирізати результат та зменшити до 16 біт у самому кінці. Вам знадобиться більш високий діапазон, щоб він не загортався під час математики. Іншим варіантом є використання 32-бітової плаваючої точки (що зручно робити фільтри, ефекти тощо).


0

Я думаю, що ключовим є те, що якщо у вас 16 бітних значень і додавання 2 значень разом, що потенційно може бути більше максимального значення, то у вас є 2 варіанти:

1) передайте обидва на 32-бітне додавання, потім поверніть максимальне значення, якщо додавання перевищує це значення. Потім поверніть його на 16 біт. Наприклад, якщо ваші значення 32768 і 34567, це перевищує 65535, а ключ - повернути 65535. Ви б зробили те саме, якщо використовували підписані значення в кінці мінімального значення.

2) стисніть обидва значення, а потім додайте їх разом.

Перший по суті є жорстким відсіканням, другий - м'яким відсіканням. Аналогові системи - все жорстке відсікання.


0

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


-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

Тобто, якщо і А, і В розділяють знак, застосуйте обмежуючий зсув. Величина зміщення - добуток A і B. Напрямок зміщення протилежний напрямку A і B.

Якщо A і B не поділяють знак, не застосовується обмеження, оскільки немає способу переповнення.


Зауважте, це не комутативно. Якщо ви хочете змішати більше 2 голосів, вам потрібно змішати їх усі відразу. У цьому випадку слід "згладити" все в одному напрямку (якщо ви занадто високі, згладьте позитивні значення вниз з негативними; якщо ви занадто низькими, вирівняйте негативні значення вниз з позитивними). Після того, як ви врахували компенсацію (застосовується пропорційно до решти значень); використовувати двійковий підхід, але масштабувати обмежувач на основі кількості змішаних значень.
Річ Ремер

-1

Моя пропозиція:

  1. Перетворити аудіо формат треку з 16-бітної фіксованої точки в 32-бітну плаваючу точку.
  2. Додайте поточне значення вибірки для всіх композицій, які потрібно змішати.
  3. Не робіть нічого іншого.

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


2
Привіт, ласкаво просимо на DSP.se. Ми дякуємо вам за спробу зробити свій внесок, але я не відчуваю, що це взагалі відповідає на питання ОП. ОП не згадувало "користувачів" своєї системи: він може грати з ним самостійно або записувати програму під конкретні вимоги. Вибачте, що я заголосив: Я буду радий переглянути свій голос, якщо ви докладете більш детальну відповідь. Також будь ласка, подбайте про своє форматування: подивіться на FAQ, щоб побачити, як написати хороші відповіді.
пенелопа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.