rlm@0
|
1 (ns rlm.thermal-noise
|
rlm@0
|
2 (:refer-clojure :only [])
|
rlm@0
|
3 (:require rlm.ns-rlm mobius.base))
|
rlm@0
|
4 (rlm.ns-rlm/ns-clone mobius.base)
|
rlm@0
|
5
|
rlm@0
|
6 (defrecord imaginary [real complex])
|
rlm@0
|
7
|
rlm@0
|
8 (defmethod + [imaginary Number] [i r]
|
rlm@0
|
9 (imaginary. (+ (:real i) r) (:complex i)))
|
rlm@0
|
10 (defmethod + [Number imaginary] [r i]
|
rlm@0
|
11 (+ i r))
|
rlm@0
|
12 (defmethod + [imaginary imaginary] [i1 i2]
|
rlm@0
|
13 (imaginary. (+ (:real i1) (:real i2))
|
rlm@0
|
14 (+ (:complex i1) (:complex i2))))
|
rlm@0
|
15
|
rlm@0
|
16
|
rlm@0
|
17 (defmethod * [imaginary Number] [i r]
|
rlm@0
|
18 (imaginary. (* r (:real i)) (* r (:complex i))))
|
rlm@0
|
19 (defmethod * [Number imaginary] [r i]
|
rlm@0
|
20 (* i r))
|
rlm@0
|
21 (defmethod * [imaginary imaginary] [i1 i2]
|
rlm@0
|
22 (let [[a1 b1] [(:real i1) (:complex i1)]
|
rlm@0
|
23 [a2 b2] [(:real i2) (:complex i2)]]
|
rlm@0
|
24 (imaginary. (- (* a1 a2) (* b1 b2))
|
rlm@0
|
25 (+ (* a1 b2) (* a2 b1)))))
|
rlm@0
|
26
|
rlm@0
|
27 (defmethod / imaginary [i]
|
rlm@0
|
28
|
rlm@0
|
29 (cond (and (not= (:real i) 0) (not= (:complex i) 0))
|
rlm@0
|
30 (let [[a b] [(:real i) (:complex i)]
|
rlm@0
|
31 d (- (/ (/ a) (+ (/ a b) (/ b a))))
|
rlm@0
|
32 c (/ (+ 1 (* b d)) a)]
|
rlm@0
|
33 (imaginary. c d))
|
rlm@0
|
34 (= (:real i) 0)
|
rlm@0
|
35 (imaginary. 0 (- (/ (:complex i))))
|
rlm@0
|
36 (= (:complex i) 0)
|
rlm@0
|
37 (imaginary. (/ (:real i)) 0)))
|
rlm@0
|
38
|
rlm@0
|
39
|
rlm@0
|
40 (defmethod / [imaginary imaginary] [i1 i2]
|
rlm@0
|
41 (* i1 (/ i2)))
|
rlm@0
|
42
|
rlm@0
|
43 (defmethod / [imaginary Number] [i r]
|
rlm@0
|
44 (* i (/ r)))
|
rlm@0
|
45
|
rlm@0
|
46 (defmethod / [Number imaginary] [r i]
|
rlm@0
|
47 (* r (/ i)))
|
rlm@0
|
48
|
rlm@0
|
49 (defmulti norm class)
|
rlm@0
|
50 (defmethod norm Number [r] r)
|
rlm@0
|
51 (defmethod norm imaginary [i]
|
rlm@0
|
52 (sqrt (+ (sq (:real i) ) (sq (:complex i)))))
|
rlm@0
|
53
|
rlm@0
|
54
|
rlm@0
|
55
|
rlm@0
|
56
|
rlm@0
|
57 (def i (imaginary. 0 1))
|
rlm@0
|
58
|
rlm@0
|
59 (defn h** [w_0 v_0 y w]
|
rlm@0
|
60 (/ v_0 (+ (- (sq w)) (* 2 y i w) (sq w_0))))
|
rlm@0
|
61
|
rlm@0
|
62 (def f_0 10e3)
|
rlm@0
|
63 (def w_0 (* f_0 2 Math/PI))
|
rlm@0
|
64 (def v_0 0.01)
|
rlm@0
|
65 (def h* (partial h** w_0 v_0))
|
rlm@0
|
66
|
rlm@0
|
67
|
rlm@0
|
68 (def x (range 1 1e7 100))
|
rlm@0
|
69
|
rlm@0
|
70 (def y-range [0.1 0.5 1 2 5 10 100 1000])
|
rlm@0
|
71
|
rlm@0
|
72
|
rlm@0
|
73 (defn graphs []
|
rlm@0
|
74 (let [plot (xy-plot)]
|
rlm@0
|
75 (dorun
|
rlm@0
|
76 (for [ y y-range]
|
rlm@0
|
77 (let [result (vec (map (partial (comp norm h*) y) x))]
|
rlm@0
|
78 (add-lines plot (vec (map log10 x)) (vec (map log10 result))))))
|
rlm@0
|
79 (set-x-label plot "log frequency")
|
rlm@0
|
80 (set-y-label plot "log h*")))
|
rlm@0
|
81
|
rlm@0
|
82 (def rrr (imaginary. 1 1))
|
rlm@0
|
83
|
rlm@0
|
84
|