mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
chore: remove QO-100 beacon decoder debug instrumentation
After successful on-air validation, drop the temporary diagnostics: - IQ baseband dump to ~/ewsdr_beacon_iq.f32 (FDbgStream/DbgWrite2). - BeaconLog file logger (~/ewsdr_beacon.log) and per-second STATE / AIM lines. - Dead Gardner timing fields (FMidI/FMidQ/FHalf/FPrevI/FPrevQ), superseded by the ML signal×slope TED. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+2
-34
@@ -96,11 +96,8 @@ type
|
|||||||
FHistPos: Integer;
|
FHistPos: Integer;
|
||||||
FNtaps: Integer;
|
FNtaps: Integer;
|
||||||
|
|
||||||
// --- Gardner timing ---
|
// --- ML signal×slope symbol timing ---
|
||||||
FMuAcc: Double; // обратный отсчёт до следующего полу-символьного строба
|
FMuAcc: Double; // обратный отсчёт до следующего строба чипа
|
||||||
FHalf: Boolean; // текущий строб = середина (true) или центр символа
|
|
||||||
FMidI, FMidQ: Double; // отсчёт середины (для Gardner)
|
|
||||||
FPrevI, FPrevQ: Double; // прошлый центр символа
|
|
||||||
FYd0I, FYd0Q: Double; // линия задержки RRC-выхода (новейший)
|
FYd0I, FYd0Q: Double; // линия задержки RRC-выхода (новейший)
|
||||||
FYd1I, FYd1Q: Double; // предыдущий
|
FYd1I, FYd1Q: Double; // предыдущий
|
||||||
FYd2I, FYd2Q: Double; // −2 (для ML-TED центр/early/late + задержка «late»)
|
FYd2I, FYd2Q: Double; // −2 (для ML-TED центр/early/late + задержка «late»)
|
||||||
@@ -171,10 +168,6 @@ type
|
|||||||
FLastFrame: TBeaconFrame;
|
FLastFrame: TBeaconFrame;
|
||||||
FLastRSErr: Integer;
|
FLastRSErr: Integer;
|
||||||
|
|
||||||
// --- ВРЕМЕННЫЙ ДЕБАГ: дамп сырого baseband 9600 Гц (I,Q float32) ---
|
|
||||||
FDbgStream: TFileStream;
|
|
||||||
FDbgLeft: Integer;
|
|
||||||
|
|
||||||
// --- констелляция (кольцо) ---
|
// --- констелляция (кольцо) ---
|
||||||
FRingI, FRingQ: array[0..BCN_SCOPE_PTS-1] of Single;
|
FRingI, FRingQ: array[0..BCN_SCOPE_PTS-1] of Single;
|
||||||
FRingPos: Integer;
|
FRingPos: Integer;
|
||||||
@@ -187,7 +180,6 @@ type
|
|||||||
procedure ProcessDecimated(const xi, xq: Double);
|
procedure ProcessDecimated(const xi, xq: Double);
|
||||||
procedure ProcessSymbol(const zi, zq: Double);
|
procedure ProcessSymbol(const zi, zq: Double);
|
||||||
procedure ProcessChip(const ci, cq: Double); // Manchester + дифф-декод → FEC
|
procedure ProcessChip(const ci, cq: Double); // Manchester + дифф-декод → FEC
|
||||||
procedure DbgWrite2(const a, b: Double); // ВРЕМЕННЫЙ дамп I,Q float32
|
|
||||||
procedure FECFrame(const Frame: TBeaconFrame; RSErrors: Integer);
|
procedure FECFrame(const Frame: TBeaconFrame; RSErrors: Integer);
|
||||||
procedure ResetDSP;
|
procedure ResetDSP;
|
||||||
public
|
public
|
||||||
@@ -217,8 +209,6 @@ begin
|
|||||||
FLock := TCriticalSection.Create;
|
FLock := TCriticalSection.Create;
|
||||||
FFEC := TBeaconFEC.Create;
|
FFEC := TBeaconFEC.Create;
|
||||||
FFEC.OnFrame := FECFrame;
|
FFEC.OnFrame := FECFrame;
|
||||||
FDbgStream := nil;
|
|
||||||
FDbgLeft := 336000; // ВРЕМЕННЫЙ: ~35 c @ 9600 (2-3 кадра маяка) для оффлайн
|
|
||||||
FFs := 0;
|
FFs := 0;
|
||||||
FEnabled := False;
|
FEnabled := False;
|
||||||
FConstScale := 1.0;
|
FConstScale := 1.0;
|
||||||
@@ -227,7 +217,6 @@ end;
|
|||||||
|
|
||||||
destructor TBeaconDecoder.Destroy;
|
destructor TBeaconDecoder.Destroy;
|
||||||
begin
|
begin
|
||||||
if FDbgStream <> nil then FreeAndNil(FDbgStream);
|
|
||||||
FFEC.Free;
|
FFEC.Free;
|
||||||
FLock.Free;
|
FLock.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
@@ -426,8 +415,6 @@ begin
|
|||||||
for i := 0 to High(FHistI) do begin FHistI[i] := 0; FHistQ[i] := 0; end;
|
for i := 0 to High(FHistI) do begin FHistI[i] := 0; FHistQ[i] := 0; end;
|
||||||
FHistPos := 0;
|
FHistPos := 0;
|
||||||
FMuAcc := FSps / 2.0;
|
FMuAcc := FSps / 2.0;
|
||||||
FHalf := False;
|
|
||||||
FMidI := 0; FMidQ := 0; FPrevI := 0; FPrevQ := 0;
|
|
||||||
FYd0I := 0; FYd0Q := 0; FYd1I := 0; FYd1Q := 0;
|
FYd0I := 0; FYd0Q := 0; FYd1I := 0; FYd1Q := 0;
|
||||||
FYd2I := 0; FYd2Q := 0; FYd3I := 0; FYd3Q := 0;
|
FYd2I := 0; FYd2Q := 0; FYd3I := 0; FYd3Q := 0;
|
||||||
FWsym := 0; FTimErrEMA := 0;
|
FWsym := 0; FTimErrEMA := 0;
|
||||||
@@ -578,17 +565,6 @@ begin
|
|||||||
// Диагностика тракта (lock-независимо): RMS децимированного сигнала на входе RRC.
|
// Диагностика тракта (lock-независимо): RMS децимированного сигнала на входе RRC.
|
||||||
FDecRMS := FDecRMS + 0.001 * (Sqrt(ri * ri + ii * ii) - FDecRMS);
|
FDecRMS := FDecRMS + 0.001 * (Sqrt(ri * ri + ii * ii) - FDecRMS);
|
||||||
|
|
||||||
// ВРЕМЕННЫЙ ДЕБАГ: дамп сырого baseband (после сноса частоты, до RRC) в файл
|
|
||||||
// для оффлайн-анализа тайминга чипов и Manchester-структуры.
|
|
||||||
if (FDbgLeft > 0) and FFreqLocked then
|
|
||||||
begin
|
|
||||||
if FDbgStream = nil then
|
|
||||||
FDbgStream := TFileStream.Create(GetEnvironmentVariable('HOME') + '/ewsdr_beacon_iq.f32', fmCreate);
|
|
||||||
DbgWrite2(ri, ii);
|
|
||||||
Dec(FDbgLeft);
|
|
||||||
if FDbgLeft = 0 then FreeAndNil(FDbgStream);
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Буфер для грубой carrier-acquisition: кладём сигнал ПОСЛЕ главного NCO, но
|
// Буфер для грубой carrier-acquisition: кладём сигнал ПОСЛЕ главного NCO, но
|
||||||
// ДО остаточного — тогда squaring-FFT меряет АБСОЛЮТНЫЙ остаток (не зависит от
|
// ДО остаточного — тогда squaring-FFT меряет АБСОЛЮТНЫЙ остаток (не зависит от
|
||||||
// FResidDf) → коррекция = прямое присвоение, без накопления и runaway.
|
// FResidDf) → коррекция = прямое присвоение, без накопления и runaway.
|
||||||
@@ -781,14 +757,6 @@ begin
|
|||||||
Inc(FChipCount);
|
Inc(FChipCount);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TBeaconDecoder.DbgWrite2(const a, b: Double);
|
|
||||||
var fa, fb: Single;
|
|
||||||
begin
|
|
||||||
fa := a; fb := b;
|
|
||||||
FDbgStream.WriteBuffer(fa, 4);
|
|
||||||
FDbgStream.WriteBuffer(fb, 4);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBeaconDecoder.FECFrame(const Frame: TBeaconFrame; RSErrors: Integer);
|
procedure TBeaconDecoder.FECFrame(const Frame: TBeaconFrame; RSErrors: Integer);
|
||||||
// Колбэк из TBeaconFEC (DSP-поток). Сохраняем кадр под CS для UI.
|
// Колбэк из TBeaconFEC (DSP-поток). Сохраняем кадр под CS для UI.
|
||||||
begin
|
begin
|
||||||
|
|||||||
@@ -202,8 +202,6 @@ type
|
|||||||
FBeaconDecHz: Double; // АБСОЛЮТНАЯ display-частота наведения декодера
|
FBeaconDecHz: Double; // АБСОЛЮТНАЯ display-частота наведения декодера
|
||||||
// (узкий фильтр, ставится кликом); 0 = центр/DC
|
// (узкий фильтр, ставится кликом); 0 = центр/DC
|
||||||
FBeaconDecInvert: Boolean; // зеркальный baseband (QO-100/LNB) — деф. True
|
FBeaconDecInvert: Boolean; // зеркальный baseband (QO-100/LNB) — деф. True
|
||||||
FBeaconLogTick: Integer; // троттл периодического лога состояния декодера
|
|
||||||
FBeaconLogScope: TBeaconScope; // буфер снимка для лога (не аллоцируем в контуре)
|
|
||||||
|
|
||||||
// ---- Аудио / TX ----
|
// ---- Аудио / TX ----
|
||||||
FVolume: Integer;
|
FVolume: Integer;
|
||||||
@@ -485,7 +483,6 @@ type
|
|||||||
// QO-100 beacon lock — стабилизация дрейфа LNB по опорному маяку.
|
// QO-100 beacon lock — стабилизация дрейфа LNB по опорному маяку.
|
||||||
procedure SetBeaconLock(On_: Boolean);
|
procedure SetBeaconLock(On_: Boolean);
|
||||||
procedure ServiceBeaconLock; // одна итерация контура (MeterTimer @10 Гц)
|
procedure ServiceBeaconLock; // одна итерация контура (MeterTimer @10 Гц)
|
||||||
procedure BeaconLog(const Msg: string); // диагностика декодера → HOME/ewsdr_beacon.log
|
|
||||||
procedure SetBeaconRefHz(Hz: Double); // опорная частота маяка (downlink)
|
procedure SetBeaconRefHz(Hz: Double); // опорная частота маяка (downlink)
|
||||||
procedure BeaconSeedAtHz(DisplayHz: Double); // пользователь указал маяк кликом
|
procedure BeaconSeedAtHz(DisplayHz: Double); // пользователь указал маяк кликом
|
||||||
function BeaconState: TBeaconState;
|
function BeaconState: TBeaconState;
|
||||||
@@ -1252,29 +1249,6 @@ begin
|
|||||||
FBeaconDec.SetOffsetHz(FBeaconDecHz - FCenterFreq) // наведённый узкий фильтр
|
FBeaconDec.SetOffsetHz(FBeaconDecHz - FCenterFreq) // наведённый узкий фильтр
|
||||||
else
|
else
|
||||||
FBeaconDec.SetOffsetHz(0); // иначе — центр/DC
|
FBeaconDec.SetOffsetHz(0); // иначе — центр/DC
|
||||||
|
|
||||||
// Периодический снимок состояния (раз в ~1с при @10Гц-таймере) в лог-файл.
|
|
||||||
Inc(FBeaconLogTick);
|
|
||||||
if FBeaconLogTick >= 10 then
|
|
||||||
begin
|
|
||||||
FBeaconLogTick := 0;
|
|
||||||
GetBeaconScope(FBeaconLogScope);
|
|
||||||
BeaconLog(Format(
|
|
||||||
'STATE decHz=%.1f center=%.1f off=%.1f | Fs=%.0f Fdec=%.0f sps=%.1f | ' +
|
|
||||||
'resid=%.1f prom=%.1f snr=%.1f baud=%.1f decRMS=%.5f symMag=%.5f ' +
|
|
||||||
'timErr=%.5f wsym=%.4f carHz=%.1f hold=%d | CAR=%d SYM=%d invert=%d lockOn=%d locked=%d ' +
|
|
||||||
'| manPh=%d m0=%.5f m1=%.5f frames=%d rsErr=%d',
|
|
||||||
[FBeaconDecHz, FCenterFreq, FBeaconLogScope.OffsetHz,
|
|
||||||
FBeaconLogScope.FsHz, FBeaconLogScope.FdecHz, FBeaconLogScope.Sps,
|
|
||||||
FBeaconLogScope.ResidHz, FBeaconLogScope.CarProm, FBeaconLogScope.SNRdB,
|
|
||||||
FBeaconLogScope.SymRate, FBeaconLogScope.DecRMS, FBeaconLogScope.SymMag,
|
|
||||||
FBeaconLogScope.TimErr, FBeaconLogScope.Wsym, FBeaconLogScope.CarFreqHz,
|
|
||||||
FBeaconLogScope.LockHold,
|
|
||||||
Ord(FBeaconLogScope.CarrierLock), Ord(FBeaconLogScope.SymbolLock),
|
|
||||||
Ord(FBeaconDecInvert), Ord(FBeaconLockOn), Ord(FBeaconLocked),
|
|
||||||
FBeaconLogScope.ManPhase, FBeaconLogScope.ManM0, FBeaconLogScope.ManM1,
|
|
||||||
FBeaconLogScope.Frames, FBeaconLogScope.LastRSErr]));
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if not FBeaconLockOn then Exit;
|
if not FBeaconLockOn then Exit;
|
||||||
@@ -1417,34 +1391,9 @@ begin
|
|||||||
FBeaconDec.SetOffsetHz(FBeaconDecHz - FCenterFreq);
|
FBeaconDec.SetOffsetHz(FBeaconDecHz - FCenterFreq);
|
||||||
FBeaconDec.Reseed;
|
FBeaconDec.Reseed;
|
||||||
end;
|
end;
|
||||||
BeaconLog(Format('AIM click: DisplayHz=%.1f CenterFreq=%.1f -> offset=%.1f invert=%d span=%.0f',
|
|
||||||
[DisplayHz, FCenterFreq, FBeaconDecHz - FCenterFreq, Ord(FBeaconDecInvert), FSpanHz]));
|
|
||||||
Changed(rfBeaconLock);
|
Changed(rfBeaconLock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TRadioController.BeaconLog(const Msg: string);
|
|
||||||
// Диагностика декодера маяка: дописываем строку в HOME/ewsdr_beacon.log.
|
|
||||||
// Дёшево и кросс-платформенно; файл потом скидывается на разбор.
|
|
||||||
var
|
|
||||||
f: TextFile;
|
|
||||||
path, home: string;
|
|
||||||
begin
|
|
||||||
home := GetEnvironmentVariable('HOME');
|
|
||||||
if home = '' then home := GetTempDir;
|
|
||||||
path := IncludeTrailingPathDelimiter(home) + 'ewsdr_beacon.log';
|
|
||||||
try
|
|
||||||
AssignFile(f, path);
|
|
||||||
if FileExists(path) then Append(f) else Rewrite(f);
|
|
||||||
try
|
|
||||||
WriteLn(f, FormatDateTime('hh:nn:ss.zzz', Now), ' ', Msg);
|
|
||||||
finally
|
|
||||||
CloseFile(f);
|
|
||||||
end;
|
|
||||||
except
|
|
||||||
// лог не должен ронять контур — глотаем ошибки I/O
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TRadioController.BeaconDecodeEnabled: Boolean;
|
function TRadioController.BeaconDecodeEnabled: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := FBeaconDecOn;
|
Result := FBeaconDecOn;
|
||||||
|
|||||||
Reference in New Issue
Block a user