From 604fd836ba51f3e699ff689ae889ded21806b575 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Sun, 10 May 2026 17:02:43 +0300 Subject: [PATCH] fix TUN tone frequency sign for LSB/CWL modes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gen1 (TXA PostGen) sits after all modulators and the bandpass filter, so a positive frequency always produces a tone above the carrier. For LSB and CWL the tone must appear below the carrier — negate the frequency for those modes. Also re-apply the tone when mode is switched while TUN is active. Co-Authored-By: Claude Sonnet 4.6 --- MainForm.pas | 5 +++++ WDSPEngine.pas | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/MainForm.pas b/MainForm.pas index 1a30a16..6eb0151 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -4352,7 +4352,12 @@ begin FMode := N; for i := 0 to MODE_COUNT - 1 do StyleButton(BtnMode[i], i = FMode); if FWDSPReady then + begin FDSPEngine.SetMode(N); + // Если TUN активен — пересчитываем знак частоты под новый режим + if FTuning then + FDSPEngine.SetTXTone(True, FTXSettings.TUNFreq, 1.0); + end; UpdateFilterButtons; // обновляем подписи и дефолт фильтра под новый режим ApplyModeFilter; SyncSpecViewFreq; // FSpecView.Mode/FilterBW — иначе полоса рисуется под старый режим diff --git a/WDSPEngine.pas b/WDSPEngine.pas index 2f81cd6..8b4ef40 100644 --- a/WDSPEngine.pas +++ b/WDSPEngine.pas @@ -1595,12 +1595,21 @@ begin end; procedure TWDSPEngine.SetTXTone(Enabled: Boolean; FreqHz, Mag: Double); +var + SignedFreq: Double; begin if not FInitialized then Exit; if Enabled then begin + // gen1 (PostGen) стоит после всех модуляторов и бандпасса. + // Положительная частота даёт тон ВЫШЕ несущей (USB-сторона). + // Для LSB и CWL нужен тон НИЖЕ несущей — инвертируем знак. + if (FMode = MODE_LSB) or (FMode = MODE_CWL) then + SignedFreq := -Abs(FreqHz) + else + SignedFreq := Abs(FreqHz); SetTXAPostGenMode(TXA_CHAN, 0); // 0 = tone - SetTXAPostGenToneFreq(TXA_CHAN, FreqHz); + SetTXAPostGenToneFreq(TXA_CHAN, SignedFreq); SetTXAPostGenToneMag(TXA_CHAN, Max(0.0, Min(1.0, Mag))); SetTXAPostGenRun(TXA_CHAN, 1); end else