Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

51 řádky
1.4KB

  1. package main
  2. import (
  3. "fmt"
  4. "sdr-wideband-suite/internal/demod/gpudemod"
  5. "sdr-wideband-suite/internal/detector"
  6. "sdr-wideband-suite/internal/telemetry"
  7. )
  8. func extractForStreamingProduction(
  9. extractMgr *extractionManager,
  10. allIQ []complex64,
  11. sampleRate int,
  12. centerHz float64,
  13. signals []detector.Signal,
  14. aqCfg extractionConfig,
  15. coll *telemetry.Collector,
  16. ) ([][]complex64, []int, error) {
  17. out := make([][]complex64, len(signals))
  18. rates := make([]int, len(signals))
  19. jobs, err := buildStreamingJobs(sampleRate, centerHz, signals, aqCfg)
  20. if err != nil {
  21. return nil, nil, err
  22. }
  23. runner := extractMgr.get(len(allIQ), sampleRate)
  24. if runner == nil {
  25. return nil, nil, fmt.Errorf("streaming production path unavailable: no batch runner")
  26. }
  27. results, err := runner.StreamingExtractGPU(allIQ, jobs)
  28. if err != nil {
  29. return nil, nil, err
  30. }
  31. var oracleResults []gpudemod.StreamingExtractResult
  32. if useStreamingOraclePath {
  33. if streamingOracleRunner == nil || streamingOracleRunner.SampleRate != sampleRate {
  34. streamingOracleRunner = gpudemod.NewCPUOracleRunner(sampleRate)
  35. }
  36. oracleResults, _ = streamingOracleRunner.StreamingExtract(allIQ, jobs)
  37. }
  38. for i, res := range results {
  39. out[i] = res.IQ
  40. rates[i] = res.Rate
  41. observeStreamingResult(coll, "streaming.production", res)
  42. if i < len(oracleResults) {
  43. observeStreamingComparison(coll, oracleResults[i], res)
  44. }
  45. }
  46. return out, rates, nil
  47. }