-
Notifications
You must be signed in to change notification settings - Fork 1
/
lowpass_test.go
102 lines (94 loc) · 1.89 KB
/
lowpass_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package biquad
import (
"encoding/csv"
"image/color"
"os"
"strconv"
"testing"
"gonum.org/v1/plot"
"gonum.org/v1/plot/font"
"gonum.org/v1/plot/plotter"
)
func TestFilter(t *testing.T) {
const N = 12000
fp, err := os.Open("testdata/noisy_peak.csv")
if err != nil {
t.Fatal(err)
}
r := csv.NewReader(fp)
r.FieldsPerRecord = 3
r.Read() // skip header
sl1 := make([]float64, N)
sl2 := make([]float64, N)
i := 0
for i < N {
rec, err := r.Read()
if err != nil {
break
}
sl1[i], err = strconv.ParseFloat(rec[1], 32)
if err != nil {
t.Fatal(err)
}
sl2[i], err = strconv.ParseFloat(rec[2], 32)
if err != nil {
t.Fatal(err)
}
if sl2[i] != sl2[i] || sl1[i] != sl1[i] { // is nan
t.Errorf("float parsed NaN on line %d", i+1)
return
}
i++
}
const (
Ts = 40. / float64(N) // Sampling Period
Fs = 1 / Ts // Sampling frequency
f0 = Fs / 100. // Working frequency
T0 = 1 / f0 // Working period
)
s1 := &dData{ts: Ts, v: sl1}
s2 := &dData{ts: Ts, v: sl2}
lp, err := NewLowPass(Fs, f0, 1)
if err != nil {
t.Fatal(err)
}
s1filtered, err := lp.Filter(s1)
if err != nil {
t.Fatal(err)
}
lp.Filter(s2)
p := plot.New()
p.Legend = plot.NewLegend()
// original signal.
l1, err := plotter.NewLine(s1)
l1.Color = color.RGBA{R: 255, A: 255}
if err != nil {
t.Error(err)
}
// filtered signal
l1f, err := plotter.NewLine(s1filtered)
if err != nil {
t.Error(err)
}
p.Add(l1, l1f)
p.Legend.Add("Original signal [red]", l1)
p.Legend.Add("Filtered Signal", l1f)
cm := font.Centimeter
p.X.Max = 5
p.Y.Max = -350
p.Y.Min = -1200
err = p.Save(40*cm, 20*cm, "testdata/out.svg")
if err != nil {
t.Error(err)
}
}
// evenly spaced data
type dData struct {
// sampling period
ts float64
v []float64
}
func (d *dData) XY(i int) (t, y float64) {
return d.ts * float64(i), d.v[i]
}
func (d *dData) Len() int { return len(d.v) }