Wideband autonomous SDR analysis engine forked from sdr-visual-suite
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.

88 líneas
2.0KB

  1. package gpudemod
  2. import "math"
  3. type batchSlot struct {
  4. job ExtractJob
  5. out []complex64
  6. rate int
  7. active bool
  8. }
  9. type BatchRunner struct {
  10. eng *Engine
  11. slots []batchSlot
  12. slotBufs []slotBuffers
  13. slotBufSize int // number of IQ samples the slot buffers were allocated for
  14. streamState map[int64]*ExtractStreamState
  15. }
  16. func NewBatchRunner(maxSamples int, sampleRate int) (*BatchRunner, error) {
  17. eng, err := New(maxSamples, sampleRate)
  18. if err != nil {
  19. return nil, err
  20. }
  21. return &BatchRunner{eng: eng, streamState: make(map[int64]*ExtractStreamState)}, nil
  22. }
  23. func (r *BatchRunner) Close() {
  24. if r == nil || r.eng == nil {
  25. return
  26. }
  27. r.freeSlotBuffers()
  28. r.eng.Close()
  29. r.eng = nil
  30. r.slots = nil
  31. r.streamState = nil
  32. }
  33. func (r *BatchRunner) prepare(jobs []ExtractJob) {
  34. if cap(r.slots) < len(jobs) {
  35. r.slots = make([]batchSlot, len(jobs))
  36. } else {
  37. r.slots = r.slots[:len(jobs)]
  38. }
  39. for i, job := range jobs {
  40. r.slots[i] = batchSlot{job: job, active: true}
  41. }
  42. }
  43. func (r *BatchRunner) ShiftFilterDecimateBatch(iq []complex64, jobs []ExtractJob) ([][]complex64, []int, error) {
  44. if r == nil || r.eng == nil {
  45. return nil, nil, ErrUnavailable
  46. }
  47. r.prepare(jobs)
  48. return r.shiftFilterDecimateBatchImpl(iq)
  49. }
  50. // ShiftFilterDecimateBatchWithPhase uses per-job PhaseStart and returns
  51. // per-job PhaseEnd for phase-continuous streaming.
  52. func (r *BatchRunner) ShiftFilterDecimateBatchWithPhase(iq []complex64, jobs []ExtractJob) ([]ExtractResult, error) {
  53. if r == nil || r.eng == nil {
  54. return nil, ErrUnavailable
  55. }
  56. r.prepare(jobs)
  57. outs, rates, err := r.shiftFilterDecimateBatchImpl(iq)
  58. if err != nil {
  59. return nil, err
  60. }
  61. results := make([]ExtractResult, len(jobs))
  62. for i, job := range jobs {
  63. phaseInc := -2.0 * math.Pi * job.OffsetHz / float64(r.eng.sampleRate)
  64. var iq_out []complex64
  65. var rate int
  66. if i < len(outs) {
  67. iq_out = outs[i]
  68. }
  69. if i < len(rates) {
  70. rate = rates[i]
  71. }
  72. results[i] = ExtractResult{
  73. IQ: iq_out,
  74. Rate: rate,
  75. PhaseEnd: job.PhaseStart + phaseInc*float64(len(iq)),
  76. }
  77. }
  78. return results, nil
  79. }