Wideband autonomous SDR analysis engine forked from sdr-visual-suite
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

82 satır
2.0KB

  1. package dsp
  2. // StatefulDecimatingFIRComplex combines FIR filtering and decimation into a
  3. // single stateful stage. This avoids exposing FIR settling/transient output as
  4. // ordinary block-leading samples before decimation.
  5. type StatefulDecimatingFIRComplex struct {
  6. taps []float64
  7. delayR []float64
  8. delayI []float64
  9. factor int
  10. phase int // number of input samples until next output sample (0 => emit now)
  11. }
  12. func NewStatefulDecimatingFIRComplex(taps []float64, factor int) *StatefulDecimatingFIRComplex {
  13. if factor < 1 {
  14. factor = 1
  15. }
  16. t := make([]float64, len(taps))
  17. copy(t, taps)
  18. return &StatefulDecimatingFIRComplex{
  19. taps: t,
  20. delayR: make([]float64, len(taps)),
  21. delayI: make([]float64, len(taps)),
  22. factor: factor,
  23. phase: 0,
  24. }
  25. }
  26. func (f *StatefulDecimatingFIRComplex) Reset() {
  27. for i := range f.delayR {
  28. f.delayR[i] = 0
  29. f.delayI[i] = 0
  30. }
  31. f.phase = 0
  32. }
  33. func (f *StatefulDecimatingFIRComplex) Process(iq []complex64) []complex64 {
  34. if len(iq) == 0 || len(f.taps) == 0 {
  35. return nil
  36. }
  37. if f.factor <= 1 {
  38. out := make([]complex64, len(iq))
  39. for i := 0; i < len(iq); i++ {
  40. copy(f.delayR[1:], f.delayR[:len(f.taps)-1])
  41. copy(f.delayI[1:], f.delayI[:len(f.taps)-1])
  42. f.delayR[0] = float64(real(iq[i]))
  43. f.delayI[0] = float64(imag(iq[i]))
  44. var accR, accI float64
  45. for k := 0; k < len(f.taps); k++ {
  46. w := f.taps[k]
  47. accR += f.delayR[k] * w
  48. accI += f.delayI[k] * w
  49. }
  50. out[i] = complex(float32(accR), float32(accI))
  51. }
  52. return out
  53. }
  54. out := make([]complex64, 0, len(iq)/f.factor+1)
  55. n := len(f.taps)
  56. for i := 0; i < len(iq); i++ {
  57. copy(f.delayR[1:], f.delayR[:n-1])
  58. copy(f.delayI[1:], f.delayI[:n-1])
  59. f.delayR[0] = float64(real(iq[i]))
  60. f.delayI[0] = float64(imag(iq[i]))
  61. if f.phase == 0 {
  62. var accR, accI float64
  63. for k := 0; k < n; k++ {
  64. w := f.taps[k]
  65. accR += f.delayR[k] * w
  66. accI += f.delayI[k] * w
  67. }
  68. out = append(out, complex(float32(accR), float32(accI)))
  69. f.phase = f.factor - 1
  70. } else {
  71. f.phase--
  72. }
  73. }
  74. return out
  75. }