Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

90 lignes
1.8KB

  1. package classifier
  2. import (
  3. _ "embed"
  4. "encoding/json"
  5. "math"
  6. )
  7. //go:embed frequency_context.json
  8. var frequencyContextJSON []byte
  9. type frequencyRange struct {
  10. Name string `json:"name"`
  11. StartMHz float64 `json:"start_mhz"`
  12. EndMHz float64 `json:"end_mhz"`
  13. }
  14. type frequencyContextConfig struct {
  15. FT8MHz []float64 `json:"ft8_mhz"`
  16. WSPRMHz []float64 `json:"wspr_mhz"`
  17. Ranges []frequencyRange `json:"ranges"`
  18. }
  19. var frequencyContext = loadFrequencyContext()
  20. func loadFrequencyContext() frequencyContextConfig {
  21. var cfg frequencyContextConfig
  22. if err := json.Unmarshal(frequencyContextJSON, &cfg); err != nil {
  23. return frequencyContextConfig{}
  24. }
  25. return cfg
  26. }
  27. func addFrequencyContext(add func(SignalClass, float64), centerHz float64, bw float64) {
  28. mhz := centerHz / 1e6
  29. for _, r := range frequencyContext.Ranges {
  30. if mhz < r.StartMHz || mhz > r.EndMHz {
  31. continue
  32. }
  33. switch r.Name {
  34. case "hf":
  35. for _, f := range frequencyContext.FT8MHz {
  36. if math.Abs(mhz-f) < 0.003 && bw >= 1500 && bw <= 3500 {
  37. add(ClassFT8, 2.0)
  38. break
  39. }
  40. }
  41. for _, f := range frequencyContext.WSPRMHz {
  42. if math.Abs(mhz-f) < 0.001 && bw >= 100 && bw <= 500 {
  43. add(ClassWSPR, 2.0)
  44. break
  45. }
  46. }
  47. if bw < 500 {
  48. add(ClassCW, 0.5)
  49. }
  50. if bw >= 2000 && bw <= 4000 {
  51. if mhz < 10 {
  52. add(ClassSSBLSB, 0.8)
  53. } else {
  54. add(ClassSSBUSB, 0.8)
  55. }
  56. }
  57. case "vhf_2m":
  58. if bw >= 6000 && bw <= 16000 {
  59. add(ClassNFM, 0.5)
  60. }
  61. if bw >= 2000 && bw <= 4000 {
  62. add(ClassSSBUSB, 0.5)
  63. }
  64. case "uhf_70cm":
  65. if bw >= 6000 && bw <= 16000 {
  66. add(ClassNFM, 0.3)
  67. add(ClassDMR, 0.5)
  68. add(ClassDStar, 0.3)
  69. }
  70. case "pmr446":
  71. add(ClassNFM, 1.0)
  72. case "broadcast_fm":
  73. if bw >= 50000 {
  74. add(ClassWFM, 1.5)
  75. }
  76. case "airband":
  77. if bw >= 5000 && bw <= 10000 {
  78. add(ClassAM, 1.5)
  79. }
  80. }
  81. }
  82. }