[fix](trx-rs): align FT2 async window geometry
This commit is contained in:
@@ -155,6 +155,7 @@ static float decoder_candidate_dt_s(const ft8_decoder_t* dec, const ftx_candidat
|
|||||||
#define FT2_NFFT1 1152
|
#define FT2_NFFT1 1152
|
||||||
#define FT2_NH1 (FT2_NFFT1 / 2)
|
#define FT2_NH1 (FT2_NFFT1 / 2)
|
||||||
#define FT2_NSTEP 288
|
#define FT2_NSTEP 288
|
||||||
|
#define FT2_NMAX 45000
|
||||||
#define FT2_MAX_RAW_CANDIDATES 96
|
#define FT2_MAX_RAW_CANDIDATES 96
|
||||||
#define FT2_MAX_SCAN_HITS 128
|
#define FT2_MAX_SCAN_HITS 128
|
||||||
#define FT2_SYNC_TWEAK_MIN (-16)
|
#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);
|
kiss_fft(fft_cfg, csymb, csymb);
|
||||||
for (int tone = 0; tone < 4; ++tone)
|
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;
|
symbols[tone][sym] = bin;
|
||||||
s4[tone][sym] = cabsf(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);
|
monitor_init(&dec->mon, &dec->cfg);
|
||||||
if (dec->cfg.protocol == FTX_PROTOCOL_FT2)
|
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 = (float*)calloc(dec->ft2_raw_capacity, sizeof(float));
|
||||||
dec->ft2_raw_len = 0;
|
dec->ft2_raw_len = 0;
|
||||||
if (!dec->ft2_raw)
|
if (!dec->ft2_raw)
|
||||||
@@ -1011,6 +1012,8 @@ int ft8_decoder_window_samples(const ft8_decoder_t* dec)
|
|||||||
{
|
{
|
||||||
if (!dec)
|
if (!dec)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (dec->cfg.protocol == FTX_PROTOCOL_FT2)
|
||||||
|
return FT2_NMAX;
|
||||||
return dec->mon.block_size * dec->mon.wf.max_blocks;
|
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;
|
return;
|
||||||
if (dec->cfg.protocol == FTX_PROTOCOL_FT2 && dec->ft2_raw && dec->ft2_raw_capacity > 0)
|
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);
|
int copy_len = (remaining < dec->mon.block_size) ? remaining : dec->mon.block_size;
|
||||||
dec->ft2_raw_len += 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);
|
monitor_process(&dec->mon, frame);
|
||||||
|
|||||||
@@ -203,6 +203,6 @@ mod tests {
|
|||||||
assert!(ft2.block_size() < ft4.block_size());
|
assert!(ft2.block_size() < ft4.block_size());
|
||||||
assert_eq!(ft4.block_size(), 576);
|
assert_eq!(ft4.block_size(), 576);
|
||||||
assert_eq!(ft2.block_size(), 288);
|
assert_eq!(ft2.block_size(), 288);
|
||||||
assert_eq!(ft2.window_samples(), 44_928);
|
assert_eq!(ft2.window_samples(), 45_000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,12 @@ fn decode_ft2_window(
|
|||||||
for block in window.chunks_exact(block_size) {
|
for block in window.chunks_exact(block_size) {
|
||||||
decoder.process_block(block);
|
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)
|
decoder.decode_if_ready(max_results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user