25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

114 satır
2.1KB

  1. package cfar
  2. import "sort"
  3. type orderedStat struct {
  4. guard int
  5. train int
  6. rank int
  7. scaleDb float64
  8. wrapAround bool
  9. }
  10. func newOS(cfg Config) CFAR {
  11. rank := cfg.Rank - 1
  12. total := 2 * cfg.TrainCells
  13. if rank < 0 {
  14. rank = 0
  15. }
  16. if rank >= total {
  17. rank = total - 1
  18. }
  19. return &orderedStat{
  20. guard: cfg.GuardCells,
  21. train: cfg.TrainCells,
  22. rank: rank,
  23. scaleDb: cfg.ScaleDb,
  24. wrapAround: cfg.WrapAround,
  25. }
  26. }
  27. func (o *orderedStat) Thresholds(spectrum []float64) []float64 {
  28. n := len(spectrum)
  29. if n == 0 {
  30. return nil
  31. }
  32. out := make([]float64, n)
  33. train := o.train
  34. guard := o.guard
  35. at := func(i int) float64 {
  36. if o.wrapAround {
  37. return spectrum[((i%n)+n)%n]
  38. }
  39. if i < 0 || i >= n {
  40. return spectrum[clampInt(i, 0, n-1)]
  41. }
  42. return spectrum[i]
  43. }
  44. win := make([]float64, 0, 2*train)
  45. for k := 1; k <= train; k++ {
  46. win = append(win, at(0-guard-k))
  47. win = append(win, at(0+guard+k))
  48. }
  49. sort.Float64s(win)
  50. out[0] = win[o.rank] + o.scaleDb
  51. rebuildWindow := func(bin int) {
  52. win = win[:0]
  53. for k := 1; k <= train; k++ {
  54. win = append(win, at(bin-guard-k))
  55. win = append(win, at(bin+guard+k))
  56. }
  57. sort.Float64s(win)
  58. }
  59. for i := 1; i < n; i++ {
  60. removeFromSorted(&win, at(i-1-guard-train))
  61. removeFromSorted(&win, at(i-1+guard+1))
  62. insertSorted(&win, at(i-guard-1))
  63. insertSorted(&win, at(i+guard+train))
  64. if len(win) != 2*train {
  65. rebuildWindow(i)
  66. }
  67. out[i] = win[o.rank] + o.scaleDb
  68. }
  69. return out
  70. }
  71. func insertSorted(s *[]float64, v float64) {
  72. idx := sort.SearchFloat64s(*s, v)
  73. *s = append(*s, 0)
  74. copy((*s)[idx+1:], (*s)[idx:])
  75. (*s)[idx] = v
  76. }
  77. func removeFromSorted(s *[]float64, v float64) {
  78. idx := sort.SearchFloat64s(*s, v)
  79. if idx < len(*s) && (*s)[idx] == v {
  80. *s = append((*s)[:idx], (*s)[idx+1:]...)
  81. return
  82. }
  83. for i := idx - 1; i >= 0; i-- {
  84. if (*s)[i] == v {
  85. *s = append((*s)[:i], (*s)[i+1:]...)
  86. return
  87. }
  88. if (*s)[i] < v {
  89. break
  90. }
  91. }
  92. for i := idx + 1; i < len(*s); i++ {
  93. if (*s)[i] == v {
  94. *s = append((*s)[:i], (*s)[i+1:]...)
  95. return
  96. }
  97. if (*s)[i] > v {
  98. break
  99. }
  100. }
  101. }