Преглед изворни кода

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 audio == nil {
if name == "WFM_STEREO" { if name == "WFM_STEREO" {
log.Printf("gpudemod: WFM_STEREO using CPU stereo/RDS post-process for event %d", ev.ID) 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 { } else {
log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name) 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") wav := filepath.Join(dir, "audio.wav")
if err := writeWAV(wav, audio, inputRate, d.Channels()); err != nil { 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_sample_rate"] = inputRate
files["audio_channels"] = d.Channels() files["audio_channels"] = d.Channels()
files["audio_demod"] = name 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") 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_baseband"] = "rds.wav"
files["rds_sample_rate"] = 2400
files["rds_sample_rate"] = stereoHybrid.RDSRate
dec := rdsdecoder{} dec := rdsdecoder{}
res := dec.Decode(rds, 2400)
res := dec.Decode(stereoHybrid.RDS, stereoHybrid.RDSRate)
if res.PI != 0 { if res.PI != 0 {
files["rds_pi"] = res.PI 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,
}
}

Loading…
Откажи
Сачувај