Digital Dynamic Range Compressor

  • Автор темы Автор темы belovw
  • Дата начала Дата начала
Почему бы не начать с какой-нибудь простенькой реализации smooth min, например, с такой:
Попробовал реализовать нечто подобное. Получилось вот так
Реализация колена через степенную функцию, но главное не это - главное то что я примерно понял куда грести. Попробую теперь реализовать через параболу или гиперболу какую-нибудь.
 
например, с такой:
Я сделал что-то своё, но получилось практически копия твоего, за исключением того что при Ratio=1 колено не становится бесконечным и не отслаивается от "ноги"
Мало того, сделал реализацию колена не только парабалой, но и другими порядками. Самое что интересное, чем выше порядок - тем больше эта реализация тяготеет к показательной функции.
 
@Rst7, Дима, ты прям как наставник. Как препод по практическим работам. Если бы не ты, я бы...
В общем ситуация такая: колено придумали, но оно получается в логарифмической шкале +- х дБ. Теперь надо придумать как реализовать сглаживание в разовой шкале.
--
Размышления: если в логарифмической шкале колено прибавлялось (в минус), то в разовой должен быть множитель. Также и с шириной колена. Вправо умножаем, влево делим на коэффициент ширины колена.
Ну и решить вопрос реализации приближения показательной функции с аргументом показательной функции.
 
Теперь надо придумать как реализовать сглаживание в разовой шкале.

Все точно так же, воспользоваться тем, что логарифм мало отличается от самого числа при малых изменениях.

Т.е. просто выкинув логарифмы ;)
 
Пока ещё не избавился от одной степенной функции отвечающей за Ratio. Надо подумать как её реализовать через выше изученные приближения.

теперь про вычисление произвольной степени:
Пять дней на размышления и решение пришло после погружения (в прямом смысле) под воду. ))
Проблема заключается в куче операций log10 и 10^x. На каждый семпл такое. А операции эти крайне медленные.

Тут важно определиться вот с чем.

Обычно в компрессорах в RC-фильтре болтается уже сигнал, который gout в терминологии Вашего исходника, т.е. непосредственно множитель. А не его значение в дБ (т.е логарифм), как это сделано у Вас.

Является ли именно этот момент, так сказать, mojo данного компрессора? Мое мнение - сомнительно. Дело в том, что в пределах 6дБ разница между логарифмом сигнала и собственно сигналом всего-то 4% (log2(x+1) примерно равно x).

И так как тут все обсуждают типичный GR порядка 3дБ, то явно не эти 4% играют рояль.

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

В общем, я бы для теста перешел бы из дБ в разы (как это и сделано в, пожалуй, абсолютном большинстве компрессоров) и выбросил из секции @ sample все логарифмы и степени, оставил бы только +-* (еще бы, конечно, и корень прибить, но это не так напряжно, как логарифмы/степени). После этого надо сравнить поведение. Я не думаю, что что-то на слух изменится, но зато производительность заметно возрастет.
Эта инфа не давала покоя. Пять дней на размышления и решение пришло после погружения (в прямом смысле) под воду. ))
С учётом того что в пределах 6 дБ передаточная функция логарифма примерно равно выражению X/R то с чем мы столкнёмся если использовать именно её? В пределах 6 дБ всё будет схоже, но потом проявится "недожим"
Передаточная функция в линейной шкале. Сплошная линия - ратио в дБ, пунктир - в разах.

Передаточная функция в логарифмической шкале.
Зелёный - Ратио в логарифмах, синий в разах.

При использовании DDR1 я помню что на большИх GR он пережимал сигнал больше чем хотелось. Позже я решил этот вопрос использованием подмешиванием сухого сигнала. Так в этом графике добавим слайдер Mix (m)
здесь микс установлен уже на 90% (0.9). В целом передаточные функции условно сравнялись, но на сверх высоком GR поведение всё равно разное и если добавить ещё сухого сигнала, то тогда пострадает компрессия на малых GR.
А почему бы вообще тогда не отказаться от компрессия в логарифмической шкале в пользу линейной? Надо пробовать...
 
А почему бы вообще тогда не отказаться от компрессия в логарифмической шкале в пользу линейной?
Это позволит избавиться от степенной функции в сэмпэльной части.
В общем задачка оказалась вообще не из легких, но я её решил. А вот задачу с двухконтурным компрессором решить было ещё сложнее, но и её приговорил.
218680

218681

218682

Потребление ресурсов на 100 инстанций упало до 3.2% против 4.3 в предыдущей версии на i7-4700HQ
Напомню, DDR2 отъедал 11.6%
 
Последнее редактирование:
@Rst7, использовал выражение (Xrms-Treshold)/Ratio + Treshold
и столкнулся с проблемой - если Ratio выставить на 2:1, то GR максимально получается в 6 дБ. Если 4:1 - то 12, если 8 - то 18
Не знаю, хорошо это или плохо.
 
@Rst7, использовал выражение (Xrms-Treshold)/Ratio + Treshold
и столкнулся с проблемой - если Ratio выставить на 2:1, то GR максимально получается в 6 дБ. Если 4:1 - то 12, если 8 - то 18
Не знаю, хорошо это или плохо.
Версия без таблицы поправок:
218528
Применил линейной приближение, т.е. сделал 4 плеча через каждые 6 дБ (величина изменяемая) - получился значительно больший GR.
процедура min(a,b,c,d) наудивление подъедала много ресурсов. Заменил на древо инструкций по типу IF-THEN-ELSE. С ним потребление осталось на тех же 3.2% на 100 инстанций.
218716

Заметны ошибки приближения. Думаю, оставить как есть или дожать.
Ну и колено надо приделать.
Вообще конечно @Rst7 спасибо тебе за этюд и умственную разминку.
 
Вынес коэффициенты входного и выходного сигнала из область @Sample в область @slider.
Теперь потребление ресурсов 2.8 вместо 3.2 у предыдущей версии.
Сделал длину хорды приближения к степенной функции зависимой от Ratio, теперь форма передаточной функции стала похожа на C1.
Осталось решить вопрос с коленом.
Ну и скин
--
218738


Уже даже не знаю что можно оптимизировать что бы ещё сократить ресурсы )))
 
Добрый день! Скачал архив - подскажите как установить в рипер? Спасибо!
 
Подскажите как установить ddr compressor v2.41 - архив скачал а как установить в рипер не понимаю. Спасибо!
 
Володь, чисто технический момент — на бусти теги есть или ссылки внутри поста? Выходит пост с обновлением и приходится возвращаться и мотать ленту вниз в поисках поста
 

Сейчас просматривают