Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

49 Zeilen
1.0KB

  1. package mock
  2. import (
  3. "math"
  4. "math/rand"
  5. "sync"
  6. "time"
  7. )
  8. type Source struct {
  9. mu sync.Mutex
  10. phase float64
  11. phase2 float64
  12. phase3 float64
  13. sampleRate float64
  14. noise float64
  15. }
  16. func New(sampleRate int) *Source {
  17. rand.Seed(time.Now().UnixNano())
  18. return &Source{
  19. sampleRate: float64(sampleRate),
  20. noise: 0.02,
  21. }
  22. }
  23. func (s *Source) Start() error { return nil }
  24. func (s *Source) Stop() error { return nil }
  25. func (s *Source) ReadIQ(n int) ([]complex64, error) {
  26. s.mu.Lock()
  27. defer s.mu.Unlock()
  28. out := make([]complex64, n)
  29. f1 := 50e3
  30. f2 := -120e3
  31. f3 := 300e3
  32. for i := 0; i < n; i++ {
  33. s.phase += 2 * math.Pi * f1 / s.sampleRate
  34. s.phase2 += 2 * math.Pi * f2 / s.sampleRate
  35. s.phase3 += 2 * math.Pi * f3 / s.sampleRate
  36. re := math.Cos(s.phase) + 0.7*math.Cos(s.phase2) + 0.4*math.Cos(s.phase3)
  37. im := math.Sin(s.phase) + 0.7*math.Sin(s.phase2) + 0.4*math.Sin(s.phase3)
  38. re += s.noise * rand.NormFloat64()
  39. im += s.noise * rand.NormFloat64()
  40. out[i] = complex(float32(re), float32(im))
  41. }
  42. return out, nil
  43. }