25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.0KB

  1. package demod
  2. import "math"
  3. type USB struct{}
  4. type LSB struct{}
  5. func (USB) Name() string { return "USB" }
  6. func (LSB) Name() string { return "LSB" }
  7. func (USB) OutputSampleRate() int { return 48000 }
  8. func (LSB) OutputSampleRate() int { return 48000 }
  9. func (USB) Channels() int { return 1 }
  10. func (LSB) Channels() int { return 1 }
  11. func (USB) Demod(iq []complex64, sampleRate int) []float32 { return ssb(iq, sampleRate, true) }
  12. func (LSB) Demod(iq []complex64, sampleRate int) []float32 { return ssb(iq, sampleRate, false) }
  13. func ssb(iq []complex64, sampleRate int, usb bool) []float32 {
  14. if len(iq) == 0 {
  15. return nil
  16. }
  17. out := make([]float32, len(iq))
  18. bfo := 700.0
  19. if !usb {
  20. bfo = -700.0
  21. }
  22. phase := 0.0
  23. inc := 2 * math.Pi * bfo / float64(sampleRate)
  24. for i := 0; i < len(iq); i++ {
  25. phase += inc
  26. c := math.Cos(phase)
  27. s := math.Sin(phase)
  28. v := iq[i]
  29. // product detector
  30. out[i] = float32(float64(real(v))*c - float64(imag(v))*s)
  31. }
  32. return out
  33. }
  34. func init() {
  35. Register(USB{})
  36. Register(LSB{})
  37. }