psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2008-07-16 10:15 pm

Вдруг кто-то знает

У меня вопрос к знатокам математики... уже - дискретной математики, еще уже - тем, кто разбирается в звуковом синтезе. Если у вас есть такие знакомые, которые, быть может, знают ответ, киньте в меня линком на них или в них - линком на меня.

Итак.

Дана некоторая волна (на практике - звуковая, но не суть). Она записана в дискретном виде - как длинный-предлинный набор отсчетов амплитуды через равные промежутки времени. Над некоторым куском этой волны волны мы можем выполнить БПФ (быстрое дискретное преобразование Фурье). Получим спектр, опять же, дискретный.

Задача первая. Взять небольшой кусочек волны длительностью dt (скажем, полсекунды звучания некой мелодии). Сгенерировать кусочек подлинее DT. Чтобы, значит, та же самая нота длилась подольше. Как это сделать? Если я просто выполню обратное БПФ, то получу тот же самый кусочек, длиной dt, а мне надо больше. Если я попробую тупо скопировать кусочек DT/dt раз, возникнут две бяки:
1. Артефакты на границе между кусочками.
2. Паразитная частота 1/dt, которая может быть слышна как пульсация громкости.
Если просто растянуть сигнал с помощью аппроксимации, то получится другая нота - более низкая в DT/dt раз.

Задача вторая. Взять кусочек dt, что-нибудь сделать с его частотами (скажем, убрать ровно одну). Потом записать его назад. То есть, речь про БПФ-фильтр. Но... что делать с артефактами на границе? Я тут придумываю разные методы сглаживания артефактов... может, кто знает уже известный хороший метод?

[identity profile] darth-vasya.livejournal.com 2008-07-17 09:17 am (UTC)(link)
Зависит от конкретного сигнала. Единственный самоочевидный вариант - "задавить" всё под 0 дБ (а.к.а. loudness maximizer :)), а потом руками (на этот раз - умножением на функцию от времени) задать динамику конечного сэмпла.

Ну да это такой вариант, для тех, кто лучше работает руками, чем головой :)

[identity profile] psilogic.livejournal.com 2008-07-17 09:25 am (UTC)(link)
Дык там скачки небольшие - порядка -10dB, толку не будет...

[identity profile] darth-vasya.livejournal.com 2008-07-17 09:34 am (UTC)(link)
10?! Это очень даже много...

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

[identity profile] psilogic.livejournal.com 2008-07-17 12:47 pm (UTC)(link)
не 10 а минус 10 :)

[identity profile] darth-vasya.livejournal.com 2008-07-17 12:50 pm (UTC)(link)
*ушёл размышлять над тем, а какая, собственно, разница*

[identity profile] psilogic.livejournal.com 2008-07-17 12:53 pm (UTC)(link)
в 10 раз меньше максимума и в 10 раз больше :)

[identity profile] darth-vasya.livejournal.com 2008-07-17 01:00 pm (UTC)(link)
Маскимумы, минимумы... по логарифмической шкале что от максимума вниз отложи, что от минимума - вверх :) Так или иначе, (-)10 дБ - это в два раза по RMS, если мы про одни и те же дБ говорим.

[identity profile] psilogic.livejournal.com 2008-07-17 01:03 pm (UTC)(link)
Короче, амплитуда звукового сигнала дается числами от -32,000 до +32,000 (16-битное кодирование). Дык скачки бывают порядка 1,000...3,000 единиц, когда размах амплитуды около 30,000 и все равно их, гадов, хорошо слышно :)

[identity profile] darth-vasya.livejournal.com 2008-07-17 01:07 pm (UTC)(link)
Ага, я и говорю - много это (хотя и не 10 дБ, но 10 - это _совсем_ много), потому и давить гадов компрессором.