mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 19:45:09 +00:00
feat(dsp): режимы WFM, DIGI-U и DIGI-L
WFM использует новые wfmd/wfmmod из нашего форка WDSP. Демодулятор —
квадратурный дискриминатор на dsp_rate, поэтому при штатных 48 кГц
девиация 75 кГц не помещается в полосу. В WFM цепь RXA поднимается до
WFMDSPRate (наибольший FAudioRate*2^k <= 192 кГц, делящий SampleRate
нацело), rsmpin децимирует вход сам. Выше 192 кГц смысла нет: энергия
демодулированного тона выходит на полку (33.5k при 192 кГц против 31.8k
при 576 кГц), а FFT дорожает.
Две ловушки WDSP, найденные по дороге:
* firmin.c: nfor = nc / size, idxmask = nfor - 1. Все fircore создаются
с nc = max(2048, dsp_size), поэтому смена dsp_size без RXASetNC даёт
nfor = 0 — пустой массив планов и падение в fftw_execute.
* fir.c/bandpass.c планируют с FFTW_PATIENT, а wisdom.c пишет в
wdspWisdom00 только степени двойки. При SampleRate 576 кГц наивный
dsp_size = in_size = 12288 требовал FFT на 24576 точек — FFTW мерил
план 25 секунд. Отсюда потолок 192 кГц и dsp_size = степень двойки.
RXA и TXA гейтятся раздельно: рейты TXA (48 кГц вход, 192 кГц выход) от
SampleRate не зависят, поэтому wfmmod уходит на широкий dsp_rate даже
когда приёмник остался на 48 кГц.
Заодно исправлен WDSP_SAM: было 12, а RXA_SAM = 10. Раньше 12 было вне
диапазона и WDSP молча игнорировал (SAM работал как DSB); после появления
RXA_WFM = 12 это включало бы WFM-демодулятор вместо SAM. txaMode
расходится с rxaMode после DRM (WFM: RXA 12, TXA 14) — отсюда ModeToWDSPTX.
DIGI-U/DIGI-L получили свою таблицу фильтров (3.0k…300) и полосу от нуля,
а не от среза на 100 Гц, как у SSB. В CAT они замаплены на коды Kenwood 6
(FSK) и 9 (FSK-R) — раньше эти коды сваливались в USB/LSB.
Новые индексы дописаны в конец (DIGU=8, DIGL=9, WFM=10): индекс режима
уходит в settings.json, band-cache, CAT и web-API. В VfoOverlay пришлось
развести хит-коды — режимы кодировались как -(I+1) и налезли на HIT_NR/
HIT_NB/HIT_SNB, а полосы кодировались значением BW, и WFM-овские
120000/160000/200000 налезли на HIT_AGC_PICK_BASE/HIT_DEV_BASE.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -42,10 +42,20 @@ const
|
||||
FILT_AM_BW: array[0..FILT_COUNT-1] of Integer =
|
||||
(20000, 18000, 16000, 12000, 10000, 9000, 8000, 7000, 6000, 5000);
|
||||
FILT_AM_DEF = 4; // 10k
|
||||
// DIGI: полоса считается от нуля (кромки 0..BW), поэтому таблица своя —
|
||||
// SSB-полосы отмерены от среза на 100 Гц и здесь не подходят.
|
||||
FILT_DIGI_BW: array[0..FILT_COUNT-1] of Integer =
|
||||
(3000, 2700, 2400, 2100, 1800, 1500, 1200, 900, 600, 300);
|
||||
FILT_DIGI_DEF = 0; // 3.0k
|
||||
FILT_FM_COUNT = 2;
|
||||
FILT_FM_BW: array[0..1] of Integer = (11000, 16000);
|
||||
FILT_FM_DEV: array[0..1] of Double = (2500.0, 5000.0);
|
||||
FILT_FM_DEF = 0; // NFM
|
||||
// WFM: вещательный канал. 200 кГц требует SampleRate 384k — при 192k
|
||||
// WDSPEngine.SetFilter сам зажмёт кромки по Найквисту dsp_rate.
|
||||
FILT_WFM_COUNT = 3;
|
||||
FILT_WFM_BW: array[0..2] of Integer = (200000, 160000, 120000);
|
||||
FILT_WFM_DEF = 1; // 160k — влезает и в 192k
|
||||
|
||||
type
|
||||
TBandSettings = record
|
||||
|
||||
Reference in New Issue
Block a user