Заборы, коровники, clojure, DSP
Пытался лечь спать, но два часа во сне решал проблему соединения блоков обработки сигналов. Пришлось встать и доделать. Под катом тестовое издевательство над DSL.
Соединения можно еще упростить, если автоматически для каждого блока создать цепи с именами "блок-выход", а для входов ссылаться на них.
Каждый блок представляет собой объект (вернее, мап) с полями, где лежат функции типа "создать внешние ресурсы", "грохнуть внешние ресурсы", "начальное состояние", "рассчитать новое состояние и выходы, исходя из значений текущего состояния и входов" "закончились ли данные".
Пока из блоков сделаны только "чтение файла" "запись файла" "генератор синусоид" "блок с математической функцией внутри". Надо еще блок типа "фильтр" прикрутить, с коэффицентами прямой и рекурсивной части в качестве параметров.
Самая мякотка это функция combine-blocks - она разбирает переданные ей блоки на составные части и делает из них один большой блок, соединяя входы и выходы с помощью connections.
Еще я собираюсь во все атомарные блоки прикрутить функцию типа "сгенерировать уютную сишечьку для каждой составной части", а в combine-blocks сунуть объединение этих частей.
(def samplerate 19500)
(defn f-to-wT
[f]
(cmpx/div (ga/* pi 2 f) samplerate)
)
(defblock gen2400n complex-exp-generator (f-to-wT 2400) 0 1)
(defblock gen1200n complex-exp-generator (f-to-wT 1200) 0 1)
(defn unsigned-to-double
[^Byte b]
(/ (- b 128.0) 128.0))
(defblock snd-input byte-reader-block "sndfile-small.snd" unsigned-to-double)
(defblock multiplier math-block ga/*)
(defblock module math-block cmpx/norm)
(defblock text-out text-writer-block "text-out.txt" :append nil)
(defblock text-out-snd text-writer-block "text-out-snd.txt" :append nil)
(def connections
{:input-nets-name []
:gen2400n {:o [:gen2400n]}
:gen1200n {:o [:gen1200n]}
:snd-input {:o [:snd-input]}
:multiplier {:i [:gen2400n :snd-input] :o [:multiplier]}
:module {:i [:multiplier] :o [:module]}
:text-out {:i [:gen2400n :gen1200n :snd-input :multiplier]}
:text-out-snd {:i [:module]}
:output-nets-name [:snd-input]}
)
(defblock combined combine-blocks [gen2400n gen1200n snd-input multiplier module text-out text-out-snd] connections)
(time (run-block combined nil do-nothing))
Соединения можно еще упростить, если автоматически для каждого блока создать цепи с именами "блок-выход", а для входов ссылаться на них.
Каждый блок представляет собой объект (вернее, мап) с полями, где лежат функции типа "создать внешние ресурсы", "грохнуть внешние ресурсы", "начальное состояние", "рассчитать новое состояние и выходы, исходя из значений текущего состояния и входов" "закончились ли данные".
Пока из блоков сделаны только "чтение файла" "запись файла" "генератор синусоид" "блок с математической функцией внутри". Надо еще блок типа "фильтр" прикрутить, с коэффицентами прямой и рекурсивной части в качестве параметров.
Самая мякотка это функция combine-blocks - она разбирает переданные ей блоки на составные части и делает из них один большой блок, соединяя входы и выходы с помощью connections.
Еще я собираюсь во все атомарные блоки прикрутить функцию типа "сгенерировать уютную сишечьку для каждой составной части", а в combine-blocks сунуть объединение этих частей.
no subject
no subject
no subject