Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

73 řádky
1.3KB

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