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.

104 Zeilen
2.4KB

  1. package detector
  2. import (
  3. "testing"
  4. "time"
  5. "sdr-visual-suite/internal/config"
  6. )
  7. func TestDetectorCreatesEvent(t *testing.T) {
  8. d := New(config.DetectorConfig{
  9. ThresholdDb: -10,
  10. MinDurationMs: 1,
  11. HoldMs: 10,
  12. EmaAlpha: 0.2,
  13. HysteresisDb: 3,
  14. MinStableFrames: 1,
  15. GapToleranceMs: 10,
  16. CFARMode: "OFF",
  17. CFARGuardCells: 2,
  18. CFARTrainCells: 16,
  19. CFARRank: 24,
  20. CFARScaleDb: 6,
  21. CFARWrapAround: true,
  22. }, 1000, 10)
  23. center := 0.0
  24. spectrum := []float64{-30, -30, -30, -5, -5, -30, -30, -30, -30, -30}
  25. now := time.Now()
  26. finished, signals := d.Process(now, spectrum, center)
  27. if len(finished) != 0 {
  28. t.Fatalf("expected no finished events yet")
  29. }
  30. if len(signals) != 1 {
  31. t.Fatalf("expected 1 signal, got %d", len(signals))
  32. }
  33. if signals[0].BWHz <= 0 {
  34. t.Fatalf("expected bandwidth > 0")
  35. }
  36. _, _ = d.Process(now.Add(5*time.Millisecond), spectrum, center)
  37. now2 := now.Add(30 * time.Millisecond)
  38. noSignal := make([]float64, len(spectrum))
  39. for i := range noSignal {
  40. noSignal[i] = -100
  41. }
  42. finished, _ = d.Process(now2, noSignal, center)
  43. if len(finished) != 1 {
  44. t.Fatalf("expected 1 finished event, got %d", len(finished))
  45. }
  46. if finished[0].Bandwidth <= 0 {
  47. t.Fatalf("event bandwidth not set")
  48. }
  49. }
  50. func TestSignalBandwidthExpansion(t *testing.T) {
  51. sampleRate := 2048000
  52. fftSize := 2048
  53. cfg := config.DetectorConfig{
  54. ThresholdDb: -20,
  55. MinDurationMs: 1,
  56. HoldMs: 10,
  57. EmaAlpha: 1.0,
  58. HysteresisDb: 3,
  59. MinStableFrames: 1,
  60. GapToleranceMs: 10,
  61. CFARMode: "OFF",
  62. CFARGuardCells: 2,
  63. CFARTrainCells: 8,
  64. CFARRank: 12,
  65. CFARScaleDb: 6,
  66. CFARWrapAround: true,
  67. EdgeMarginDb: 3.0,
  68. MaxSignalBwHz: 150000,
  69. }
  70. d := New(cfg, sampleRate, fftSize)
  71. spectrum := make([]float64, fftSize)
  72. for i := range spectrum {
  73. spectrum[i] = -100
  74. }
  75. for i := 1000; i <= 1012; i++ {
  76. spectrum[i] = -20
  77. }
  78. for j := 1; j <= 5; j++ {
  79. level := -20 - float64(j)*3
  80. if 1000-j >= 0 {
  81. spectrum[1000-j] = level
  82. }
  83. if 1012+j < fftSize {
  84. spectrum[1012+j] = level
  85. }
  86. }
  87. now := time.Now()
  88. _, signals := d.Process(now, spectrum, 434e6)
  89. if len(signals) == 0 {
  90. t.Fatal("no signals detected")
  91. }
  92. sig := signals[0]
  93. expectedMinBW := 18.0 * 1000
  94. if sig.BWHz < expectedMinBW {
  95. t.Errorf("BW too narrow: got %.0f Hz, want >= %.0f Hz (FirstBin=%d LastBin=%d)", sig.BWHz, expectedMinBW, sig.FirstBin, sig.LastBin)
  96. }
  97. }