Skip to content

Commit c8c7087

Browse files
committed
DSP intro WIP
1 parent 67086b7 commit c8c7087

1 file changed

Lines changed: 111 additions & 2 deletions

File tree

src/signal_processing/intro.clj

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,115 @@
55
:category :clojure
66
:type :post
77
:date "2025-11-02"
8-
:tags [:dsp :math :music]}}}
9-
(ns signal-processing.intro)
8+
:tags [:dsp :math :music]
9+
:draft true}}}
10+
(ns signal-processing.intro
11+
(:require [scicloj.kindly.v4.kind :as kind]
12+
[tech.v3.datatype :as dtype]
13+
[tech.v3.datatype.functional :as dfn]
14+
[clojure.math :as math]
15+
[tablecloth.api :as tc]
16+
[scicloj.tableplot.v1.plotly :as plotly]))
17+
18+
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]
52+
'[tech.v3.datatype.functional :as dfn]
53+
'[clojure.math :as math]
54+
'[tablecloth.api :as tc]
55+
'[scicloj.tableplot.v1.plotly :as plotly])
56+
57+
58+
(def violin-components
59+
[[:A4 440 3800]
60+
[:A5 880 2750]
61+
[:E6 1320 600]
62+
[:A6 1760 700]
63+
[:C#7 2200 1900]])
64+
65+
(def sample-rate 44100.0)
66+
67+
(def violin-components-dataset
68+
(let [duration 10
69+
num-samples (* duration sample-rate)
70+
time (dtype/make-reader :float32
71+
num-samples
72+
(/ idx sample-rate))]
73+
(->> violin-components
74+
(map (fn [[label freq amp]]
75+
[label (-> time
76+
(dfn/* (* 2 Math/PI freq))
77+
dfn/sin
78+
(dfn/* amp))]))
79+
(into {:time time})
80+
tc/dataset)))
81+
82+
83+
violin-components-dataset
84+
85+
86+
(-> violin-components-dataset
87+
(tc/head 1000)
88+
(plotly/layer-line {:=x :time
89+
:=y :A4}))
90+
91+
92+
(-> violin-components-dataset
93+
(tc/head 100)
94+
(tc/pivot->longer (complement #{:time}))
95+
(plotly/layer-line {:=x :time
96+
:=y :$value
97+
:=color :$column}))
98+
99+
(def violin-dataset
100+
(-> violin-components-dataset
101+
(tc/add-column :violin
102+
#(dfn/+ (:A4 %)
103+
(:A5 %)
104+
(:E6 %)
105+
(:A6 %)
106+
(:C#7 %)))))
107+
108+
109+
(-> violin-dataset
110+
(tc/head 400)
111+
(plotly/layer-line {:=x :time
112+
:=y :violin}))
113+
114+
115+
(sample-info (dfn// (:violin violin-dataset)
116+
7000.0)
117+
sample-rate)
118+
10119

0 commit comments

Comments
 (0)