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] psilogic.livejournal.com 2008-07-17 06:38 am (UTC)(link)
Знаешь ли ты эффективные методы такой плавной сдвижки окна? Чтобы не считать БПФ заново при каждой сдвижке (это до пенсии вычисляться будет).

Обещанный генератор фильтров

[identity profile] daddym.livejournal.com 2008-07-17 08:07 am (UTC)(link)
http://www-users.cs.york.ac.uk/~fisher/mkfilter/
Я с ним работал - все ок.

[identity profile] psilogic.livejournal.com 2008-07-17 08:15 am (UTC)(link)
Да я не про то. Вот есть окно в N целочисленных отсчетов. Я сделал на нем БПФ (сложность NlogN). Получил спектр N комплексных чисел. Теперь сдвинул окно на один отсчет вправо. Изменился только один отсчет, остальные просто переместились на один индекс. Можно ли теперь вычислить БПФ для этих новых N отсчетов как-нибудь более эффективно, чем просто заново считать БПФ?

Да, конечно, за O(N) операций...

[identity profile] sanitareugen.livejournal.com 2008-07-17 11:05 am (UTC)(link)
Комплексное умножение всех значений на "поворачивающий множитель", вычитание уходящей точки (умноженной на соответствующие множители) и добавление новопришедшей (аналогично).
Но зачем?!

Re: Да, конечно, за O(N) операций...

[identity profile] psilogic.livejournal.com 2008-07-17 12:52 pm (UTC)(link)
да вдруг пригодится :) только не забыть время от времени вычислять весь спектр заново, а то ошибки округления накопятся.

А ещё можно экспоненциальное сглаживание...

[identity profile] sanitareugen.livejournal.com 2008-07-17 12:57 pm (UTC)(link)
Предыдущие значения с весом (1-alpha), вновь поступившее alpha.
И спектр всегда как новенький...