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

218 строки
8.0KB

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