Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

49 rindas
1.3KB

  1. package classifier
  2. type ClassifierMode string
  3. const (
  4. ModeRule ClassifierMode = "rule"
  5. ModeMath ClassifierMode = "math"
  6. ModeCombined ClassifierMode = "combined"
  7. )
  8. func Classify(input SignalInput, spectrum []float64, sampleRate int, fftSize int, iq []complex64, mode ClassifierMode) *Classification {
  9. if len(spectrum) == 0 || input.FirstBin < 0 || input.LastBin < 0 {
  10. return nil
  11. }
  12. feat := ExtractFeatures(input, spectrum, sampleRate, fftSize)
  13. if hard := TryHardRule(input.CenterHz, feat.BW3dB); hard != nil {
  14. hard.Features = feat
  15. return hard
  16. }
  17. if len(iq) > 0 {
  18. envVar, zc, instStd, crest := ExtractTemporalFeatures(iq)
  19. feat.EnvVariance = envVar
  20. feat.ZeroCross = zc
  21. feat.InstFreqStd = instStd
  22. feat.CrestFactor = crest
  23. }
  24. var cls Classification
  25. switch mode {
  26. case ModeMath:
  27. if len(iq) > 0 {
  28. mf := ExtractMathFeatures(iq)
  29. cls = MathClassify(mf, feat.BW3dB, input.CenterHz, input.SNRDb)
  30. cls.Features = feat
  31. } else {
  32. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  33. }
  34. case ModeCombined:
  35. if len(iq) > 0 {
  36. mf := ExtractMathFeatures(iq)
  37. cls = CombinedClassify(feat, mf, input.CenterHz, input.SNRDb)
  38. } else {
  39. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  40. }
  41. default:
  42. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  43. }
  44. return &cls
  45. }