|
- package fftutil
-
- import (
- "math"
-
- "gonum.org/v1/gonum/dsp/fourier"
- )
-
- func Hann(n int) []float64 {
- w := make([]float64, n)
- if n <= 1 {
- if n == 1 {
- w[0] = 1
- }
- return w
- }
- for i := 0; i < n; i++ {
- w[i] = 0.5 * (1 - math.Cos(2*math.Pi*float64(i)/float64(n-1)))
- }
- return w
- }
-
- func Spectrum(iq []complex64, window []float64) []float64 {
- n := len(iq)
- if n == 0 {
- return nil
- }
- in := make([]complex128, n)
- for i := 0; i < n; i++ {
- v := iq[i]
- w := 1.0
- if len(window) == n {
- w = window[i]
- }
- in[i] = complex(float64(real(v))*w, float64(imag(v))*w)
- }
- fft := fourier.NewCmplxFFT(n)
- out := make([]complex128, n)
- fft.Coefficients(out, in)
-
- power := make([]float64, n)
- eps := 1e-12
- invN := 1.0 / float64(n)
- for i := 0; i < n; i++ {
- idx := (i + n/2) % n
- mag := cmplxAbs(out[idx]) * invN
- p := 20 * math.Log10(mag+eps)
- power[i] = p
- }
- return power
- }
-
- func cmplxAbs(v complex128) float64 {
- return math.Hypot(real(v), imag(v))
- }
|