diff --git a/src/decoders/trx-ft8/src/ft8_wrapper.c b/src/decoders/trx-ft8/src/ft8_wrapper.c index b535f56..550d487 100644 --- a/src/decoders/trx-ft8/src/ft8_wrapper.c +++ b/src/decoders/trx-ft8/src/ft8_wrapper.c @@ -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); diff --git a/src/decoders/trx-ft8/src/lib.rs b/src/decoders/trx-ft8/src/lib.rs index bc17ec3..9a2b091 100644 --- a/src/decoders/trx-ft8/src/lib.rs +++ b/src/decoders/trx-ft8/src/lib.rs @@ -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); } } diff --git a/src/trx-server/src/audio.rs b/src/trx-server/src/audio.rs index 6772d2f..e9d69a0 100644 --- a/src/trx-server/src/audio.rs +++ b/src/trx-server/src/audio.rs @@ -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) }