metaclass (metaclass) wrote,
metaclass
metaclass

Заборы, коровники, clojure, DSP

Пытался лечь спать, но два часа во сне решал проблему соединения блоков обработки сигналов. Пришлось встать и доделать. Под катом тестовое издевательство над DSL.


(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 сунуть объединение этих частей.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments