nearlink_sdr.phy.preamble 源代码


__all__ = [
    "BW_SYMBOL_RATE",
    "PREAMBLE_CONFIG",
    "generate_preamble",
    "gfsk_preamble_bits",
    "psk_preamble_phases",
    "psk_preamble_symbols",
]


import numpy as np

# TXS-10002-2025 6.2.2 前导信号

# 各带宽对应的符号速率 (MHz)
BW_SYMBOL_RATE = {
    0.1: 0.1,
    0.125: 0.125,
    0.25: 0.25,
    0.5: 0.5,
    1.0: 1.0,
    2.0: 2.0,
    4.0: 4.0,
}


[文档] def gfsk_preamble_bits(symbol_rate_mhz: float = 1.0, duration_us: float = 10.0) -> np.ndarray: """生成GFSK前导码比特序列。 帧类型1使用 [0,1] 交替序列,第一个码元为0。 :param symbol_rate_mhz: 符号速率 (MHz) :param duration_us: 前导码持续时间 (μs) :returns: 前导码比特序列, 值为 0/1 """ n_symbols = int(symbol_rate_mhz * duration_us) bits = np.zeros(n_symbols, dtype=int) bits[1::2] = 1 # [0,1,0,1,...] return bits
[文档] def psk_preamble_phases(symbol_rate_mhz: float = 1.0, duration_us: float = 10.0) -> np.ndarray: """生成PSK前导码相位序列。 帧类型2/3/4使用 [π/4, 0] 交替相位。 :param symbol_rate_mhz: 符号速率 (MHz) :param duration_us: 前导码持续时间 (μs),帧类型2=10,帧类型3=12,帧类型4=16 :returns: 前导码相位序列 (弧度) """ n_symbols = int(symbol_rate_mhz * duration_us) phases = np.zeros(n_symbols, dtype=float) phases[0::2] = np.pi / 4 # [π/4, 0, π/4, 0, ...] return phases
[文档] def psk_preamble_symbols(symbol_rate_mhz: float = 1.0, duration_us: float = 10.0) -> np.ndarray: """生成PSK前导码复数符号序列。 :param symbol_rate_mhz: 符号速率 (MHz) :param duration_us: 前导码持续时间 (μs) :returns: 前导码复数符号, shape (N,) """ phases = psk_preamble_phases(symbol_rate_mhz, duration_us) return np.exp(1j * phases)
# 前导码配置: {帧类型: (调制方式, 持续时间μs)} PREAMBLE_CONFIG = { 1: ("GFSK", 10.0), 2: ("PSK", 10.0), 3: ("PSK", 12.0), 4: ("PSK", 16.0), }
[文档] def generate_preamble(frame_type: int, symbol_rate_mhz: float = 1.0): """生成指定帧类型的前导码。 :param frame_type: 帧类型 1~4 :param symbol_rate_mhz: 符号速率 (MHz) :returns: 帧类型1: 比特数组 (int ndarray) 帧类型2/3/4: 复数符号数组 (complex ndarray) """ mod_type, duration = PREAMBLE_CONFIG[frame_type] if mod_type == "GFSK": return gfsk_preamble_bits(symbol_rate_mhz, duration) else: return psk_preamble_symbols(symbol_rate_mhz, duration)