Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

74 рядки
1.6KB

  1. package classifier
  2. import (
  3. "math"
  4. )
  5. // ExtractTemporalFeatures computes simple time-domain features from IQ.
  6. func ExtractTemporalFeatures(iq []complex64) (envVar float64, zeroCross float64, instFreqStd float64, crest float64) {
  7. if len(iq) == 0 {
  8. return 0, 0, 0, 0
  9. }
  10. env := make([]float64, len(iq))
  11. var mean, rms float64
  12. for i, v := range iq {
  13. a := math.Hypot(float64(real(v)), float64(imag(v)))
  14. env[i] = a
  15. mean += a
  16. rms += a * a
  17. }
  18. mean /= float64(len(iq))
  19. rms = math.Sqrt(rms / float64(len(iq)))
  20. // normalized env variance (coefficient of variation squared)
  21. var sumVar float64
  22. for _, v := range env {
  23. d := v - mean
  24. sumVar += d * d
  25. }
  26. if mean > 1e-12 {
  27. envVar = (sumVar / float64(len(iq))) / (mean * mean)
  28. } else {
  29. envVar = 0
  30. }
  31. if rms > 0 {
  32. crest = maxFloat(env) / rms
  33. }
  34. // zero-crossing on real part
  35. zc := 0
  36. for i := 1; i < len(iq); i++ {
  37. p := real(iq[i-1])
  38. c := real(iq[i])
  39. if (p >= 0 && c < 0) || (p < 0 && c >= 0) {
  40. zc++
  41. }
  42. }
  43. zeroCross = float64(zc) / float64(len(iq))
  44. // instantaneous frequency std
  45. if len(iq) > 1 {
  46. var sum, sumSq float64
  47. for i := 1; i < len(iq); i++ {
  48. p := iq[i-1]
  49. c := iq[i]
  50. num := float64(real(p))*float64(imag(c)) - float64(imag(p))*float64(real(c))
  51. den := float64(real(p))*float64(real(c)) + float64(imag(p))*float64(imag(c))
  52. v := math.Atan2(num, den)
  53. sum += v
  54. sumSq += v * v
  55. }
  56. n := float64(len(iq) - 1)
  57. mean := sum / n
  58. instFreqStd = math.Sqrt(sumSq/n - mean*mean)
  59. }
  60. return
  61. }
  62. func maxFloat(vals []float64) float64 {
  63. m := vals[0]
  64. for _, v := range vals {
  65. if v > m {
  66. m = v
  67. }
  68. }
  69. return m
  70. }