nearlink_sdr.common.m_sequence 源代码


__all__ = [
    "M31_CONFIGS",
    "M63_CONFIGS",
    "generate_m_sequence",
    "m31_sequence",
    "m63_sequence",
]


import numpy as np

try:
    from nearlink_sdr_accel import rust_generate_m_sequence as _rust_m_seq
    _HAS_RUST_MSEQ = True
except ImportError:
    _HAS_RUST_MSEQ = False

# TXS-10002-2025 6.10.2 m序列
# 反馈系数与移位寄存器初始值定义

# 31长m序列(5阶LFSR)
M31_CONFIGS = {
    0: {"taps": 0b100101, "init": 0b00001},
    1: {"taps": 0b101001, "init": 0b00001},
    2: {"taps": 0b110111, "init": 0b00001},
    3: {"taps": 0b111011, "init": 0b00001},
    4: {"taps": 0b111101, "init": 0b00001},
    5: {"taps": 0b101111, "init": 0b00001},
}

# 63长m序列(6阶LFSR)
M63_CONFIGS = {
    0: {"taps": 0b1000011, "init": 0b000001},
    1: {"taps": 0b1100001, "init": 0b000001},
    2: {"taps": 0b1100111, "init": 0b000001},
    3: {"taps": 0b1110011, "init": 0b000001},
    4: {"taps": 0b1101101, "init": 0b000001},
    5: {"taps": 0b1011011, "init": 0b000001},
}


[文档] def generate_m_sequence(order: int, taps: int, init_val: int, length: int | None = None) -> np.ndarray: """生成线性反馈移位寄存器产生的m序列。 :param order: LFSR阶数(移位寄存器位数) :param taps: 反馈系数(二进制表示,包含最高位) :param init_val: 移位寄存器初始值 :param length: 输出序列长度,默认为 2^order - 1(完整m序列周期) :returns: m序列比特数组, shape (length,), 值为 0/1 """ if length is None: length = (1 << order) - 1 if _HAS_RUST_MSEQ: return np.asarray(_rust_m_seq(order, taps, init_val, length)) reg = init_val mask = (1 << order) - 1 seq = np.zeros(length, dtype=int) for i in range(length): # 输出最低位 seq[i] = reg & 1 # 计算反馈:将reg与taps去掉最高位后做AND,然后求各位异或 feedback_bits = reg & (taps & mask) feedback = 0 for _ in range(order): feedback ^= feedback_bits & 1 feedback_bits >>= 1 # 移位 reg = ((reg >> 1) | (feedback << (order - 1))) & mask return seq
[文档] def m31_sequence(index: int, length: int = 31) -> np.ndarray: """生成标准中定义的31长m序列。 :param index: 序列编号 0~5 :param length: 输出长度,默认31 """ cfg = M31_CONFIGS[index] return generate_m_sequence(5, cfg["taps"], cfg["init"], length)
[文档] def m63_sequence(index: int, length: int = 63) -> np.ndarray: """生成标准中定义的63长m序列。 :param index: 序列编号 0~5 :param length: 输出长度,默认63 """ cfg = M63_CONFIGS[index] return generate_m_sequence(6, cfg["taps"], cfg["init"], length)