No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

71 líneas
1.4KB

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