По сути, расширитель является противоположностью компрессора *; вам, возможно, повезет больше, если вы найдете документацию о том, как их реализовать. Они также имеют много общего с шумовыми воротами .
Экспандер
Основной подход заключается в реализации повторителя огибающей и использовании значения огибающей для масштабирования источника звука. Последователь огибающей пытается отследить амплитуду аудиосигнала.
Базовая структура псевдокода Pythonic выглядит примерно так:
envelope_follower e # some envelope follower, we'll replace this
for each sample x:
amplitude = e.get(x) # use the envelope follower to estimate the amplitude of e
x = expand(x, amplitude) # apply some expansion operation
По своей сути операция expand
выглядит следующим образом (при условии, что ваши выборки находятся в диапазоне от -1,0 до 1,0):
def expand(x, amplitude):
return x * amplitude
Существуют более сложные подходы, например, амплитуда ограничения и масштабирования, чтобы она никогда не опускалась ниже 0,5, или применение некоторой нелинейной функции к амплитуде перед умножением.
# just an example
def expand(x, amplitude):
return x * clamp(1.2 * amplitude - 0.2 * (amplitude * amplitude), 0.3, 1.0)
Конверт подписчиков
Качество компрессора / расширителя почти полностью зависит от того, как вы используете устройство для огибающей .
Это не точная наука, так как очень точный последователь конверта может вызывать неприятные слышимые эффекты в определенных ситуациях - есть компромиссы.
Как и во всех этих вещах, существует множество подходов! Вот пара:
Выпрямитель с фильтром
Одним из самых простых подходов, особенно если у вас уже есть библиотека блоков обработки сигналов, является выпрямитель с фильтром нижних частот .
Работает так:
class envelope_follower:
lowpassfilter filter;
def get(x):
return filter.process( abs(x) )
Элементы управления, которые вы получаете здесь, в основном соответствуют вашей конструкции фильтра и среза нижних частот. Использование простого фильтра с герметичным аккумулятором проделает вам долгий путь.
Последователь атаки-релиза
Люди обычно хотят большего контроля над своим расширителем, и иногда трудно задуматься о реальных эффектах отфильтрованного выпрямителя - настройка одного параметра может сильно изменить его поведение.
Часто реальным сигналам для компрессоров / расширителей очень желательно реагировать очень быстро (например, на удар фортепиано или барабана) и медленно выпускать (чтобы хвостовая нота фортепиано внезапно не обрезалась) выкл)
Последователь атаки-выпуска дает более точное управление, указав ряд параметров:
- Два порога
- Порог, выше которого звуки должны быть громче
- Порог, ниже которого звуки должны быть тише (необязательно тот же порог, но может быть!)
- Два периода времени:
- Сколько времени требуется для достижения полной громкости при пересечении первого порога (это параметр Attack )
- Сколько времени требуется, чтобы достичь тишины ( Выпуск )
Один из основных подходов к реализации одного из них:
class envelope_follower:
# Parameters required. These are just made up
attack_threshold = 0.6
release_threshold = 0.3
attack_time = 10 # in samples
release_time = 1000 # in samples
amp = 0.0
def get(x):
# we still work with the absolute value.
# You might use another measure of amplitude here like RMS
# or even the filtered rectifier above
a = abs(x)
if x > attack_threshold:
amp += (1.0 / attack_time)
else if x < release_threshold:
amp -= (1.0 / release_time)
amp = clamp(amp, 0.0, 1.0)
return amp
Одним из распространенных расширений этого типа последователей является добавление параметра Hold , который задает минимальный интервал времени, в течение которого расширитель должен быть широко открыт. Это позволяет избежать создания огибающей звукового треугольника или пилообразной волны на низкочастотных сигналах.
Еще более сложным подходом является создание полной версии Attack-Decay-Sustain-Release, которая позволяет управлять переходными процессами и обычно используется в качестве обработки ударных.
С ума сойти
Отсюда вы можете:
Создать сглаживатель expand
функция
Достаточно тривиально приспособить вышеперечисленное к Compander - комбинированному устройству, которое успокаивает низкие звуки, но также подавляет слишком громкие звуки;
Разделите сигнал на несколько частотных диапазонов и сжимайте / расширяйте каждый отдельно. Обычно это делается для получения максимальной амплитуды во время мастеринга музыки;
Настройте Атаку / Удержание / Освобождение на основе спектрального содержания звука, который вы расширяете. Очень короткое время атаки / восстановления подходит для высокочастотных сигналов, но ужасно звучит для низкочастотных сигналов;
Добавить умеренное насыщающее искажение для звуков сверх порога; это может сделать вещи воспринимаемыми громче, даже если сигнал все еще имеет максимальную амплитуду. В идеале вам нужен сатуратор, который вообще не влияет на сигналы ниже порогового значения.
Удачи!
* не следует путать со сжатием в стиле MP3. Компрессор подавляет динамический диапазон.