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


49

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

Физически «правильный» способ сделать это - суммирование образцов. Однако при добавлении двух произвольных выборок результирующее значение может быть вдвое больше максимального значения.

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

Наивным решением здесь является деление на N, где N - это количество каналов, которые микшируются. Тем не менее, это приводит к тому, что каждый сэмпл громко звучит 1 / Nth, что совершенно нереально. В реальном мире, когда два инструмента играют одновременно, каждый инструмент не становится наполовину менее громким.

Из прочтения можно сказать, что распространенным методом микширования является: result = A + B - AB, где A и B - это две нормализованные выборки, которые микшируются, а AB - это термин, гарантирующий, что более громкие звуки становятся все более «мягкими».

Однако это приводит к искажению сигнала. Является ли этот уровень искажения приемлемым при высококачественном синтезе звука?

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

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


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

Хорошая идея, хотя я подозреваю, что это не так просто, особенно когда у вас мало внимания (например, в режиме реального времени). Проблема в том, что вы должны знать образец заранее, чтобы знать, какой временной сдвиг будет уместным. Тем не менее, в большинстве музыкальных произведений у вас будет высокая вероятность корреляции, поэтому немного случайного сдвига во времени может работать очень хорошо. У кого-нибудь есть опыт, чтобы привлечь здесь?
Bryhoyt

2
@bryhoyt: Реальные микшеры суммируют сигналы вместе. Вот и все. Никаких задержек или нелинейной обработки не требуется. Отсечение не проблема, потому что исходные сигналы не были такими громкими, чтобы быть с ними.
эндолит

2
16 + 16 бит = 17 бит ;-)
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 .
Pichenettes

2
IIRC, FastTracker был более консервативным в том смысле, что он применял затухание к каждой дорожке, а затем имел глобальный «коэффициент усиления» в диалоге настроек от х1 до х32. Я помню, что когда мне приходилось рендерить все мои модули в .WAV для CD, мне приходилось пробовать значения усиления, пока я не нашел самый низкий, который не вызывал отсечения ...
pichenettes

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

3
Дополнения. Это то, чем занимаются аппаратные микшеры, и люди ожидают, что они будут себя вести. Системные микшеры просто защелкиваются. Было бы большой проблемой, если бы в системных драйверах была реализована какая-либо нелинейная обработка - я бы вообразил боль, когда мастеринг-инженеры пытаются выяснить, является ли то, что они слышат, настройкой подключаемого модуля компрессора или какой-либо динамической обработкой на уровне системы. Программное обеспечение для создания музыки предлагает широкие палитры динамических компрессионных плагинов, и пользователи должны убедиться, что их микширование не обрезается.
pichenettes

16

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

Это не «наивное» решение, это единственное решение. Это то, что делает каждый аналоговый и цифровой микшер, потому что это то, что делает воздух, и то, что делает ваш мозг.

К сожалению, это, как представляется, распространенное заблуждение, как демонстрируют эти другие некорректные нелинейные алгоритмы "смешивания" (искажения):

«Деление на N» называется запасом ; дополнительная комната для пиков, которая расположена над среднеквадратичным уровнем сигнала. Величина запаса, необходимого для сигнала, определяется коэффициентом амплитуды сигнала . (Непонимание уровней цифрового сигнала и запаса мощности, вероятно, частично является причиной войны за громкость и Elephunk .)

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

В идеале вам вообще не нужно делить на N, вы просто суммируете сигналы вместе, потому что ваши сигналы не будут генерироваться при 0 дБFS в первую очередь.

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

Чтобы получить смешанный сигнал из ЦАП без ограничения, вы просто уменьшаете усиление микса. Если вы хотите поддерживать среднеквадратичный уровень микширования на высоком уровне без жесткого ограничения, вам необходимо применить некоторый тип сжатия, чтобы ограничить пики формы сигнала, но это не часть микширования, это отдельный шаг. Сначала вы микшируете с большим запасом мощности, а затем, если хотите, применяете сжатие динамического диапазона позже.


