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.

65 lignes
1.2KB

  1. package cfar
  2. type caso struct {
  3. guard int
  4. train int
  5. scaleDb float64
  6. wrapAround bool
  7. }
  8. func newCASO(cfg Config) CFAR {
  9. return &caso{guard: cfg.GuardCells, train: cfg.TrainCells, scaleDb: cfg.ScaleDb, wrapAround: cfg.WrapAround}
  10. }
  11. func (c *caso) Thresholds(spectrum []float64) []float64 {
  12. n := len(spectrum)
  13. if n == 0 {
  14. return nil
  15. }
  16. out := make([]float64, n)
  17. train := c.train
  18. guard := c.guard
  19. if train == 0 {
  20. return out
  21. }
  22. inv := 1.0 / float64(train)
  23. at := func(i int) float64 {
  24. if c.wrapAround {
  25. return spectrum[((i%n)+n)%n]
  26. }
  27. if i < 0 || i >= n {
  28. return spectrum[clampInt(i, 0, n-1)]
  29. }
  30. return spectrum[i]
  31. }
  32. var leftSum, rightSum float64
  33. for k := 1; k <= train; k++ {
  34. leftSum += at(0 - guard - k)
  35. rightSum += at(0 + guard + k)
  36. }
  37. lm := leftSum * inv
  38. rm := rightSum * inv
  39. noise := lm
  40. if rm < noise {
  41. noise = rm
  42. }
  43. out[0] = noise + c.scaleDb
  44. for i := 1; i < n; i++ {
  45. leftSum -= at(i - 1 - guard - train)
  46. leftSum += at(i - guard - 1)
  47. rightSum -= at(i - 1 + guard + 1)
  48. rightSum += at(i + guard + train)
  49. lm = leftSum * inv
  50. rm = rightSum * inv
  51. noise = lm
  52. if rm < noise {
  53. noise = rm
  54. }
  55. out[i] = noise + c.scaleDb
  56. }
  57. return out
  58. }