Автор Тема: LV2-плагин для Linux (импульсы)  (Прочитано 2133 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
LV2-плагин для Linux (импульсы)
« : Сентября 23, 2013, 00:11:59 »
Было немного свободного времени...
Решил тряхнуть стариной и вспомнить, как надо программить на C/C++/x86 assembler.
В итоге вылилось в то, что реализовал свой плагин для impulse responses.
На SSE (если, конечно, кто знает, что это такое) работает куда шустрее, чем на FPU  :crazy:.

Вот живой пример:
Implementing Calf Impulse Responses

А вот тема с выложенным патчем:
https://sourceforge.net/p/calf/patches/10/

Брал материал для видео отсюда:
https://guitarplayer.ru/index.php?topic=147691.0
Так что прости, rozhok, если что не так.
« Последнее редактирование: Сентября 26, 2013, 13:09:18 от SadKo »

Оффлайн PVDHP Vadim

  • Эксперт
  • *****
  • Сообщений: 2879
Re: Impulse Responses
« Ответ #1 : Сентября 23, 2013, 16:02:44 »
SadKo, импульсник с нулевой задержкой?

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
Re: Impulse Responses
« Ответ #2 : Сентября 23, 2013, 21:47:45 »
PVDHP Vadim, а там должна быть какая-то задержка?

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #3 : Сентября 24, 2013, 00:03:38 »
PVDHP Vadim, а там должна быть какая-то задержка?
Как сделаешь. У некоторых бывает.

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
Re: Impulse Responses
« Ответ #4 : Сентября 24, 2013, 09:58:16 »
deLuther,  :o
По-моему, это совсем не тот плагин, где можно накодить вычисления с задержкой.

Оффлайн NSb

  • Живу на форуме
  • *******
  • Сообщений: 23373
  • shit in - shit out
Re: Impulse Responses
« Ответ #5 : Сентября 24, 2013, 10:07:34 »
всё это замечательно, горю желанием потестить и все такое.... но...  где в формате VST??  :hmmm: :crazy: или я чего не разглядел

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #6 : Сентября 24, 2013, 10:12:56 »
SadKo,
Если делать прямым методом, то да, если через быструю свёртку, то вполне можно, примеры есть - тот же Poulin LeCab. При быстрой свёртке любой метод формально имеет ненулевую задержку, но её можно сделать чтобы при получении буфера данные получались сразу, т.е. в плагинном мире получается нулевая задержка, для FFT обязательно иметь в наличии массив данных наперёд.
Но прямой метод становится жутко неэффективным при увеличении длины импульса, поэтому все и пользуются быстрой свёрткой.
Какой метод используется в данном случае?
« Последнее редактирование: Сентября 24, 2013, 10:17:17 от deLuther »

Оффлайн PVDHP Vadim

  • Эксперт
  • *****
  • Сообщений: 2879
Re: Impulse Responses
« Ответ #7 : Сентября 24, 2013, 13:37:41 »
deLuther, читая процесс разработки импульсников с нулевой задержкой на форуме synthmaker выясняется, что неэффективность метода для моментального выведения данных неплохо решается при помощи разбиения звука на куски и обработки их по отдельности, по очереди.
« Последнее редактирование: Сентября 24, 2013, 13:40:41 от PVDHP Vadim »

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #8 : Сентября 24, 2013, 14:54:08 »
PVDHP Vadim,
Правильно, это ещё в статье Гарсии давно описано, но не все так делают.
Причём с разбиением на куски даже есть разные подходы, можно просто использовать блочный алгоритм, можно частотную линию задержки, последнее несколько эффективнее, по сути всё то же, но наложение фрагментов происходит в частотной области, на один поступающий блок (с равномерной разбивкой на одинаковые блоки) надо одно прямое и одно обратное преобразование.

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
Re: Impulse Responses
« Ответ #9 : Сентября 24, 2013, 23:47:08 »
deLuther, PVDHP Vadim,  вы что?

http://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BA%D0%BB%D0%B8%D0%BA

http://upload.wikimedia.org/math/9/c/b/9cbe17b8ba8dc41b01c2aa88ff776d78.png - больше ничего не надо, т.к. импульс сам по себе уже описывает всю дальнейшую характеристику поведения системы.
Надо не напёрёд смотреть, а всего лишь достаточно хранить историю достаточную для вычисления всей свёртки. А хранение истории к увеличению времени отклика не ведёт никаким образом: первый семпл всегда можно вычислить сейчас, зная историю по предыдущим.

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #10 : Сентября 24, 2013, 23:50:34 »
SadKo,
Ну правильно, ты просто считаешь так называемым прямым методом, а в большинстве мат-пакетов (Matlab, Mathematica итп.) для эффективности давно уже используют так называемую быструю свёртку, через FFT.
Она намного вычислительно эффективнее.
http://en.wikipedia.org/wiki/Convolution#Fast_convolution_algorithms
В DSP обычно тоже стремятся использовать быструю свёртку, когда надо "тру" нулевую задержку, то первые сэмплы вычисляются прямым методом, потом вычисления идут через быструю свёртку.
Для массива длинной N, прямая свёртка требует N*N операций, а быстрая порядка N*log(N).
Собственно достаточно сравнить KeFIR (прямая свёртка) с Pristine Space (быстрая) на достаточно длинном импульсе, чтобы было яснее кто больше ресурсов потребляет (качественно оба сопоставимы) :)
« Последнее редактирование: Сентября 24, 2013, 23:58:50 от deLuther »

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
Re: Impulse Responses
« Ответ #11 : Сентября 24, 2013, 23:59:11 »
deLuther, ваша правда. Я считаю в лоб. Не знаю как с быстрой свёрткой (надо матан вспоминать, лет пять уже прошло как нас мучали АЦП и ЦАП), но расчёт в лоб как раз позволяет добиться нулевой латентности.

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #12 : Сентября 25, 2013, 00:01:39 »
SadKo,
Только не особо надо, всё равно обработка ведётся буферами достаточно большими (собственно практические значения асио-буфера обычно от 128 сэмплов), тут главное организовать алгоритм чтобы результат выдать сразу, а посемплово или поблочно будут вычисления уже никакой разницы. От длины блока (степень 2х или нет) зависимость небольшая по точности.

