params_ft4.py
Rama main · réplica de lectura del repositorio original.
"""
Parametry protokolu FT4 (zgodne z naszym ft4_encoder.py, zweryfikowanym
matematycznie/strukturalnie wzgledem oficjalnej specyfikacji protokolu
FT4 — patrz ft4_protocol_notes.md).
"""
SAMPLE_RATE = 12000
SYMBOL_PERIOD = 0.048 # s, czas trwania jednego symbolu (48ms)
TONE_SPACING = 20.8333333333 # Hz, odstep miedzy 4 tonami GFSK (12000/576)
SAMPLES_PER_SYMBOL = int(round(SYMBOL_PERIOD * SAMPLE_RATE)) # 576
N_TONES = 4
N_SYM = 103 # 103 symbole: 4x Costas(4) + 3x dane(29)
# CZTERY rozne wzorce Costas (w przeciwienstwie do FT8, ktory ma JEDEN
# wzorzec powtorzony 3x). To kluczowa roznica strukturalna wymagajaca
# innego algorytmu wyszukiwania synchronizacji w sync.py.
COSTAS_PATTERNS = [
[0, 1, 3, 2], # Sync1
[1, 0, 2, 3], # Sync2
[2, 3, 1, 0], # Sync3
[3, 2, 0, 1], # Sync4
]
COSTAS_POS = [0, 33, 66, 99] # pozycje startowe (0-indexed) kazdego bloku
SLOT_PERIOD = 7.5 # s, dlugosc okna czasowego FT4 (vs 15.0 FT8)
# Maska scramblingu — 77 bitow, XOR z pack77() PRZED CRC. Identyczna z
# ft4_encoder.py::_RVEC (musi pozostac w 1:1 zgodzie — uzywana do
# de-scramblingu po LDPC decode).
RVEC = [
0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1
]
assert len(RVEC) == 77
# Gray mapping odwrotny (ton -> 2-bitowy indeks), do dekodowania symboli
# z powrotem na bity. graymap[idx]=ton podczas TX, wiec INV_GRAYMAP[ton]=idx.
GRAYMAP = [0, 1, 3, 2]
INV_GRAYMAP = [0] * 4
for _idx, _tone in enumerate(GRAYMAP):
INV_GRAYMAP[_tone] = _idx