Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

143 строки
5.3KB

  1. package pipeline
  2. import "sdr-wideband-suite/internal/config"
  3. type Policy struct {
  4. Mode string `json:"mode"`
  5. Intent string `json:"intent"`
  6. MonitorStartHz float64 `json:"monitor_start_hz,omitempty"`
  7. MonitorEndHz float64 `json:"monitor_end_hz,omitempty"`
  8. MonitorSpanHz float64 `json:"monitor_span_hz,omitempty"`
  9. SignalPriorities []string `json:"signal_priorities,omitempty"`
  10. AutoRecordClasses []string `json:"auto_record_classes,omitempty"`
  11. AutoDecodeClasses []string `json:"auto_decode_classes,omitempty"`
  12. SurveillanceFFTSize int `json:"surveillance_fft_size"`
  13. SurveillanceFPS int `json:"surveillance_fps"`
  14. DisplayBins int `json:"display_bins"`
  15. DisplayFPS int `json:"display_fps"`
  16. RefinementEnabled bool `json:"refinement_enabled"`
  17. MaxRefinementJobs int `json:"max_refinement_jobs"`
  18. RefinementMaxConcurrent int `json:"refinement_max_concurrent"`
  19. MinCandidateSNRDb float64 `json:"min_candidate_snr_db"`
  20. RefinementMinSpanHz float64 `json:"refinement_min_span_hz"`
  21. RefinementMaxSpanHz float64 `json:"refinement_max_span_hz"`
  22. RefinementAutoSpan bool `json:"refinement_auto_span"`
  23. PreferGPU bool `json:"prefer_gpu"`
  24. MaxDecodeJobs int `json:"max_decode_jobs"`
  25. DecisionHoldMs int `json:"decision_hold_ms"`
  26. }
  27. func PolicyFromConfig(cfg config.Config) Policy {
  28. return Policy{
  29. Mode: cfg.Pipeline.Mode,
  30. Intent: cfg.Pipeline.Goals.Intent,
  31. MonitorStartHz: cfg.Pipeline.Goals.MonitorStartHz,
  32. MonitorEndHz: cfg.Pipeline.Goals.MonitorEndHz,
  33. MonitorSpanHz: cfg.Pipeline.Goals.MonitorSpanHz,
  34. SignalPriorities: append([]string(nil), cfg.Pipeline.Goals.SignalPriorities...),
  35. AutoRecordClasses: append([]string(nil), cfg.Pipeline.Goals.AutoRecordClasses...),
  36. AutoDecodeClasses: append([]string(nil), cfg.Pipeline.Goals.AutoDecodeClasses...),
  37. SurveillanceFFTSize: cfg.Surveillance.AnalysisFFTSize,
  38. SurveillanceFPS: cfg.Surveillance.FrameRate,
  39. DisplayBins: cfg.Surveillance.DisplayBins,
  40. DisplayFPS: cfg.Surveillance.DisplayFPS,
  41. RefinementEnabled: cfg.Refinement.Enabled,
  42. MaxRefinementJobs: cfg.Resources.MaxRefinementJobs,
  43. RefinementMaxConcurrent: cfg.Refinement.MaxConcurrent,
  44. MinCandidateSNRDb: cfg.Refinement.MinCandidateSNRDb,
  45. RefinementMinSpanHz: cfg.Refinement.MinSpanHz,
  46. RefinementMaxSpanHz: cfg.Refinement.MaxSpanHz,
  47. RefinementAutoSpan: config.BoolValue(cfg.Refinement.AutoSpan, true),
  48. PreferGPU: cfg.Resources.PreferGPU,
  49. MaxDecodeJobs: cfg.Resources.MaxDecodeJobs,
  50. DecisionHoldMs: cfg.Resources.DecisionHoldMs,
  51. }
  52. }
  53. func ApplyNamedProfile(cfg *config.Config, name string) {
  54. if cfg == nil || name == "" {
  55. return
  56. }
  57. switch name {
  58. case "legacy":
  59. cfg.Pipeline.Mode = "legacy"
  60. cfg.Pipeline.Goals.Intent = "general-monitoring"
  61. cfg.Surveillance.Strategy = "single-resolution"
  62. cfg.Refinement.Enabled = true
  63. if cfg.Resources.MaxRefinementJobs <= 0 {
  64. cfg.Resources.MaxRefinementJobs = 8
  65. }
  66. case "wideband-balanced":
  67. cfg.Pipeline.Mode = "wideband-balanced"
  68. cfg.Pipeline.Goals.Intent = "wideband-surveillance"
  69. cfg.Surveillance.Strategy = "single-resolution"
  70. if cfg.Surveillance.AnalysisFFTSize < 4096 {
  71. cfg.Surveillance.AnalysisFFTSize = 4096
  72. }
  73. if cfg.FrameRate < 12 {
  74. cfg.FrameRate = 12
  75. }
  76. if cfg.Surveillance.FrameRate < 12 {
  77. cfg.Surveillance.FrameRate = 12
  78. }
  79. cfg.Refinement.Enabled = true
  80. if cfg.Refinement.MaxConcurrent < 16 {
  81. cfg.Refinement.MaxConcurrent = 16
  82. }
  83. if cfg.Resources.MaxRefinementJobs < 16 {
  84. cfg.Resources.MaxRefinementJobs = 16
  85. }
  86. if cfg.Refinement.MinSpanHz <= 0 {
  87. cfg.Refinement.MinSpanHz = 4000
  88. }
  89. if cfg.Refinement.MaxSpanHz <= 0 {
  90. cfg.Refinement.MaxSpanHz = 200000
  91. }
  92. cfg.Resources.PreferGPU = true
  93. case "wideband-aggressive":
  94. cfg.Pipeline.Mode = "wideband-aggressive"
  95. cfg.Pipeline.Goals.Intent = "high-density-wideband-surveillance"
  96. cfg.Surveillance.Strategy = "single-resolution"
  97. if cfg.Surveillance.AnalysisFFTSize < 8192 {
  98. cfg.Surveillance.AnalysisFFTSize = 8192
  99. }
  100. if cfg.FrameRate < 10 {
  101. cfg.FrameRate = 10
  102. }
  103. if cfg.Surveillance.FrameRate < 10 {
  104. cfg.Surveillance.FrameRate = 10
  105. }
  106. cfg.Refinement.Enabled = true
  107. if cfg.Refinement.MaxConcurrent < 32 {
  108. cfg.Refinement.MaxConcurrent = 32
  109. }
  110. if cfg.Resources.MaxRefinementJobs < 32 {
  111. cfg.Resources.MaxRefinementJobs = 32
  112. }
  113. if cfg.Refinement.MinSpanHz <= 0 {
  114. cfg.Refinement.MinSpanHz = 6000
  115. }
  116. if cfg.Refinement.MaxSpanHz <= 0 {
  117. cfg.Refinement.MaxSpanHz = 250000
  118. }
  119. cfg.Resources.PreferGPU = true
  120. case "archive":
  121. cfg.Pipeline.Mode = "archive"
  122. cfg.Pipeline.Goals.Intent = "archive-and-triage"
  123. cfg.Refinement.Enabled = true
  124. if cfg.Refinement.MaxConcurrent < 12 {
  125. cfg.Refinement.MaxConcurrent = 12
  126. }
  127. if cfg.Resources.MaxRefinementJobs < 12 {
  128. cfg.Resources.MaxRefinementJobs = 12
  129. }
  130. if !cfg.Recorder.Enabled {
  131. cfg.Recorder.Enabled = true
  132. }
  133. }
  134. if cfg.Resources.MaxDecodeJobs <= 0 {
  135. cfg.Resources.MaxDecodeJobs = cfg.Resources.MaxRecordingStreams
  136. }
  137. cfg.FFTSize = cfg.Surveillance.AnalysisFFTSize
  138. }