25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
1.9KB

  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. }
  15. func NewBatchRunner(maxSamples int, sampleRate int) (*BatchRunner, error) {
  16. eng, err := New(maxSamples, sampleRate)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return &BatchRunner{eng: eng}, nil
  21. }
  22. func (r *BatchRunner) Close() {
  23. if r == nil || r.eng == nil {
  24. return
  25. }
  26. r.freeSlotBuffers()
  27. r.eng.Close()
  28. r.eng = nil
  29. r.slots = nil
  30. }
  31. func (r *BatchRunner) prepare(jobs []ExtractJob) {
  32. if cap(r.slots) < len(jobs) {
  33. r.slots = make([]batchSlot, len(jobs))
  34. } else {
  35. r.slots = r.slots[:len(jobs)]
  36. }
  37. for i, job := range jobs {
  38. r.slots[i] = batchSlot{job: job, active: true}
  39. }
  40. }
  41. func (r *BatchRunner) ShiftFilterDecimateBatch(iq []complex64, jobs []ExtractJob) ([][]complex64, []int, error) {
  42. if r == nil || r.eng == nil {
  43. return nil, nil, ErrUnavailable
  44. }
  45. r.prepare(jobs)
  46. return r.shiftFilterDecimateBatchImpl(iq)
  47. }
  48. // ShiftFilterDecimateBatchWithPhase uses per-job PhaseStart and returns
  49. // per-job PhaseEnd for phase-continuous streaming.
  50. func (r *BatchRunner) ShiftFilterDecimateBatchWithPhase(iq []complex64, jobs []ExtractJob) ([]ExtractResult, error) {
  51. if r == nil || r.eng == nil {
  52. return nil, ErrUnavailable
  53. }
  54. r.prepare(jobs)
  55. outs, rates, err := r.shiftFilterDecimateBatchImpl(iq)
  56. if err != nil {
  57. return nil, err
  58. }
  59. results := make([]ExtractResult, len(jobs))
  60. for i, job := range jobs {
  61. phaseInc := -2.0 * math.Pi * job.OffsetHz / float64(r.eng.sampleRate)
  62. var iq_out []complex64
  63. var rate int
  64. if i < len(outs) {
  65. iq_out = outs[i]
  66. }
  67. if i < len(rates) {
  68. rate = rates[i]
  69. }
  70. results[i] = ExtractResult{
  71. IQ: iq_out,
  72. Rate: rate,
  73. PhaseEnd: job.PhaseStart + phaseInc*float64(len(iq)),
  74. }
  75. }
  76. return results, nil
  77. }