Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

79 linhas
1.8KB

  1. package gpudemod
  2. import (
  3. "math"
  4. )
  5. type OracleHarnessConfig struct {
  6. SignalID int64
  7. ConfigHash uint64
  8. NCOPhase float64
  9. Decim int
  10. NumTaps int
  11. PhaseInc float64
  12. }
  13. func MakeDeterministicIQ(n int) []complex64 {
  14. out := make([]complex64, n)
  15. for i := 0; i < n; i++ {
  16. a := 0.017 * float64(i)
  17. b := 0.031 * float64(i)
  18. out[i] = complex64(complex(math.Cos(a)+0.2*math.Cos(b), math.Sin(a)+0.15*math.Sin(b)))
  19. }
  20. return out
  21. }
  22. func MakeToneIQ(n int, phaseInc float64) []complex64 {
  23. out := make([]complex64, n)
  24. phase := 0.0
  25. for i := 0; i < n; i++ {
  26. out[i] = complex64(complex(math.Cos(phase), math.Sin(phase)))
  27. phase += phaseInc
  28. }
  29. return out
  30. }
  31. func MakeLowpassTaps(n int) []float32 {
  32. out := make([]float32, n)
  33. for i := range out {
  34. out[i] = 1.0 / float32(n)
  35. }
  36. return out
  37. }
  38. func MakeCPUOracleState(cfg OracleHarnessConfig) *CPUOracleState {
  39. taps := MakeLowpassTaps(cfg.NumTaps)
  40. return &CPUOracleState{
  41. SignalID: cfg.SignalID,
  42. ConfigHash: cfg.ConfigHash,
  43. NCOPhase: cfg.NCOPhase,
  44. Decim: cfg.Decim,
  45. PhaseCount: 0,
  46. NumTaps: cfg.NumTaps,
  47. ShiftedHistory: make([]complex64, 0, maxInt(0, cfg.NumTaps-1)),
  48. BaseTaps: taps,
  49. PolyphaseTaps: BuildPolyphaseTapsPhaseMajor(taps, cfg.Decim),
  50. }
  51. }
  52. func RunChunkedCPUOraclePolyphase(all []complex64, chunkSizes []int, mkState func() *CPUOracleState, phaseInc float64) []complex64 {
  53. state := mkState()
  54. out := make([]complex64, 0)
  55. pos := 0
  56. for _, n := range chunkSizes {
  57. if pos >= len(all) {
  58. break
  59. }
  60. end := pos + n
  61. if end > len(all) {
  62. end = len(all)
  63. }
  64. out = append(out, CPUOracleExtractPolyphase(all[pos:end], state, phaseInc)...)
  65. pos = end
  66. }
  67. if pos < len(all) {
  68. out = append(out, CPUOracleExtractPolyphase(all[pos:], state, phaseInc)...)
  69. }
  70. return out
  71. }