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.

58 Zeilen
1.3KB

  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) UpdateConfig(sampleRate int, centerHz float64, gainDb float64, agc bool, bwKHz int) error {
  26. s.mu.Lock()
  27. defer s.mu.Unlock()
  28. if sampleRate > 0 {
  29. s.sampleRate = float64(sampleRate)
  30. }
  31. return nil
  32. }
  33. func (s *Source) ReadIQ(n int) ([]complex64, error) {
  34. s.mu.Lock()
  35. defer s.mu.Unlock()
  36. out := make([]complex64, n)
  37. f1 := 50e3
  38. f2 := -120e3
  39. f3 := 300e3
  40. for i := 0; i < n; i++ {
  41. s.phase += 2 * math.Pi * f1 / s.sampleRate
  42. s.phase2 += 2 * math.Pi * f2 / s.sampleRate
  43. s.phase3 += 2 * math.Pi * f3 / s.sampleRate
  44. re := math.Cos(s.phase) + 0.7*math.Cos(s.phase2) + 0.4*math.Cos(s.phase3)
  45. im := math.Sin(s.phase) + 0.7*math.Sin(s.phase2) + 0.4*math.Sin(s.phase3)
  46. re += s.noise * rand.NormFloat64()
  47. im += s.noise * rand.NormFloat64()
  48. out[i] = complex(float32(re), float32(im))
  49. }
  50. return out, nil
  51. }