Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

32 líneas
985B

  1. package dsp
  2. import "math"
  3. // GoertzelEnergy computes the energy at a specific frequency in a block
  4. // of samples using the Goertzel algorithm. Returns the magnitude squared.
  5. func GoertzelEnergy(samples []float64, sampleRate, targetFreqHz float64) float64 {
  6. n := len(samples)
  7. if n == 0 {
  8. return 0
  9. }
  10. k := int(0.5 + float64(n)*targetFreqHz/sampleRate)
  11. w := 2 * math.Pi * float64(k) / float64(n)
  12. coeff := 2 * math.Cos(w)
  13. var s0, s1, s2 float64
  14. for _, x := range samples {
  15. s0 = x + coeff*s1 - s2
  16. s2 = s1
  17. s1 = s0
  18. }
  19. return s1*s1 + s2*s2 - coeff*s1*s2
  20. }
  21. // BandEnergy computes aggregate energy in a frequency band by averaging
  22. // Goertzel results at the center and ±span/4 offsets.
  23. func BandEnergy(samples []float64, sampleRate, centerHz, spanHz float64) float64 {
  24. e0 := GoertzelEnergy(samples, sampleRate, centerHz)
  25. e1 := GoertzelEnergy(samples, sampleRate, centerHz-spanHz/4)
  26. e2 := GoertzelEnergy(samples, sampleRate, centerHz+spanHz/4)
  27. return (e0 + e1 + e2) / 3
  28. }