Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

79 Zeilen
1.4KB

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