Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

79 rindas
1.5KB

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