浏览代码

fix: harden GPU demod state handling

master
Jan Svabenik 2 天前
父节点
当前提交
a8ac228be3
共有 2 个文件被更改,包括 20 次插入8 次删除
  1. +17
    -6
      internal/demod/gpudemod/gpudemod_windows.go
  2. +3
    -2
      internal/recorder/wfm_hybrid.go

+ 17
- 6
internal/demod/gpudemod/gpudemod_windows.go 查看文件

@@ -448,7 +448,12 @@ func (e *Engine) DemodFused(iq []complex64, offsetHz float64, bw float64, mode D
return nil, 0, errors.New("cudaMemcpy H2D failed")
}
phaseInc := -2.0 * math.Pi * offsetHz / float64(e.sampleRate)
if bridgeLaunchFreqShift(e.dIQIn, e.dShifted, n, phaseInc, e.phase) != 0 {
phaseStart := e.phase
phaseEnd := phaseStart + phaseInc*float64(n)
defer func() {
e.phase = phaseEnd
}()
if bridgeLaunchFreqShift(e.dIQIn, e.dShifted, n, phaseInc, phaseStart) != 0 {
return nil, 0, errors.New("gpu freq shift failed")
}
if bridgeLaunchFIR(e.dShifted, e.dFiltered, n, len(taps)) != 0 {
@@ -474,7 +479,6 @@ func (e *Engine) DemodFused(iq []complex64, offsetHz float64, bw float64, mode D
if bridgeMemcpyD2H(unsafe.Pointer(&out[0]), unsafe.Pointer(e.dAudio), outBytes) != 0 {
return nil, 0, errors.New("cudaMemcpy D2H failed")
}
e.phase += phaseInc * float64(n)
e.lastDemodUsedGPU = true
return out, e.sampleRate / decim, nil
case DemodAM:
@@ -489,7 +493,6 @@ func (e *Engine) DemodFused(iq []complex64, offsetHz float64, bw float64, mode D
if bridgeMemcpyD2H(unsafe.Pointer(&out[0]), unsafe.Pointer(e.dAudio), outBytes) != 0 {
return nil, 0, errors.New("cudaMemcpy D2H failed")
}
e.phase += phaseInc * float64(n)
e.lastDemodUsedGPU = true
return out, e.sampleRate / decim, nil
case DemodUSB, DemodLSB, DemodCW:
@@ -509,7 +512,6 @@ func (e *Engine) DemodFused(iq []complex64, offsetHz float64, bw float64, mode D
if bridgeMemcpyD2H(unsafe.Pointer(&out[0]), unsafe.Pointer(e.dAudio), outBytes) != 0 {
return nil, 0, errors.New("cudaMemcpy D2H failed")
}
e.phase += phaseInc * float64(n)
e.bfoPhase += phaseBFO * float64(nOut)
e.lastDemodUsedGPU = true
return out, e.sampleRate / decim, nil
@@ -532,9 +534,18 @@ func (e *Engine) Demod(iq []complex64, offsetHz float64, bw float64, mode DemodT
return nil, 0, errors.New("sample count exceeds engine capacity")
}
shifted, ok := e.tryCUDAFreqShift(iq, offsetHz)
e.lastShiftUsedGPU = ok && ValidateFreqShift(iq, e.sampleRate, offsetHz, shifted, 1e-3)
if !e.lastShiftUsedGPU {
if ok {
if validationEnabled() {
e.lastShiftUsedGPU = ValidateFreqShift(iq, e.sampleRate, offsetHz, shifted, 1e-3)
if !e.lastShiftUsedGPU {
shifted = dsp.FreqShift(iq, e.sampleRate, offsetHz)
}
} else {
e.lastShiftUsedGPU = true
}
} else {
shifted = dsp.FreqShift(iq, e.sampleRate, offsetHz)
e.lastShiftUsedGPU = false
}
var outRate int
switch mode {


+ 3
- 2
internal/recorder/wfm_hybrid.go 查看文件

@@ -12,11 +12,12 @@ type wfmHybridResult struct {

func demodWFMStereoHybrid(iq []complex64, sampleRate int, offset float64, bw float64) wfmHybridResult {
audio, rate := demodAudioCPU(demod.Get("WFM_STEREO"), iq, sampleRate, offset, bw)
rds := demod.RDSBaseband(iq, sampleRate)
return wfmHybridResult{
Audio: audio,
AudioRate: rate,
Channels: 2,
RDS: demod.RDSBaseband(iq, sampleRate),
RDSRate: 2400,
RDS: rds,
RDSRate: sampleRate,
}
}

正在加载...
取消
保存