Wideband autonomous SDR analysis engine forked from sdr-visual-suite
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

222 行
9.1KB

  1. package pipeline
  2. import "sdr-wideband-suite/internal/config"
  3. type Policy struct {
  4. Mode string `json:"mode"`
  5. Profile string `json:"profile,omitempty"`
  6. Intent string `json:"intent"`
  7. MonitorCenterHz float64 `json:"monitor_center_hz,omitempty"`
  8. MonitorStartHz float64 `json:"monitor_start_hz,omitempty"`
  9. MonitorEndHz float64 `json:"monitor_end_hz,omitempty"`
  10. MonitorSpanHz float64 `json:"monitor_span_hz,omitempty"`
  11. SignalPriorities []string `json:"signal_priorities,omitempty"`
  12. AutoRecordClasses []string `json:"auto_record_classes,omitempty"`
  13. AutoDecodeClasses []string `json:"auto_decode_classes,omitempty"`
  14. SurveillanceFFTSize int `json:"surveillance_fft_size"`
  15. SurveillanceFPS int `json:"surveillance_fps"`
  16. DisplayBins int `json:"display_bins"`
  17. DisplayFPS int `json:"display_fps"`
  18. SurveillanceStrategy string `json:"surveillance_strategy"`
  19. SurveillanceDerivedDetection string `json:"surveillance_derived_detection"`
  20. RefinementStrategy string `json:"refinement_strategy,omitempty"`
  21. RefinementEnabled bool `json:"refinement_enabled"`
  22. MaxRefinementJobs int `json:"max_refinement_jobs"`
  23. RefinementMaxConcurrent int `json:"refinement_max_concurrent"`
  24. RefinementDetailFFTSize int `json:"refinement_detail_fft_size"`
  25. MinCandidateSNRDb float64 `json:"min_candidate_snr_db"`
  26. RefinementMinSpanHz float64 `json:"refinement_min_span_hz"`
  27. RefinementMaxSpanHz float64 `json:"refinement_max_span_hz"`
  28. RefinementAutoSpan bool `json:"refinement_auto_span"`
  29. PreferGPU bool `json:"prefer_gpu"`
  30. MaxRecordingStreams int `json:"max_recording_streams"`
  31. MaxDecodeJobs int `json:"max_decode_jobs"`
  32. DecisionHoldMs int `json:"decision_hold_ms"`
  33. SurveillanceDetection SurveillanceDetectionPolicy `json:"surveillance_detection,omitempty"`
  34. }
  35. func PolicyFromConfig(cfg config.Config) Policy {
  36. detailFFT := cfg.Refinement.DetailFFTSize
  37. if detailFFT <= 0 {
  38. detailFFT = cfg.Surveillance.AnalysisFFTSize
  39. }
  40. p := Policy{
  41. Mode: cfg.Pipeline.Mode,
  42. Profile: cfg.Pipeline.Profile,
  43. Intent: cfg.Pipeline.Goals.Intent,
  44. MonitorCenterHz: cfg.CenterHz,
  45. MonitorStartHz: cfg.Pipeline.Goals.MonitorStartHz,
  46. MonitorEndHz: cfg.Pipeline.Goals.MonitorEndHz,
  47. MonitorSpanHz: cfg.Pipeline.Goals.MonitorSpanHz,
  48. SignalPriorities: append([]string(nil), cfg.Pipeline.Goals.SignalPriorities...),
  49. AutoRecordClasses: append([]string(nil), cfg.Pipeline.Goals.AutoRecordClasses...),
  50. AutoDecodeClasses: append([]string(nil), cfg.Pipeline.Goals.AutoDecodeClasses...),
  51. SurveillanceFFTSize: cfg.Surveillance.AnalysisFFTSize,
  52. SurveillanceFPS: cfg.Surveillance.FrameRate,
  53. DisplayBins: cfg.Surveillance.DisplayBins,
  54. DisplayFPS: cfg.Surveillance.DisplayFPS,
  55. SurveillanceStrategy: cfg.Surveillance.Strategy,
  56. SurveillanceDerivedDetection: cfg.Surveillance.DerivedDetection,
  57. RefinementEnabled: cfg.Refinement.Enabled,
  58. MaxRefinementJobs: cfg.Resources.MaxRefinementJobs,
  59. RefinementMaxConcurrent: cfg.Refinement.MaxConcurrent,
  60. RefinementDetailFFTSize: detailFFT,
  61. MinCandidateSNRDb: cfg.Refinement.MinCandidateSNRDb,
  62. RefinementMinSpanHz: cfg.Refinement.MinSpanHz,
  63. RefinementMaxSpanHz: cfg.Refinement.MaxSpanHz,
  64. RefinementAutoSpan: config.BoolValue(cfg.Refinement.AutoSpan, true),
  65. PreferGPU: cfg.Resources.PreferGPU,
  66. MaxRecordingStreams: cfg.Resources.MaxRecordingStreams,
  67. MaxDecodeJobs: cfg.Resources.MaxDecodeJobs,
  68. DecisionHoldMs: cfg.Resources.DecisionHoldMs,
  69. }
  70. p.RefinementStrategy, _ = refinementStrategy(p)
  71. p.SurveillanceDetection = SurveillanceDetectionPolicyFromPolicy(p)
  72. if p.MonitorSpanHz <= 0 && p.MonitorStartHz != 0 && p.MonitorEndHz != 0 && p.MonitorEndHz > p.MonitorStartHz {
  73. p.MonitorSpanHz = p.MonitorEndHz - p.MonitorStartHz
  74. }
  75. return p
  76. }
  77. func ApplyNamedProfile(cfg *config.Config, name string) {
  78. if cfg == nil || name == "" {
  79. return
  80. }
  81. cfg.Pipeline.Profile = name
  82. if prof, ok := ResolveProfile(*cfg, name); ok {
  83. MergeProfile(cfg, prof)
  84. }
  85. switch name {
  86. case "legacy":
  87. cfg.Pipeline.Mode = "legacy"
  88. cfg.Pipeline.Goals.Intent = "general-monitoring"
  89. cfg.Surveillance.Strategy = "single-resolution"
  90. cfg.Refinement.Enabled = true
  91. if cfg.Resources.MaxRefinementJobs <= 0 {
  92. cfg.Resources.MaxRefinementJobs = 8
  93. }
  94. case "wideband-balanced":
  95. cfg.Pipeline.Mode = "wideband-balanced"
  96. cfg.Pipeline.Goals.Intent = "wideband-surveillance"
  97. cfg.Surveillance.Strategy = "multi-resolution"
  98. if cfg.Surveillance.AnalysisFFTSize < 4096 {
  99. cfg.Surveillance.AnalysisFFTSize = 4096
  100. }
  101. if cfg.FrameRate < 12 {
  102. cfg.FrameRate = 12
  103. }
  104. if cfg.Surveillance.FrameRate < 12 {
  105. cfg.Surveillance.FrameRate = 12
  106. }
  107. cfg.Refinement.Enabled = true
  108. if cfg.Refinement.MaxConcurrent < 16 {
  109. cfg.Refinement.MaxConcurrent = 16
  110. }
  111. if cfg.Resources.MaxRefinementJobs < 16 {
  112. cfg.Resources.MaxRefinementJobs = 16
  113. }
  114. if cfg.Refinement.MinSpanHz <= 0 {
  115. cfg.Refinement.MinSpanHz = 4000
  116. }
  117. if cfg.Refinement.MaxSpanHz <= 0 {
  118. cfg.Refinement.MaxSpanHz = 200000
  119. }
  120. if len(cfg.Pipeline.Goals.SignalPriorities) == 0 {
  121. cfg.Pipeline.Goals.SignalPriorities = []string{"digital", "wfm"}
  122. }
  123. cfg.Resources.PreferGPU = true
  124. case "wideband-aggressive":
  125. cfg.Pipeline.Mode = "wideband-aggressive"
  126. cfg.Pipeline.Goals.Intent = "high-density-wideband-surveillance"
  127. cfg.Surveillance.Strategy = "multi-resolution"
  128. if cfg.Surveillance.AnalysisFFTSize < 8192 {
  129. cfg.Surveillance.AnalysisFFTSize = 8192
  130. }
  131. if cfg.FrameRate < 10 {
  132. cfg.FrameRate = 10
  133. }
  134. if cfg.Surveillance.FrameRate < 10 {
  135. cfg.Surveillance.FrameRate = 10
  136. }
  137. cfg.Refinement.Enabled = true
  138. if cfg.Refinement.MaxConcurrent < 32 {
  139. cfg.Refinement.MaxConcurrent = 32
  140. }
  141. if cfg.Resources.MaxRefinementJobs < 32 {
  142. cfg.Resources.MaxRefinementJobs = 32
  143. }
  144. if cfg.Refinement.MinSpanHz <= 0 {
  145. cfg.Refinement.MinSpanHz = 6000
  146. }
  147. if cfg.Refinement.MaxSpanHz <= 0 {
  148. cfg.Refinement.MaxSpanHz = 250000
  149. }
  150. if len(cfg.Pipeline.Goals.SignalPriorities) == 0 {
  151. cfg.Pipeline.Goals.SignalPriorities = []string{"digital", "wfm", "trunk"}
  152. }
  153. cfg.Resources.PreferGPU = true
  154. case "archive":
  155. cfg.Pipeline.Mode = "archive"
  156. cfg.Pipeline.Goals.Intent = "archive-and-triage"
  157. cfg.Refinement.Enabled = true
  158. if cfg.Refinement.MaxConcurrent < 12 {
  159. cfg.Refinement.MaxConcurrent = 12
  160. }
  161. if cfg.Resources.MaxRefinementJobs < 12 {
  162. cfg.Resources.MaxRefinementJobs = 12
  163. }
  164. if cfg.Resources.MaxRecordingStreams < 24 {
  165. cfg.Resources.MaxRecordingStreams = 24
  166. }
  167. if cfg.Resources.MaxDecodeJobs < 12 {
  168. cfg.Resources.MaxDecodeJobs = 12
  169. }
  170. if len(cfg.Pipeline.Goals.SignalPriorities) == 0 {
  171. cfg.Pipeline.Goals.SignalPriorities = []string{"wfm", "nfm", "digital"}
  172. }
  173. if !cfg.Recorder.Enabled {
  174. cfg.Recorder.Enabled = true
  175. }
  176. case "digital-hunting":
  177. cfg.Pipeline.Mode = "digital-hunting"
  178. cfg.Pipeline.Goals.Intent = "digital-surveillance"
  179. cfg.Surveillance.Strategy = "multi-resolution"
  180. if cfg.Surveillance.AnalysisFFTSize < 4096 {
  181. cfg.Surveillance.AnalysisFFTSize = 4096
  182. }
  183. if cfg.FrameRate < 12 {
  184. cfg.FrameRate = 12
  185. }
  186. if cfg.Surveillance.FrameRate < 12 {
  187. cfg.Surveillance.FrameRate = 12
  188. }
  189. cfg.Refinement.Enabled = true
  190. if cfg.Refinement.MaxConcurrent < 16 {
  191. cfg.Refinement.MaxConcurrent = 16
  192. }
  193. if cfg.Resources.MaxRefinementJobs < 16 {
  194. cfg.Resources.MaxRefinementJobs = 16
  195. }
  196. if cfg.Refinement.MinSpanHz <= 0 {
  197. cfg.Refinement.MinSpanHz = 3000
  198. }
  199. if cfg.Refinement.MaxSpanHz <= 0 {
  200. cfg.Refinement.MaxSpanHz = 120000
  201. }
  202. if len(cfg.Pipeline.Goals.SignalPriorities) == 0 {
  203. cfg.Pipeline.Goals.SignalPriorities = []string{"ft8", "wspr", "fsk", "psk", "dmr"}
  204. }
  205. cfg.Resources.PreferGPU = true
  206. }
  207. if cfg.Pipeline.Goals.MonitorSpanHz <= 0 && cfg.SampleRate > 0 {
  208. cfg.Pipeline.Goals.MonitorSpanHz = float64(cfg.SampleRate)
  209. }
  210. if cfg.Resources.MaxDecodeJobs <= 0 {
  211. cfg.Resources.MaxDecodeJobs = cfg.Resources.MaxRecordingStreams
  212. }
  213. if cfg.Refinement.DetailFFTSize <= 0 {
  214. cfg.Refinement.DetailFFTSize = cfg.Surveillance.AnalysisFFTSize
  215. }
  216. cfg.FFTSize = cfg.Surveillance.AnalysisFFTSize
  217. }