Skip to content

Commit ba5992e

Browse files
committed
dsp intro wip
1 parent ac8107f commit ba5992e

File tree

1 file changed

+44
-64
lines changed

1 file changed

+44
-64
lines changed

src/signal_processing/intro.clj

Lines changed: 44 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,46 +16,17 @@
1616
[scicloj.tableplot.v1.plotly :as plotly]))
1717

1818

19-
(defn sine-samples [{:keys [sample-rate duration frequency amplitude]
20-
:or {amplitude 0.5}}]
21-
(let [num-samples (int (* sample-rate duration))
22-
;; Generate samples as int16 reader
23-
]
24-
(for [idx (range num-samples)]
25-
(let [angle (* 2.0 Math/PI idx frequency (/ 1.0 sample-rate))]
26-
(* amplitude (Math/sin angle))))))
27-
28-
29-
(defn sample-info [samples sample-rate]
30-
(with-meta
31-
{:samples samples
32-
:sample-rate sample-rate}
33-
{:kind/audio true}))
34-
35-
36-
(let [sample-rate 44100.0
37-
A 440.0
38-
E 659.25
39-
wave (fn [freq]
40-
(sine-samples
41-
{:sample-rate sample-rate
42-
:duration 3
43-
:frequency freq
44-
:amplitude 0.3}))]
45-
(sample-info (map +
46-
(wave A)
47-
(wave E))
48-
sample-rate))
49-
50-
51-
(require '[tech.v3.datatype :as dtype]
19+
(require '[scicloj.kindly.v4.kind :as kind]
20+
'[tech.v3.datatype :as dtype]
5221
'[tech.v3.datatype.functional :as dfn]
5322
'[clojure.math :as math]
5423
'[tablecloth.api :as tc]
5524
'[scicloj.tableplot.v1.plotly :as plotly])
5625

5726
(def sample-rate 44100.0)
5827

28+
29+
5930
(def example-wave
6031
(let [duration 10
6132
num-samples (* duration sample-rate)
@@ -64,45 +35,53 @@
6435
(/ idx sample-rate))
6536
freq 440
6637
amp 3800
67-
amplitude (-> time
68-
(dfn/* (* 2 Math/PI freq))
69-
dfn/sin
70-
(dfn/* amp))]
38+
value (-> time
39+
(dfn/* (* 2 Math/PI freq))
40+
dfn/sin
41+
(dfn/* amp))]
7142
(tc/dataset {:time time
72-
:amplitude amplitude})))
43+
:value value})))
7344

7445
example-wave
7546

7647
(-> example-wave
7748
(tc/head 200)
7849
(plotly/layer-line {:=x :time
79-
:=y :amplitude}))
50+
:=y :value}))
8051

52+
(defn audio [samples]
53+
(with-meta
54+
{:samples samples
55+
:sample-rate sample-rate}
56+
{:kind/audio true}))
57+
58+
(-> example-wave
59+
:value
60+
audio)
8161

8262
(def violin-components
8363
[[:A4 440 3800]
8464
[:A5 880 2750]
85-
[:e6 1320 600]
86-
[:a6 1760 700]
87-
[:c#7 2200 1900]])
88-
89-
(DEF VIOLIN-COMPONENTS-DATASET
90-
(LET [DURATION 10
91-
NUM-SAMPLES (* DURATION SAMPLE-RATE)
92-
TIME (DTYPE/MAKE-READER :FLOAT32
93-
NUM-SAMPLES
94-
(/ IDX SAMPLE-RATE))]
95-
(->> VIOLIN-COMPONENTS
96-
(MAP (FN [[LABEL FREQ AMP]]
97-
[LABEL (-> TIME
98-
(DFN/* (* 2 mATH/pi FREQ))
99-
DFN/SIN
100-
(DFN/* AMP))]))
101-
(INTO {:TIME TIME})
102-
TC/DATASET)))
65+
[:E6 1320 600]
66+
[:A6 1760 700]
67+
[:C#7 2200 1900]])
10368

104-
violin-components-dataset
69+
(def violin-components-dataset
70+
(let [duration 10
71+
num-samples (* duration sample-rate)
72+
time (dtype/make-reader :float32
73+
num-samples
74+
(/ idx sample-rate))]
75+
(->> violin-components
76+
(map (fn [[label freq amp]]
77+
[label (-> time
78+
(dfn/* (* 2 math/PI freq))
79+
dfn/sin
80+
(dfn/* amp))]))
81+
(into {:time time})
82+
tc/dataset)))
10583

84+
violin-components-dataset
10685

10786
(-> violin-components-dataset
10887
(tc/head 200)
@@ -117,9 +96,9 @@ violin-components-dataset
11796
(-> violin-components-dataset
11897
(tc/head 200)
11998
(tc/pivot->longer (complement #{:time}))
120-
(tc/rename-columns {:$value :amplitude})
99+
(tc/rename-columns {:$value :value})
121100
(plotly/layer-line {:=x :time
122-
:=y :amplitude
101+
:=y :value
123102
:=color :$column}))
124103

125104
(def violin-dataset
@@ -131,15 +110,16 @@ violin-components-dataset
131110
(:A6 %)
132111
(:C#7 %)))))
133112

134-
135113
(-> violin-dataset
136114
(tc/head 200)
137115
(plotly/layer-line {:=x :time
138116
:=y :violin}))
139117

118+
(-> violin-dataset
119+
:violin
120+
(dfn// 7000.0)
121+
audio)
122+
140123

141-
(sample-info (dfn// (:violin violin-dataset)
142-
7000.0)
143-
sample-rate)
144124

145125

0 commit comments

Comments
 (0)