nearlink_sdr.common.bch 源代码


__all__ = [
    "BCH_31_26_GEN",
    "BCH_63_24_GEN",
    "bch_31_26_encode",
    "bch_63_24_encode",
]


import numpy as np

# TXS-10002-2025 6.2.3.1 / 6.2.3.2 BCH编码器


def _gf2_poly_mod(dividend: np.ndarray, divisor: np.ndarray) -> np.ndarray:
    """GF(2)多项式模运算。

    多项式用比特数组表示,索引i对应d^i的系数。
    """
    r = dividend.copy()
    deg = len(divisor) - 1
    for i in range(len(r) - 1, deg - 1, -1):
        if r[i]:
            r[i - deg:i + 1] ^= divisor
    return r[:deg]


# BCH(31,26) 生成多项式: G(d) = 0045 (八进制) = x^5 + x^2 + 1
BCH_31_26_GEN = np.array([1, 0, 1, 0, 0, 1], dtype=int)

# BCH(63,24) 生成多项式: 通过GF(2^6)最小多项式乘积计算得出
# 本原多项式 x^6+x+1, 连续根 α^1..α^14, 生成多项式阶数39
BCH_63_24_GEN = np.array([
    1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,
    0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1,
], dtype=int)


[文档] def bch_31_26_encode(info_26: np.ndarray) -> np.ndarray: """BCH(31,26)系统编码。 按标准6.2.3.1: C(d) = d^5 * Ã(d) mod G(d) S(d) = Ã(d) + d^26 * C(d) :param info_26: 26比特信息序列(Ã(d)的系数,索引0=d^0) :returns: 31比特码字 """ g = BCH_31_26_GEN # 阶数5 n_parity = 5 # d^5 * Ã(d) shifted = np.zeros(26 + n_parity, dtype=int) shifted[n_parity:] = info_26 parity = _gf2_poly_mod(shifted, g) codeword = np.zeros(31, dtype=int) codeword[:26] = info_26 codeword[26:31] = parity return codeword
[文档] def bch_63_24_encode(info_24: np.ndarray) -> np.ndarray: """BCH(63,24)系统编码。 按标准6.2.3.2: C(d) = d^39 * A(d) mod G(d) S(d) = A(d) + d^24 * C(d) :param info_24: 24比特信息序列(A(d)的系数,索引0=d^0) :returns: 63比特码字 """ g = BCH_63_24_GEN # 阶数39 n_parity = 39 # d^39 * A(d) shifted = np.zeros(24 + n_parity, dtype=int) shifted[n_parity:] = info_24 parity = _gf2_poly_mod(shifted, g) codeword = np.zeros(63, dtype=int) codeword[:24] = info_24 codeword[24:63] = parity return codeword