А есть какие-то данные по производительности, скажем если взять импульс порядка 200мс?
Просто я смотрю что тут на DSP уходит где-то 10% и выше от проца, при относительно коротком импульсе, если импульсник единственный плаг в проекте...
« Последнее редактирование: Сентября 25, 2013, 00:11:39 от deLuther »

Оффлайн SadKo Автор темы

  • Завсегдатай
  • ***
  • Сообщений: 278
  • Angry Proger
Re: Impulse Responses
« Ответ #13 : Сентября 25, 2013, 00:13:18 »
deLuther, в принципе, да. Я сам обрабатываю входные данные по 4 семпла за раз для 32-битной архитектуры и по 8 семплов для 64-битной. Чтобы звук каб-эмуляции был приемлемым, в принципе, достаточно вполне небольшой части оригинального импульса (10-20%), а производительность... Вполне приемлемая лично для меня.
Собственно, про asio ничего не знаю, у меня jack + rt linux. Поэтому при записи использую буфер 128 семплов, а когда уже обрабатываю записанное, ставлю буфер побольше - тут уже latency не так критично, как при записи.
Другое дело, что код на ассемблере с полноценным использованием SSE дал реальный прирост по производительности вычислений и значительно снизил нагрузку на CPU - уже кое-какое достижение  ;D.

Оффлайн deLuther

  • Живу на форуме
  • *******
  • Сообщений: 33526
  • alderman of morning star
    • Malefice
Re: Impulse Responses
« Ответ #14 : Сентября 25, 2013, 00:15:31 »
Ну а быстрая свёртка ещё снизит дальше :)
Просто чем короче импульс, тем хуже его разрешение, особенно на низах.
Ну вот, те же 128 сэмплов :)
Можно обрабатывать блоками такими, будет та же нулевая задержка, т.е. на каждый поступающий блок результат можно выдать сразу. Прямая конволюция имеет преимущество над быстрой при длине блока до 64х сэмплов.
« Последнее редактирование: Сентября 25, 2013, 00:18:00 от deLuther »