Переглянути джерело

Add shared hybrid helper for WFM stereo and RDS

master
Jan Svabenik 2 дні тому
джерело
коміт
18583fe7bc
2 змінених файлів з 33 додано та 6 видалено
  1. +11
    -6
      internal/recorder/demod.go
  2. +22
    -0
      internal/recorder/wfm_hybrid.go

+ 11
- 6
internal/recorder/demod.go Переглянути файл

@@ -36,13 +36,18 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f
}
}
}
var stereoHybrid *wfmHybridResult
if audio == nil {
if name == "WFM_STEREO" {
log.Printf("gpudemod: WFM_STEREO using CPU stereo/RDS post-process for event %d", ev.ID)
res := demodWFMStereoHybrid(iq, m.sampleRate, offset, bw)
stereoHybrid = &res
audio = res.Audio
inputRate = res.AudioRate
} else {
log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name)
audio, inputRate = demodAudioCPU(d, iq, m.sampleRate, offset, bw)
}
audio, inputRate = demodAudioCPU(d, iq, m.sampleRate, offset, bw)
}
wav := filepath.Join(dir, "audio.wav")
if err := writeWAV(wav, audio, inputRate, d.Channels()); err != nil {
@@ -52,14 +57,14 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f
files["audio_sample_rate"] = inputRate
files["audio_channels"] = d.Channels()
files["audio_demod"] = name
if name == "WFM_STEREO" {
if rds := demod.RDSBaseband(iq, m.sampleRate); len(rds) > 0 {
if name == "WFM_STEREO" && stereoHybrid != nil {
if len(stereoHybrid.RDS) > 0 {
rdsPath := filepath.Join(dir, "rds.wav")
_ = writeWAV(rdsPath, rds, 2400, 1)
_ = writeWAV(rdsPath, stereoHybrid.RDS, stereoHybrid.RDSRate, 1)
files["rds_baseband"] = "rds.wav"
files["rds_sample_rate"] = 2400
files["rds_sample_rate"] = stereoHybrid.RDSRate
dec := rdsdecoder{}
res := dec.Decode(rds, 2400)
res := dec.Decode(stereoHybrid.RDS, stereoHybrid.RDSRate)
if res.PI != 0 {
files["rds_pi"] = res.PI
}


+ 22
- 0
internal/recorder/wfm_hybrid.go Переглянути файл

@@ -0,0 +1,22 @@
package recorder

import "sdr-visual-suite/internal/demod"

type wfmHybridResult struct {
Audio []float32
AudioRate int
Channels int
RDS []float32
RDSRate int
}

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

Завантаження…
Відмінити
Зберегти