metaclass: (Default)
[personal profile] metaclass
Пытался лечь спать, но два часа во сне решал проблему соединения блоков обработки сигналов. Пришлось встать и доделать. Под катом тестовое издевательство над 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 сунуть объединение этих частей.

Date: 2012-05-20 06:12 am (UTC)
From: [identity profile] enternet.livejournal.com
Ребе, а посоветуйте реле контроля тока. Без наворотов. Нужно вентилятор держать включенным, пока сушилка сушит (и требует при этом 10А).

Date: 2012-05-20 06:16 am (UTC)
From: [identity profile] metaclass.livejournal.com
Хм, не сталкивался.

Date: 2012-05-20 06:50 am (UTC)
From: [identity profile] trueblacker.livejournal.com
Вы что же, ребе, вентилятор выключаете, что ли?

Date: 2012-05-20 06:51 am (UTC)
From: [identity profile] metaclass.livejournal.com
У меня нет сушилки, которая кушает 10А.

Date: 2012-05-20 09:31 am (UTC)
From: [identity profile] kong-en-ge.livejournal.com
Ну так напишите!

Date: 2012-05-20 06:45 am (UTC)
From: [identity profile] tzirechnoy.livejournal.com
>"сгенерировать уютную сишечьку для каждой составной части"

Я бы посоветовал генерировать асм. Он проще. Можно S-exprами -- всё равно оно линейно мапится, да и собственный компилятор в общем невелик по размеру.

Date: 2012-05-20 06:51 am (UTC)
From: [identity profile] metaclass.livejournal.com
Он для разных процов разный, а С чуть более одинаковый.

Date: 2012-05-20 07:31 am (UTC)
From: [identity profile] metaclass.livejournal.com
О, это ж повод сломать голову еще и над ней.

Date: 2012-05-24 10:14 am (UTC)
From: [identity profile] tzirechnoy.livejournal.com
К тому времени, как первый генератор начнёт выдавать что-то стоящее -- Вы скорее всего ужэ поймёте, что это несущественно. Кроме того, вторым асмом можно сделать как раз код на сишэчке, если так уж хочется.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 17th, 2025 07:00 pm
Powered by Dreamwidth Studios