use crate::sync::{ft8_sync, ft4_sync};
use crate::codec::ft8::Ft8Codec;
use crate::codec::ft4::Ft4Codec;
use super::{make_ft8_test_buffer, make_ft4_test_buffer};
const FS: f32 = 12_000.0;
const REF_BW_HZ: f32 = 2_500.0;
const SIG_POWER: f32 = 0.5;
pub fn snr_to_noise_power(snr_db: f32) -> f32 {
SIG_POWER * FS / (REF_BW_HZ * 10.0_f32.powf(snr_db / 10.0))
}
#[test]
fn ft8_decodes_at_minus_15db_snr_2500hz() {
let base_hz = 1_000.0_f32;
let noise_power = snr_to_noise_power(-15.0);
let (buf, payload) = make_ft8_test_buffer(0, base_hz, noise_power);
let results = ft8_sync(
&buf, FS,
base_hz - 6.25, base_hz + 50.0 + 6.25,
0, 0, 5,
);
assert!(
!results.is_empty(),
"FT8 sync returned no candidates at -15 dB SNR/2500 Hz \
(noise_power={:.5})",
noise_power
);
let decoded = Ft8Codec::decode_soft(&results[0].llr);
assert!(
decoded == Some(payload),
"FT8 decode_soft failed at -15 dB SNR/2500 Hz \
(noise_power={:.5}, got={:?})",
noise_power, decoded
);
}
#[test]
fn ft4_decodes_at_minus_11db_snr_2500hz() {
let base_hz = 1_000.0_f32;
let noise_power = snr_to_noise_power(-11.0);
let (buf, payload) = make_ft4_test_buffer(0, base_hz, noise_power);
let results = ft4_sync(
&buf, FS,
base_hz - 20.833, base_hz + 100.0 + 20.833,
0, 0, 5,
);
assert!(
!results.is_empty(),
"FT4 sync returned no candidates at -11 dB SNR/2500 Hz \
(noise_power={:.5})",
noise_power
);
let decoded = Ft4Codec::decode_soft(&results[0].llr);
assert!(
decoded == Some(payload),
"FT4 decode_soft failed at -11 dB SNR/2500 Hz \
(noise_power={:.5}, got={:?})",
noise_power, decoded
);
}