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

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

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

Итак.

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

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

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

Re: Один отрезок повторял нужное число раз.

[identity profile] psilogic.livejournal.com 2008-07-17 07:10 am (UTC)(link)
Все! Понял, дошло. Спасибо, надо будет попробовать :) Про разбавлять я имел в виду такое:
1. БПФ для N отсчетов
2. Результат удлиннить вдвое, разбавив нулями через один
3. Обратное БПФ для 2N отсчетов.
По идее (я еще не пробовал) должен получиться тот же звук но вдвое большей длительности.

Нет.

[identity profile] sanitareugen.livejournal.com 2008-07-17 07:26 am (UTC)(link)
Немного теории (но Рабинера и Голда читать всё же надо, невзирая на толщину, если не для понимания, то для укрепления воли;):
0. Появление "щелчков" и т.п. при обработке это не неумелость программиста, а фундаментальный факт, проявление "принципа неопределённости", не позволяющего добиться одновременно высокого разрешения временнОго и частотного. Победить его нельзя, а свести действие к желаемому - можно.
Частным проявлением этого принципа является появление временнЫх искажений при узкополосной фильтрации (не только щелчков). Любой фильтр имеет некое последействие, и чем уже полоса - тем оно дольше.
1. В частности, если мы, для задач фильтрации, разбиваем сигнал на отрезки, делаем их ПФ (в частности, БПФ), обрабатываем в частотной области и обратно, то, при правильной фильтрации, отрезок длиной t будет иметь последействие также длиной t (поскольку ПФ позволяет получать очень узкополосную фильтрацию, в размере одного отсчёта по частоте). Если мы этого не учтём, то последействие никуда не денется - но, поскольку обычная fictio iuris при применении Фурье состоит в том, что наш отрезок бесконечно много раз повторяется во времени (или, что эквивалентно, закольцован), это последействие наложится на отрезок с начала его. Понятно, что даже если сигнал перед разбиением на отрезки был непрерывен, после такого наложения никто непрерывность не гарантирует - а это и есть "щелчки".
2. Чтобы избежать их, надо, чтобы последействие накладывалось куда надо. Для этого, взяв отрезок длиной t, дополним его в конце нулями, сделаем ПФ, нужные частотные манипуляции и обратное ПФ. Тогда последействие фильтра будет в хвосте полученного отрезка, вместо нулей. Первую половину отрезка выдаём, вторую (последействие) запоминаем. Обрабатывая следующий отрезок - перед выдачей результата обработки прибавим этот запомненный отрезок в первой половине нового отрезка. Физически он представляет "звон фильтра", оставшийся от предыдущего отрезка.
3. "Окнами" и пр. пользоваться не следует. В том числе и cross-fade.
4. Фильтрацию можно производить и без ПФ. Для этого фильтрация производится во временнОй области, т.е. выход фильтра есть взвешенная сумма отсчётов входного сигнала (КИХ-фильтр, а если добавить, по обратной связи, выходные отсчёты фильтра - БИХ-фильтр). Впрочем, расчёт коэффициентов фильтров часто производится именно при помощи ПФ. В таких фильтрах удаётся получить меньшую длину последействия - платя за это ухудшением АЧХ фильтра, а для БИХ-фильтров ещё и неустойчивостью.

Тем не менее - квазипериодика.

[identity profile] sanitareugen.livejournal.com 2008-07-17 07:33 am (UTC)(link)
Не зря Гильберт хорошо работает (О! Лично я Гильберта для этой задачи не использовал, обдумал, но и так удовлетворило, тем более требовалось попроще, для реализации на сигнальнике, но вдруг?)

Жаль, не получается совет-каламбур, типа даваемого...

[identity profile] sanitareugen.livejournal.com 2008-07-17 07:37 am (UTC)(link)
...программистам - "Истязай себя Кнутом!"

[identity profile] darth-vasya.livejournal.com 2008-07-17 07:42 am (UTC)(link)
Натравливать на получающийся сигнал, чтобы устранить колебания громкости с периодом t/2.

А что значит "пропускать через неё"?

Re: Нет.

[identity profile] psilogic.livejournal.com 2008-07-17 07:46 am (UTC)(link)
"если не для понимания, то для укрепления воли"

ага... похоже на то :))) именно воли: я как увидел, сколько там... начал читать и увидел, что 99% написанного на практике не пригодится никогда... :))

1. Угу, именно, именно, оно самое - стоит тронуть хоть одну частоту, и непрерывность может разрушиться.

2. Ага! Вот оно как!! А я то думал - и на хрена там и сям упоминаются "дополнения нулями", а это, оказывается, чтобы "закольцованность" убрать :)

Хм. Интересно, а что, если дополнять не нулями, а тем куском, который реально идет после этого отрезка... надо будет подумать...

3. Вроде cross-fade - это не окно, а так... что-то вроде весовой функции, про которую вы говорили.

4. Те фильтры я уже запрограммировал - первого порядка и биквадратные, вроде бы этого для большинства случаев хватит :) Сейчас буду делать на них эквалайзер... правда там меня сомнения кой-какие гложут, ну да ладно, это уже другая тема :)

[identity profile] psilogic.livejournal.com 2008-07-17 07:50 am (UTC)(link)
исходный сигнал
x(t)
выпуклая вверх функция
y(s)
пропускать через нее - значит заменять сигнал x(t) на y(x(t))
умножать - значит
x(t)*y(t)
умножение по идее должно давать пульсацию громкости во времени (амплитудную модуляцию), а пропускание может убрать слишком большие всплески громкости...

Re: Тем не менее - квазипериодика.

[identity profile] psilogic.livejournal.com 2008-07-17 07:52 am (UTC)(link)
Я смотрю, ругаетесь плохими словами из Рабинера-Голда :)))) Там что-то про Гильберта было :)

[identity profile] psilogic.livejournal.com 2008-07-17 07:53 am (UTC)(link)
:))) Ну Кнут - это нашефсе :))) А Р-Г читать буду... пытаюсь настроиться, чтобы смириться с неизбежным ;)

[identity profile] sanitareugen.livejournal.com 2008-07-17 07:59 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] daddym.livejournal.com 2008-07-17 08:10 am (UTC)(link)
Чем больше перекрытие тем выше качество.

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

[identity profile] psilogic.livejournal.com 2008-07-17 08:17 am (UTC)(link)
Вторую часть какого отрезка? Ладно, наверное надо все-таки Р-Д читать. Там про свертки все есть?

А, ну конечно же

[identity profile] darth-vasya.livejournal.com 2008-07-17 08:18 am (UTC)(link)
...где y(x(t)) = x(t) * F[x(t)], где F собственно и есть компрессор, со своим временем отклика, коэффициентом сжатия и т.д. :)

Re: А, ну конечно же

[identity profile] psilogic.livejournal.com 2008-07-17 08:51 am (UTC)(link)
Ну и... какой конкретно компрессор нужен, чтобы убрать щелчки или там колебания громкости?

[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] sanitareugen.livejournal.com 2008-07-17 10:45 am (UTC)(link)
"Преобразователь и человек".

Из Гольденберга, Матюшкина, Поляка...

[identity profile] sanitareugen.livejournal.com 2008-07-17 10:50 am (UTC)(link)

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

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

[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)
*ушёл размышлять над тем, а какая, собственно, разница*

Re: Из Гольденберга, Матюшкина, Поляка...

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

Page 2 of 3