From f9c29575b56d15aefce44f0e0a55d82650d8c353 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Fri, 8 Aug 2025 07:54:53 +0200 Subject: [PATCH] reject phases too close to diagonals --- decode.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/decode.cc b/decode.cc index 42ec6e3..3681f1e 100644 --- a/decode.cc +++ b/decode.cc @@ -229,12 +229,16 @@ struct Decoder : Common for (int i = offset; i < tone_count; i += stride) if (i % block_length == pilot_off) sum += demod[i]; - if (abs(sum) < pilot_tones / (2 * stride)) { + value half = pilot_tones / (2 * stride); + value magr = std::abs(sum.real()); + value magi = std::abs(sum.imag()); + bool real = magr > magi; + if (real ? (magr < half || 2 * magi > magr) : (magi < half || 2 * magr > magi)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; return false; } - cmplx rot = std::abs(sum.real()) < std::abs(sum.imag()) ? cmplx(0, sum.imag() < 0 ? 1 : -1) : cmplx(sum.real() < 0 ? -1 : 1); + cmplx rot = real ? cmplx(sum.real() < 0 ? -1 : 1) : cmplx(0, sum.imag() < 0 ? 1 : -1); for (int i = offset; i < tone_count; i += stride) { tone[i] *= rot; demod[i] *= rot;