Wideband autonomous SDR analysis engine forked from sdr-visual-suite
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

65 satır
1.3KB

  1. package gpudemod
  2. type batchSlot struct {
  3. job ExtractJob
  4. out []complex64
  5. rate int
  6. active bool
  7. }
  8. type BatchRunner struct {
  9. eng *Engine
  10. slots []batchSlot
  11. }
  12. func NewBatchRunner(maxSamples int, sampleRate int) (*BatchRunner, error) {
  13. eng, err := New(maxSamples, sampleRate)
  14. if err != nil {
  15. return nil, err
  16. }
  17. return &BatchRunner{eng: eng}, nil
  18. }
  19. func (r *BatchRunner) Close() {
  20. if r == nil || r.eng == nil {
  21. return
  22. }
  23. r.eng.Close()
  24. r.eng = nil
  25. r.slots = nil
  26. }
  27. func (r *BatchRunner) prepare(jobs []ExtractJob) {
  28. if cap(r.slots) < len(jobs) {
  29. r.slots = make([]batchSlot, len(jobs))
  30. } else {
  31. r.slots = r.slots[:len(jobs)]
  32. }
  33. for i, job := range jobs {
  34. r.slots[i] = batchSlot{job: job, active: true}
  35. }
  36. }
  37. func (r *BatchRunner) ShiftFilterDecimateBatch(iq []complex64, jobs []ExtractJob) ([][]complex64, []int, error) {
  38. if r == nil || r.eng == nil {
  39. return nil, nil, ErrUnavailable
  40. }
  41. r.prepare(jobs)
  42. outs := make([][]complex64, len(jobs))
  43. rates := make([]int, len(jobs))
  44. for i := range r.slots {
  45. if !r.slots[i].active {
  46. continue
  47. }
  48. out, rate, err := r.eng.ShiftFilterDecimate(iq, r.slots[i].job.OffsetHz, r.slots[i].job.BW, r.slots[i].job.OutRate)
  49. if err != nil {
  50. return nil, nil, err
  51. }
  52. r.slots[i].out = out
  53. r.slots[i].rate = rate
  54. outs[i] = out
  55. rates[i] = rate
  56. }
  57. return outs, rates, nil
  58. }