LINUX.ORG.RU

Преобразовать/вывести формулу

 , ,


0

2

Туплю, да..

Есть такая формула (линейная) для аудио-компрессии:

output = -threshold + (input - threshold) * (1 / rate)
Но она как-бы для децибел, т.е. ренж от нуля до минус бесконечности.

Как должна выглядеть формула, которая работает с ренжем от -1 до +1 (т.е. с флоатом)?

★★★★★

Последнее исправление: deep-purple (всего исправлений: 1)

а как «флоат» переводить в децибелы? Вот подставь ту формулу в эту и получишь, что хочешь

P.S. Точнее, надо вместо threshold, input и output подставить формулы перевода из одних единиц в другие

Sahas ★★★★☆
()
Последнее исправление: Sahas (всего исправлений: 1)

Так ведь рамок нет, минус бесконечность не может быть минус один, да и какое число будет, гхм, равняться 0?

Хотя если принять какой то порог от которого будем считать, что это уже минус бесконечность... Но вопрос с 0 не отпадает.

Я не уверен, но мне кажется, что формула и для децибел неверная и вообще стоит подумать над реализацией.

xSudo ★★★
()
Последнее исправление: xSudo (всего исправлений: 1)

Что ты хочешь получить, от -1 до 1? Загнать в (-1, 1) можно, но как - зависит от вопроса «зачем?».

https://en.wikipedia.org/wiki/Dynamic_range_compression

Судя по этому, у тебя должно быть 2 линейных участка, а не 1.

tyakos ★★★
()
Последнее исправление: tyakos (всего исправлений: 1)
Ответ на: комментарий от tyakos

.. и Sahas и xSudo:

Исправил формулу, там минус не скопипастился. Погуглил еще. Наверное мне нужен Side-chaining, где амплитуда и влияет на саму себя — чем она больше, тем сильнее она подавляется (присутствуют те же тресхолд и рейт). В принципе может и формула что я привел выше — не для моих целей. Но я в заголовке написал либо преобразовать либо вывести нужную.

Зачем? Именно что хочу разобраться в вопросе как уплотняют звук (АРУ/AGC/Compression). Ну а -1 и +1 потому что у меня так, а в принципе, любой сайнед-тип.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от Sahas

При переводе в децибелы теряется знак, т.к. там делается abs() и восстановить обратно не выйдет. Вернее, я изначально имею знаковые и не перевожу в децибелы. Ну, может быть да, перевести в децибелы запомнив знак, и после обработки формулой вернуть исходный знак значению полуволны. Но мне кажется есть решение и без «потери» знака при удалении зубов через задний проход.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

я в этом деле не шарю, но с т.з. математики задача выглядит несложной... Что там за формула перевода метров в попугаев?..

Sahas ★★★★☆
()
Последнее исправление: Sahas (всего исправлений: 1)
Ответ на: комментарий от tyakos

О! Знал бы сразу как называется, то и не спрашивал. Кажись то что надо. Спасибо! Пойду вникать.

Я кстати успел сварганить вот такой велосипед:

out = in * (rate - abs(in)) * (1 / rate)
Где rate = 2 и более (чем больше rate, тем меньше влияет на out). Как это будет на графике еще не проверял, надо проверить, ато может вообще хрень. Но звук вроде «плотнИт».

Не, херня: https://s31.postimg.org/j9aolpgvf/Screenshot_1.png

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от deep-purple

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

По формулам ничего не скажу. Но могу посоветовать посмотреть реализацию к примеру тут

Или вот посложнее

Во втором варианте, кстати, используется фрейм Juce. Я в своё время его юзал, и мне он понравился. Правда бесплатен только если делаешь опенсорс.

P.S. http://wikisound.org/Сайдчейн

xSudo ★★★
()
Последнее исправление: xSudo (всего исправлений: 1)
Ответ на: комментарий от deep-purple

посмотри в сторону конформных преобразований из ТФКП. там нас как-то учили отображать три произвольные точки в три нужные точки на комплексной плоскости. здесь попроще - 2 точки и вещественная ось. Вроде как это 100% делалось дробно-линейным преобразованием.

aido ★★
()
Ответ на: комментарий от aido

Вроде как это 100% делалось дробно-линейным преобразованием.

Mobius Transforms, что ли?

Только там, если брать 1/x, при х->0 f(x)->\infty по определению на С*.

tyakos ★★★
()
Ответ на: комментарий от aido

Ты правильно понял! Разовью мысль, может подскажешь еще:

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

В принципе я нашел формулу, которая «подходит»:

out = in * (2 - abs(in))
В кавычках потому, что нужна обратная этой (должно быть перевернуто загнутым ближе к нулю), но таковой нет ))
Реально «подходит» (опять же обратная этой):
out = in^3
Но я ограничен только: «*», «/», «+», "-" и «abs». Т.е. корень я на данном этапе не вычислю, тем более кубический. Ну как ограничен, если совсем никак, то можно уйти и хоть в комплексные, но сейчас я топчуть тут.

Есть ли формула с простыми действиями? В принципе можно даже домножить что-то или доприбавить, провести манипуляции в удобном представлении и затем вернуть обратно в исходный диапазон.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Короче я походу вывел то что хотел:

out = in / (q + abs(in)) * (1 + q)
Где «q» это степень изгиба, добротность(?).
При q=0.1: https://s10.postimg.org/kqipbxp61/0_1.png
При q=1: https://s10.postimg.org/hsutykmp5/1_0.png
Щас на слух потестирую.

Но если что я все еще в поиске идеальной формулы.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

В принципе да, поигрался с входным и выходным уровнями — звучит. Теперь буду баловаться вводя всякие коэффициэнты и настроечки. В конечном итоге хочу конечный автомат который будет сам все компенсировать, выпукливать (гыыы) и вгинать как надо в зависимости от входного уровня. Ну по возможности, без нанесения заметного на слух вреда.

Тему решенной НЕ помечаю, т.к. это дело такое, перманентное походу. Вдруг кто-то что-то откопает интересное.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

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

aido ★★
()
Ответ на: комментарий от aido

На всякий случай покажи логистическую.

deep-purple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.