From 361bdc9048daae95846b25c3711b23a78c9441dc Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 19 Mar 2026 08:14:28 +0100 Subject: [PATCH] feat: add GPU FM discriminator path --- internal/demod/gpudemod/build/kernels.obj | Bin 56212 -> 56212 bytes internal/demod/gpudemod/gpudemod.go | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/internal/demod/gpudemod/build/kernels.obj b/internal/demod/gpudemod/build/kernels.obj index 906955faeffb170b1b472c524c43cfdd87167a17..674dd98006d8cb89d8a6089b28a4379f705cd201 100644 GIT binary patch delta 17 ZcmbQToq5W3X10{J>kQ_LHnR2I1^_?e2VDRF delta 17 ZcmbQToq5W3X10{J>kRi7Ze;7b4FE&U2m}BC diff --git a/internal/demod/gpudemod/gpudemod.go b/internal/demod/gpudemod/gpudemod.go index 0b40d4e..3db851e 100644 --- a/internal/demod/gpudemod/gpudemod.go +++ b/internal/demod/gpudemod/gpudemod.go @@ -168,6 +168,28 @@ func (e *Engine) tryCUDAFreqShift(iq []complex64, offsetHz float64) ([]complex64 return out, true } +func (e *Engine) tryCUDAFMDiscrim(shifted []complex64) ([]float32, bool) { + if e == nil || !e.cudaReady || len(shifted) < 2 || e.dShifted == nil || e.dAudio == nil { + return nil, false + } + iqBytes := C.size_t(len(shifted)) * C.size_t(unsafe.Sizeof(complex64(0))) + if C.gpud_memcpy_h2d(unsafe.Pointer(e.dShifted), unsafe.Pointer(&shifted[0]), iqBytes) != C.cudaSuccess { + return nil, false + } + if C.gpud_launch_fm_discrim(e.dShifted, e.dAudio, C.int(len(shifted))) != 0 { + return nil, false + } + if C.gpud_device_sync() != C.cudaSuccess { + return nil, false + } + out := make([]float32, len(shifted)-1) + outBytes := C.size_t(len(out)) * C.size_t(unsafe.Sizeof(float32(0))) + if C.gpud_memcpy_d2h(unsafe.Pointer(&out[0]), unsafe.Pointer(e.dAudio), outBytes) != C.cudaSuccess { + return nil, false + } + return out, true +} + func (e *Engine) Demod(iq []complex64, offsetHz float64, bw float64, mode DemodType) ([]float32, int, error) { if e == nil { return nil, 0, errors.New("nil CUDA demod engine")