Skip to content

Instantly share code, notes, and snippets.

@sio4
Last active November 26, 2022 13:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sio4/a4ea6b844f762ba7942ecfe9a8ab2bd4 to your computer and use it in GitHub Desktop.
Save sio4/a4ea6b844f762ba7942ecfe9a8ab2bd4 to your computer and use it in GitHub Desktop.
dsp highpass filter example
package main
import (
"fmt"
"log"
"math"
"net/http"
"github.com/eripe970/go-dsp-utils"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/components"
"github.com/go-echarts/go-echarts/v2/opts"
"github.com/go-echarts/go-echarts/v2/types"
"github.com/jfcg/butter"
)
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":4000", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
return
}
fmt.Println("---")
// A-1. Read the original signal---------------------------
signal1, err := dsp.ReadSignalFile("./tidal_sample_part.txt", 0.0166666)
if err != nil {
fmt.Println("error reading signal file:", err)
}
fmt.Println("source:", signal1)
plot_orig := plotSignal(signal1, opts.Title{
Title: "original signal",
Subtitle: signal1.String(),
})
normalized, _ := signal1.Normalize()
// A-4. DO High pass filter-------------------------------
filtered, err := signal1.HighPassFilter(0.0005)
if err != nil {
fmt.Println("filtering error:", err)
}
fmt.Println("filtered:", filtered.Signal[0:10])
plot_filtered := plotSignal(filtered, opts.Title{
Title: "filtered signal with 86400 sample",
Subtitle: filtered.String(),
})
normalizedfiltered, err := normalized.HighPassFilter(0.0005)
if err != nil {
fmt.Println("filtering error:", err)
}
fmt.Println("filtered:", normalizedfiltered.Signal[0:10])
plot_normalized_filtered := plotSignal(normalizedfiltered, opts.Title{
Title: "normalized-filtered signal with 86400 sample",
Subtitle: filtered.String(),
})
bFiltered := make([]float64, signal1.Length())
butterHPF := butter.NewHighPass1(2 * math.Pi * 0.0005 / 0.0166666)
butterHPF.NextS(signal1.Signal, bFiltered)
fmt.Println("bFiltered:", bFiltered[0:10])
filtered.Signal = bFiltered // fake, lazy to implement another plotter
plot_butter := plotSignal(filtered, opts.Title{
Title: "butter version, filtered signal with 86400 sample",
Subtitle: filtered.String(),
})
butterHPF2 := butter.NewHighPass1(2 * math.Pi * 0.0005 / 0.0166666)
butterHPF2.NextS(normalized.Signal, bFiltered)
fmt.Println("bFiltered:", bFiltered[0:10])
filtered.Signal = bFiltered // fake, lazy to implement another plotter
plot_butter_normalized := plotSignal(filtered, opts.Title{
Title: "butter version, normalized-filtered signal with 86400 sample",
Subtitle: filtered.String(),
})
page := components.NewPage()
page.AddCharts(
plot_orig,
plot_filtered,
plot_normalized_filtered,
plot_butter,
plot_butter_normalized,
)
page.Render(w)
}
func plotSignal(signal *dsp.Signal, title opts.Title) *charts.Line {
x := make([]string, 0)
y := make([]opts.LineData, 0)
for i := 0; i < signal.Length(); i++ {
x = append(x, fmt.Sprintf("%.1f", float64(i)/signal.SampleRate))
y = append(y, opts.LineData{Value: signal.Signal[i], Symbol: "none"})
}
line := charts.NewLine()
line.SetGlobalOptions(
charts.WithInitializationOpts(opts.Initialization{Theme: types.ThemeWonderland}),
charts.WithYAxisOpts(opts.YAxis{Max: signal.Max(), Min: signal.Min(), SplitNumber: 10}),
charts.WithXAxisOpts(opts.XAxis{SplitNumber: 10}),
charts.WithTitleOpts(title))
line.SetXAxis(x).AddSeries("data", y).SetSeriesOptions(
charts.WithLineChartOpts(opts.LineChart{
Smooth: true,
}),
)
return line
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment