Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

73 строки
1.3KB

  1. package cfar
  2. // gosca implements Greatest-Of Selection with Cell Averaging.
  3. type gosca struct {
  4. guard int
  5. train int
  6. scaleDb float64
  7. wrapAround bool
  8. }
  9. func newGOSCA(cfg Config) CFAR {
  10. return &gosca{
  11. guard: cfg.GuardCells,
  12. train: cfg.TrainCells,
  13. scaleDb: cfg.ScaleDb,
  14. wrapAround: cfg.WrapAround,
  15. }
  16. }
  17. func (g *gosca) Thresholds(spectrum []float64) []float64 {
  18. n := len(spectrum)
  19. if n == 0 {
  20. return nil
  21. }
  22. out := make([]float64, n)
  23. train := g.train
  24. guard := g.guard
  25. if train == 0 {
  26. return out
  27. }
  28. inv := 1.0 / float64(train)
  29. at := func(i int) float64 {
  30. if g.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. leftMean := leftSum * inv
  44. rightMean := rightSum * inv
  45. noise := leftMean
  46. if rightMean > noise {
  47. noise = rightMean
  48. }
  49. out[0] = noise + g.scaleDb
  50. for i := 1; i < n; i++ {
  51. leftSum -= at(i - 1 - guard - train)
  52. leftSum += at(i - guard - 1)
  53. rightSum -= at(i - 1 + guard + 1)
  54. rightSum += at(i + guard + train)
  55. leftMean = leftSum * inv
  56. rightMean = rightSum * inv
  57. noise = leftMean
  58. if rightMean > noise {
  59. noise = rightMean
  60. }
  61. out[i] = noise + g.scaleDb
  62. }
  63. return out
  64. }