fix(tx): bfo=1 в OpenChannel TXA — устранён фазовый разрыв TUN-тона

Всплески на водопаде + щелчки в аудио при TX (openHPSDR TUN/DUP):
периодический ~72° фазовый разрыв передаваемого PostGen-тона на границе
TX-блока, в среднем ~5 раз за сессию, привязан к фазе тона.

Причина: TX-канал открывался с bfo=0 (13-й параметр OpenChannel). При
bfo=0 fexchange0 читает выход из кольца r2 асинхронно (заполняет DSP-поток),
а r2_outidx продвигается на out_size каждый вызов; при рассинхроне DSP-потока
блок изредка читается со швом → разрыв фазы тона (err=0, амплитуда постоянна).
В DUP этот сплаттер принимается обратно = широкополосная строка на водопаде
и слышимый щелчок.

Диагностика A/B: pihpsdr на том же WDSP/радио и на той же частоте 750 Гц —
чист; единственное отличие в открытии TX-канала — bfo=1 (transmitter.c:1316).
При bfo=1 fexchange0 ждёт Sem_OutReady и отдаёт полный выходной блок
синхронно/фазонепрерывно (wdsp/iobuffs.c). Продюсер даёт ровно один вход-блок
на вызов → стойла нет.

Исключено прямыми зондами: рендер, NB/NB2, перегруз ADC, потеря пакетов DDC
(seq), переполнение RX-очереди, временно́й разрыв в принятом IQ, burst
catch-up продюсера, TX-пейсинг.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 15:35:31 +03:00
co-authored by Claude Opus 4.8
parent 69717c2eda
commit f2d0519c9e
+3 -1
View File
@@ -1181,7 +1181,9 @@ begin
1,
0,
0.010, 0.010, 0.010, 0.010,
0
1 // bfo=1: fexchange0 БЛОКИРУЕТСЯ до готовности выходного блока (как
// pihpsdr). bfo=0 давал async-чтение кольца r2 со сдвигом outidx →
// изредка фазовый разрыв PostGen-тона (всплеск на водопаде + щелчок).
);
SetTXAMode(TXA_CHAN, ModeToWDSP(FMode));