Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

62 linhas
1.7KB

  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. out = append(out, Refinement{
  50. Candidate: c,
  51. Window: window,
  52. Signal: sig,
  53. SnippetRate: snipRate,
  54. Class: cls,
  55. Stage: "local-iq",
  56. })
  57. }
  58. return out
  59. }