Wideband autonomous SDR analysis engine forked from sdr-visual-suite
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

50 行
1.2KB

  1. package recorder
  2. import (
  3. "log"
  4. "sdr-wideband-suite/internal/demod"
  5. "sdr-wideband-suite/internal/demod/gpudemod"
  6. )
  7. type wfmHybridResult struct {
  8. Audio []float32
  9. AudioRate int
  10. Channels int
  11. RDS []float32
  12. RDSRate int
  13. }
  14. func demodWFMStereoHybrid(gpu *gpudemod.Engine, iq []complex64, sampleRate int, offset float64, bw float64) wfmHybridResult {
  15. audio, rate := demodAudioCPU(demod.Get("WFM_STEREO"), iq, sampleRate, offset, bw)
  16. var rdsSamples []float32
  17. var rdsRate int
  18. if gpu != nil {
  19. rdsIQ, gpuRate, err := gpu.ShiftFilterDecimate(iq, 57000, 4800, 4800)
  20. if err == nil && len(rdsIQ) > 0 {
  21. rdsSamples = make([]float32, len(rdsIQ))
  22. for i, v := range rdsIQ {
  23. rdsSamples[i] = real(v)
  24. }
  25. rdsRate = gpuRate
  26. log.Printf("gpudemod: GPU RDS extraction used (%d samples at %d Hz)", len(rdsSamples), rdsRate)
  27. } else if err != nil {
  28. log.Printf("gpudemod: GPU RDS extraction failed: %v - CPU fallback", err)
  29. }
  30. }
  31. if rdsSamples == nil {
  32. rds := demod.RDSBasebandDecimated(iq, sampleRate)
  33. rdsSamples = rds.Samples
  34. rdsRate = rds.SampleRate
  35. }
  36. return wfmHybridResult{
  37. Audio: audio,
  38. AudioRate: rate,
  39. Channels: 2,
  40. RDS: rdsSamples,
  41. RDSRate: rdsRate,
  42. }
  43. }