Как сделать аудио расширение / нормализацию (подчеркните разницу между высоким и низким) - PullRequest
0 голосов
/ 12 ноября 2018

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

1 Ответ

0 голосов
/ 15 ноября 2018

По сути, расширитель является противоположностью компрессора *; вам, возможно, повезет больше, если вы найдете документацию о том, как их реализовать. Они также имеют много общего с шумовыми воротами .

Экспандер

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

Базовая структура псевдокода 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. Компрессор подавляет динамический диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...