Заборы, коровники, clojure, DSP
May. 20th, 2012 03:18 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Пытался лечь спать, но два часа во сне решал проблему соединения блоков обработки сигналов. Пришлось встать и доделать. Под катом тестовое издевательство над 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
Date: 2012-05-20 06:12 am (UTC)no subject
Date: 2012-05-20 06:16 am (UTC)no subject
Date: 2012-05-20 06:50 am (UTC)no subject
Date: 2012-05-20 06:51 am (UTC)no subject
Date: 2012-05-20 09:31 am (UTC)no subject
Date: 2012-05-20 06:45 am (UTC)Я бы посоветовал генерировать асм. Он проще. Можно S-exprами -- всё равно оно линейно мапится, да и собственный компилятор в общем невелик по размеру.
no subject
Date: 2012-05-20 06:51 am (UTC)no subject
Date: 2012-05-20 07:30 am (UTC)no subject
Date: 2012-05-20 07:31 am (UTC)no subject
Date: 2012-05-24 10:14 am (UTC)