1
Я понимаю эти понятия, но я не уверен, что это совершенно правильно. Конечно, если я добавлю кучу 16-битных семплов, 32-битные даст мне кучу числового пространства. Но я все еще должен воспроизвести полученный микшер с нормальной громкостью в реальной звуковой системе. Я хочу, чтобы 2 канала звучали громче, чем каждый канал, воспроизводимый отдельно, но я не хочу обрезать их. Выполнение моих сумм в 32 или даже 64 битах не поможет с этим. Возможно, я начинаю отвечать на свой собственный вопрос: исходные образцы должны быть нормализованы на более тихом уровне, чем максимальная амплитуда. Как вы предлагаете, оставляя некоторый запас микширования.
Bryhoyt

3
@bryhoyt: Да, но вы также должны помнить, что волны редко коррелируют друг с другом, поэтому сложение 5 звуков не дает пиков в 5 раз больше.
эндолит

1
Спасибо, @endolith, я думаю, что это действительно в основе всего этого, и объясняет мне, почему это не такая большая проблема, как я сначала думал.
Брюхойт

Таким образом, если 10 некогерентных источников дают 10 дБ, будет ли разумным делением деление на sqrt (количество источников)? То есть, если у вас есть 3 источника, суммируйте их и разделите на sqrt (3)? (извините за комментирование древней
ветки

@ nerdfever.com Вот как сочетаются уровни RMS, так что ... наверное?
эндолиты

6

формула

результатзнак равноA+В-AВ

AВзнак равноA*В

результатзнак равнограмм(A+В)

грамм1

граммзнак равно0,5граммзнак равно1/2

грамм

результат[я]знак равнограмм[я](A[я]+В[я])

грамм[я]AВграммрезультат

Возможно это:

грамм[я]знак равное(A[я]+В[я],грамм[я-1])

ОБНОВЛЕНИЕ: Как предлагает hotpaw2, вы можете задержать входной сигнал, но не подавление усиления. Это называется «ограничитель прогнозирования».


Под «AB» я подразумеваю «A * B». Я понимаю, что амплитуда может быть как положительной, так и отрицательной. Вы правы, мое уравнение не имеет большого смысла для комбинации с отрицательными амплитудами.
Bryhoyt

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

5

Одним способом это можно сделать для микширования не в реальном времени, чтобы использовать упреждающую АРУ, где усиление одного или обоих каналов снижается с трудно воспринимаемой скоростью до того, как суммарная амплитуда превышает предел ограничения. При меньшем упреждении либо регулировка усиления АРУ станет более слышимой, либо максимальное усиление для более мягкой рампы регулировки усиления будет становиться все ближе и ближе к 0,5 на канал на пределе. Для источников звука с некоторой предсказуемостью можно также использовать статистику, касающуюся поведения огибающей во времени, чтобы адаптивно угадать предел усиления, но с некоторой вероятностью отказа (что будет резкой регулировкой усиления АРУ).


Это ограничитель прогнозирования, а не прогнозируемый AGC.
Бьорн Рош

2
@BjornRoche: Разве лимитер не может считаться типом AGC?
эндолит

Некоторые ограничители являются AGC, но ограничитель прогнозирования не является AGC.
Бьорн Рош

1
@BjornRoche, ну, это автоматически и контролирует усиление ...
Olli Niemitalo

2

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

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

Техника, которую он объяснил, была довольно проста. 64 дорожки (по 24 бита) были добавлены в 48-битном канале, где отсечение не может произойти. Прямо.

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

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


2

Уменьшите общий объем. Импульсный трекер по умолчанию выводит каналы с максимальной громкостью около 33%.

Кажется, что это достаточно громко для музыки с несколькими каналами (4-канальные модемы Amiga) и достаточно тихо для песен с 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.

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


Обратите внимание, что это не коммутативно. Если вы хотите смешать более двух голосов, вы должны смешать их все одновременно. В этом случае вы должны «сгладить» все в одном направлении (если вы слишком высоки, сгладьте положительные значения с отрицательными; если вы слишком низко, сгладьте отрицательные значения с положительными). После того как вы учли смещение (применяется пропорционально к оставшимся значениям); используйте бинарный подход, но масштабируйте ограничитель на основе количества смешанных значений.
Рич Ремер

-1

Мое предложение:

  1. Конвертировать аудио дорожку из 16-битной фиксированной точки в 32-битную с плавающей точкой
  2. Добавьте текущее значение сэмпла всех дорожек, которые будут смешаны.
  3. Больше ничего не делай.

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


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