[fix](trx-rs): align FT2 async window geometry

This commit is contained in:
2026-03-14 20:44:25 +01:00
parent 2ab05f5001
commit d3abce9ab0
3 changed files with 17 additions and 6 deletions
+10 -5
View File
@@ -155,6 +155,7 @@ static float decoder_candidate_dt_s(const ft8_decoder_t* dec, const ftx_candidat
#define FT2_NFFT1 1152
#define FT2_NH1 (FT2_NFFT1 / 2)
#define FT2_NSTEP 288
#define FT2_NMAX 45000
#define FT2_MAX_RAW_CANDIDATES 96
#define FT2_MAX_SCAN_HITS 128
#define FT2_SYNC_TWEAK_MIN (-16)
@@ -663,7 +664,7 @@ static bool ft2_extract_bitmetrics_raw(const float complex* signal, float bitmet
kiss_fft(fft_cfg, csymb, csymb);
for (int tone = 0; tone < 4; ++tone)
{
float complex bin = csymb[tone].r + I * csymb[tone].i;
float complex bin = csymb[tone + 1].r + I * csymb[tone + 1].i;
symbols[tone][sym] = bin;
s4[tone][sym] = cabsf(bin);
}
@@ -980,7 +981,7 @@ ft8_decoder_t* ft8_decoder_create(int sample_rate, float f_min, float f_max, int
monitor_init(&dec->mon, &dec->cfg);
if (dec->cfg.protocol == FTX_PROTOCOL_FT2)
{
dec->ft2_raw_capacity = dec->mon.block_size * dec->mon.wf.max_blocks;
dec->ft2_raw_capacity = FT2_NMAX;
dec->ft2_raw = (float*)calloc(dec->ft2_raw_capacity, sizeof(float));
dec->ft2_raw_len = 0;
if (!dec->ft2_raw)
@@ -1011,6 +1012,8 @@ int ft8_decoder_window_samples(const ft8_decoder_t* dec)
{
if (!dec)
return 0;
if (dec->cfg.protocol == FTX_PROTOCOL_FT2)
return FT2_NMAX;
return dec->mon.block_size * dec->mon.wf.max_blocks;
}
@@ -1032,10 +1035,12 @@ void ft8_decoder_process(ft8_decoder_t* dec, const float* frame)
return;
if (dec->cfg.protocol == FTX_PROTOCOL_FT2 && dec->ft2_raw && dec->ft2_raw_capacity > 0)
{
if (dec->ft2_raw_len + dec->mon.block_size <= dec->ft2_raw_capacity)
int remaining = dec->ft2_raw_capacity - dec->ft2_raw_len;
if (remaining > 0)
{
memcpy(dec->ft2_raw + dec->ft2_raw_len, frame, sizeof(float) * dec->mon.block_size);
dec->ft2_raw_len += dec->mon.block_size;
int copy_len = (remaining < dec->mon.block_size) ? remaining : dec->mon.block_size;
memcpy(dec->ft2_raw + dec->ft2_raw_len, frame, sizeof(float) * copy_len);
dec->ft2_raw_len += copy_len;
}
}
monitor_process(&dec->mon, frame);
+1 -1
View File
@@ -203,6 +203,6 @@ mod tests {
assert!(ft2.block_size() < ft4.block_size());
assert_eq!(ft4.block_size(), 576);
assert_eq!(ft2.block_size(), 288);
assert_eq!(ft2.window_samples(), 44_928);
assert_eq!(ft2.window_samples(), 45_000);
}
}
+6
View File
@@ -107,6 +107,12 @@ fn decode_ft2_window(
for block in window.chunks_exact(block_size) {
decoder.process_block(block);
}
let remainder = window.chunks_exact(block_size).remainder();
if !remainder.is_empty() {
let mut tail = vec![0.0f32; block_size];
tail[..remainder.len()].copy_from_slice(remainder);
decoder.process_block(&tail);
}
decoder.decode_if_ready(max_results)
}