Wideband autonomous SDR analysis engine forked from sdr-visual-suite
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.0KB

  1. package pipeline
  2. import (
  3. "sdr-wideband-suite/internal/classifier"
  4. "sdr-wideband-suite/internal/detector"
  5. )
  6. // RefineCandidates upgrades coarse detector candidates into refined signals
  7. // by attaching local IQ-derived classification and PLL metadata.
  8. func RefineCandidates(candidates []Candidate, windows []RefinementWindow, spectrum []float64, sampleRate int, fftSize int, snippets [][]complex64, snippetRates []int, mode classifier.ClassifierMode) []Refinement {
  9. out := make([]Refinement, 0, len(candidates))
  10. for i, c := range candidates {
  11. sig := detector.Signal{
  12. ID: c.ID,
  13. FirstBin: c.FirstBin,
  14. LastBin: c.LastBin,
  15. CenterHz: c.CenterHz,
  16. BWHz: c.BandwidthHz,
  17. PeakDb: c.PeakDb,
  18. SNRDb: c.SNRDb,
  19. NoiseDb: c.NoiseDb,
  20. }
  21. var snip []complex64
  22. if i < len(snippets) {
  23. snip = snippets[i]
  24. }
  25. snipRate := sampleRate
  26. if i < len(snippetRates) && snippetRates[i] > 0 {
  27. snipRate = snippetRates[i]
  28. }
  29. cls := classifier.Classify(classifier.SignalInput{
  30. FirstBin: sig.FirstBin,
  31. LastBin: sig.LastBin,
  32. SNRDb: sig.SNRDb,
  33. CenterHz: sig.CenterHz,
  34. BWHz: sig.BWHz,
  35. }, spectrum, sampleRate, fftSize, snip, mode)
  36. sig.Class = cls
  37. if cls != nil && snip != nil && len(snip) > 256 {
  38. pll := classifier.EstimateExactFrequency(snip, snipRate, sig.CenterHz, cls.ModType)
  39. cls.PLL = &pll
  40. sig.PLL = &pll
  41. if cls.ModType == classifier.ClassWFM && pll.Stereo {
  42. cls.ModType = classifier.ClassWFMStereo
  43. }
  44. }
  45. var window RefinementWindow
  46. if i < len(windows) {
  47. window = windows[i]
  48. }
  49. if window.CenterHz == 0 {
  50. window.CenterHz = c.CenterHz
  51. }
  52. if window.SpanHz <= 0 {
  53. if c.BandwidthHz > 0 {
  54. window.SpanHz = c.BandwidthHz
  55. } else {
  56. window.SpanHz = 12000
  57. }
  58. }
  59. if window.Source == "" {
  60. window.Source = "candidate"
  61. }
  62. out = append(out, Refinement{
  63. Candidate: c,
  64. Window: window,
  65. Signal: sig,
  66. SnippetRate: snipRate,
  67. Class: cls,
  68. Stage: "local-iq",
  69. })
  70. }
  71. return out
  72. }