You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.2KB

  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 len(iq) > 0 {
  14. envVar, zc, instStd, crest := ExtractTemporalFeatures(iq)
  15. feat.EnvVariance = envVar
  16. feat.ZeroCross = zc
  17. feat.InstFreqStd = instStd
  18. feat.CrestFactor = crest
  19. }
  20. var cls Classification
  21. switch mode {
  22. case ModeMath:
  23. if len(iq) > 0 {
  24. mf := ExtractMathFeatures(iq)
  25. cls = MathClassify(mf, feat.BW3dB, input.CenterHz, input.SNRDb)
  26. cls.Features = feat
  27. } else {
  28. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  29. }
  30. case ModeCombined:
  31. if len(iq) > 0 {
  32. mf := ExtractMathFeatures(iq)
  33. cls = CombinedClassify(feat, mf, input.CenterHz, input.SNRDb)
  34. } else {
  35. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  36. }
  37. default:
  38. cls = RuleClassify(feat, input.CenterHz, input.SNRDb)
  39. }
  40. return &cls
  41. }