Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

50 строки
1.5KB

  1. package gpudemod
  2. // StreamingExtractGPUHostOracle is a temporary host-side execution of the intended
  3. // streaming semantics using GPU-owned stream state. It is not the final GPU
  4. // production implementation, but it allows the new production entrypoint to move
  5. // from pure stub semantics toward real NEW-samples-only streaming behavior
  6. // without reintroducing overlap+trim.
  7. func (r *BatchRunner) StreamingExtractGPUHostOracle(iqNew []complex64, jobs []StreamingExtractJob) ([]StreamingExtractResult, error) {
  8. if r == nil || r.eng == nil {
  9. return nil, ErrUnavailable
  10. }
  11. results := make([]StreamingExtractResult, len(jobs))
  12. active := make(map[int64]struct{}, len(jobs))
  13. for i, job := range jobs {
  14. active[job.SignalID] = struct{}{}
  15. state, err := r.getOrInitExtractState(job, r.eng.sampleRate)
  16. if err != nil {
  17. return nil, err
  18. }
  19. out, phase, phaseCount, hist := runStreamingPolyphaseHostCore(
  20. iqNew,
  21. r.eng.sampleRate,
  22. job.OffsetHz,
  23. state.NCOPhase,
  24. state.PhaseCount,
  25. state.NumTaps,
  26. state.Decim,
  27. state.ShiftedHistory,
  28. state.PolyphaseTaps,
  29. )
  30. state.NCOPhase = phase
  31. state.PhaseCount = phaseCount
  32. state.ShiftedHistory = append(state.ShiftedHistory[:0], hist...)
  33. results[i] = StreamingExtractResult{
  34. SignalID: job.SignalID,
  35. IQ: out,
  36. Rate: job.OutRate,
  37. NOut: len(out),
  38. PhaseCount: state.PhaseCount,
  39. HistoryLen: len(state.ShiftedHistory),
  40. }
  41. }
  42. for signalID := range r.streamState {
  43. if _, ok := active[signalID]; !ok {
  44. delete(r.streamState, signalID)
  45. }
  46. }
  47. return results, nil
  48. }