[fix](trx-rds,trx-backend-soapysdr,trx-frontend-http): relax rds filtering

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-02-28 12:26:11 +01:00
parent 778e695941
commit 017b7be8a8
3 changed files with 5 additions and 16 deletions
-12
View File
@@ -14,8 +14,6 @@ const SEARCH_REG_MASK: u32 = (1 << 26) - 1;
const PHASE_CANDIDATES: usize = 8; const PHASE_CANDIDATES: usize = 8;
const BIPHASE_CLOCK_WINDOW: usize = 128; const BIPHASE_CLOCK_WINDOW: usize = 128;
const RDS_BASEBAND_LP_HZ: f32 = 2_400.0; const RDS_BASEBAND_LP_HZ: f32 = 2_400.0;
const MIN_LOCK_QUALITY: f32 = 0.08;
const MIN_BIT_CONFIDENCE: f32 = 0.002;
const PS_VOTE_COMMIT_SCORE: u8 = 3; const PS_VOTE_COMMIT_SCORE: u8 = 3;
const OFFSET_A: u16 = 0x0FC; const OFFSET_A: u16 = 0x0FC;
@@ -83,7 +81,6 @@ struct Candidate {
block_a: u16, block_a: u16,
block_b: u16, block_b: u16,
score: u32, score: u32,
bit_conf_avg: f32,
block_conf_sum: f32, block_conf_sum: f32,
block_conf_count: u8, block_conf_count: u8,
state: RdsData, state: RdsData,
@@ -115,7 +112,6 @@ impl Candidate {
block_a: 0, block_a: 0,
block_b: 0, block_b: 0,
score: 0, score: 0,
bit_conf_avg: 0.0,
block_conf_sum: 0.0, block_conf_sum: 0.0,
block_conf_count: 0, block_conf_count: 0,
state: RdsData::default(), state: RdsData::default(),
@@ -151,7 +147,6 @@ impl Candidate {
self.clock = (self.clock + 1) % BIPHASE_CLOCK_WINDOW; self.clock = (self.clock + 1) % BIPHASE_CLOCK_WINDOW;
let quality = quality.clamp(0.0, 1.0); let quality = quality.clamp(0.0, 1.0);
let bit_confidence = magnitude * quality; let bit_confidence = magnitude * quality;
self.bit_conf_avg = self.bit_conf_avg * 0.995 + bit_confidence * 0.005;
if self.clock == 0 { if self.clock == 0 {
let mut even_sum = 0.0; let mut even_sum = 0.0;
@@ -170,10 +165,6 @@ impl Candidate {
} }
if emit_bit { if emit_bit {
let threshold = (self.bit_conf_avg * 0.35).max(MIN_BIT_CONFIDENCE);
if bit_confidence < threshold {
return None;
}
let input_bit = biphase_i >= 0.0; let input_bit = biphase_i >= 0.0;
let bit = (input_bit != self.prev_input_bit) as u8; let bit = (input_bit != self.prev_input_bit) as u8;
self.prev_input_bit = input_bit; self.prev_input_bit = input_bit;
@@ -413,9 +404,6 @@ impl RdsDecoder {
} }
pub fn process_sample(&mut self, sample: f32, quality: f32) -> Option<&RdsData> { pub fn process_sample(&mut self, sample: f32, quality: f32) -> Option<&RdsData> {
if quality < MIN_LOCK_QUALITY {
return self.best_state.as_ref();
}
let (sin_p, cos_p) = self.carrier_phase.sin_cos(); let (sin_p, cos_p) = self.carrier_phase.sin_cos();
self.carrier_phase = (self.carrier_phase + self.carrier_inc).rem_euclid(TAU); self.carrier_phase = (self.carrier_phase + self.carrier_inc).rem_euclid(TAU);
let mixed_i = self.i_lp.process(sample * cos_p * 2.0); let mixed_i = self.i_lp.process(sample * cos_p * 2.0);
@@ -3210,9 +3210,10 @@ function clearSpectrumCanvas() {
} }
function formatOverlayPs(ps) { function formatOverlayPs(ps) {
const raw = String(ps ?? "").slice(0, 8); return String(ps ?? "")
const leadingBlanks = raw.match(/^ */)?.[0].length ?? 0; .slice(0, 8)
return `${"_".repeat(leadingBlanks)}${raw.slice(leadingBlanks)}`.padEnd(8, "_"); .padEnd(8, "_")
.replaceAll(" ", "_");
} }
function formatOverlayPi(pi) { function formatOverlayPi(pi) {
@@ -121,7 +121,7 @@ impl WfmStereoDecoder {
let pilot_mag = (i * i + q * q).sqrt(); let pilot_mag = (i * i + q * q).sqrt();
let stereo_blend = (pilot_mag * 40.0).clamp(0.0, 1.0); let stereo_blend = (pilot_mag * 40.0).clamp(0.0, 1.0);
let rds_quality = (pilot_mag * 45.0).clamp(0.0, 1.0); let rds_quality = (0.35 + pilot_mag * 20.0).clamp(0.35, 1.0);
let _ = self.rds_decoder.process_sample(x, rds_quality); let _ = self.rds_decoder.process_sample(x, rds_quality);
let sum = self.sum_lp.process(x); let sum = self.sum_lp.process(x);