LDPC 5G#

此模块包含 API,用于使用 cuPHY 库中的 GPU 加速 LDPC 编码链。 这包括编码和解码、速率匹配和 CRC 校验。 此外,此模块还包含许多实用程序函数,例如用于确定 LDPC 基图、传输块大小等。

class aerial.phy5g.ldpc.decoder.LdpcDecoder#

LDPC 解码器。

此类支持解码按照 TS 38.212 编码的 LDPC 代码块。 它在底层使用 cuPHY 加速的 LDPC 解码例程。

__init__(
num_iterations=10,
throughput_mode=False,
cuda_stream=None,
)#

初始化 LdpcDecoder。

参数:
  • num_iterations (int) – LDPC 解码器迭代次数。默认值:10。

  • throughput_mode (bool) – 启用吞吐量模式。默认值:False。

  • cuda_stream (int) – CUDA 流。如果未给定,将创建一个。

返回类型:

None

decode(
*,
input_llrs,
pusch_configs=None,
tb_sizes=None,
code_rates=None,
redundancy_versions=None,
rate_match_lengths=None,
num_iterations=None,
)#

LDPC 解码器的解码函数。

解码器输出解码后的代码块,可以使用 CrcChecker 将其进一步连接成接收到的传输块。

可以使用 Numpy 或 CuPy 数组调用该方法。 如果输入数组位于 GPU (CuPy) 上,则输出将在 GPU (CuPy) 上。 因此,当调用该方法时,返回类型应与用于 input_llrs 的类型相同。

参数:
  • input_llrs (List[Array]) – 每个 UE 的输入 LLR,每个数组都是 N x C 的 32 位浮点数组,其中 N 是每个代码块的 LLR 数量,C 是代码块的数量。

  • pusch_configs (List[PuschConfig]) – PUSCH 配置对象列表,每个 UE 组一个。 如果给出了此参数,则忽略其余参数。 如果未给出,则需要给出所有其他参数。

  • tb_sizes (List[int]) – 传输块大小(以比特为单位),不含 CRC,每个 UE 一个。

  • code_rates (List[float]) – 每个 UE 的目标码率。

  • redundancy_versions (List[int]) – 冗余版本,即 0、1、2 或 3,每个 UE 一个。

  • rate_match_lengths (int) – 每个 UE 的速率匹配输出比特数。 这等于 N。

  • num_iterations (int) – LDPC 迭代次数。 如果未给出,则使用构造函数中的默认值。

返回值:

解码后的比特。

返回类型:

List[Array]

set_num_iterations(num_iterations)#

设置要运行的迭代次数的特定值。

参数:

num_iterations (int) – 迭代次数的值。

返回类型:

None

set_throughput_mode(throughput_mode)#

启用吞吐量模式。

参数:

throughput_mode (bool) – 启用 (True) 吞吐量模式。

返回类型:

None

get_soft_bits()#

获取解码器的软比特输出。

返回值:

数组中的软比特。

返回类型:

List[Array]

class aerial.phy5g.ldpc.encoder.LdpcEncoder#

LDPC 编码器。

此类提供使用 LDPC 编码按照 TS 38.212 对传输的传输块比特进行编码。 编码过程使用 cuPHY 例程进行 GPU 加速。 作为输入,传输块应附加 CRC 并分段为代码块(根据 TS 38.212)。

__init__(
num_profiling_iterations=0,
puncturing=True,
max_num_code_blocks=152,
cuda_stream=None,
)#

初始化 LdpcEncoder。

初始化为 cuPHY 执行所有必要的内存分配。

参数:
  • num_profiling_iterations (int) – 性能分析迭代次数。设置为 0 以禁用性能分析。默认值:0。

  • puncturing (bool) – 是否对系统比特 (2Zc) 进行删余。默认值:True。

  • max_num_code_blocks (int) – 代码块的最大数量。内存基于此数量分配。默认值:152。

  • cuda_stream (int) – CUDA 流。如果未给定,将创建一个。

返回类型:

None

encode(input_data, tb_size, code_rate, redundancy_version)#

LDPC 编码器的编码函数。

此函数的输入是代码块,这意味着代码块分段应在此函数调用之前完成。 代码块分段可以使用 code_block_segment() 完成。

参数:
  • input_data (np.ndarray) – 输入代码块,为 K x C 数组,其中 K 是每个代码块的输入比特数(包括 CRC),C 是代码块的数量。输入数组的 dtype 必须为 np.float32

  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 目标码率。

  • redundancy_version (int) – 冗余版本,0、1、2 或 3。

返回值:

编码后的比特,为 N x C 数组,其中 N 是每个代码块的编码比特数。

返回类型:

np.ndarray

set_profiling_iterations(num_profiling_iterations)#

设置要运行的性能分析迭代次数的特定值。

参数:

num_profiling_iterations (int) – 性能分析迭代次数的值。

返回类型:

None

set_puncturing(puncturing)#

设置删余标志。

参数:

puncturing (bool) – 是否对系统比特 (2*Zc) 进行删余。默认值:True。

返回类型:

None

class aerial.phy5g.ldpc.rate_match.LdpcRateMatch#

LDPC 速率匹配。

__init__(
enable_scrambling=True,
num_profiling_iterations=0,
max_num_code_blocks=152,
cuda_stream=None,
)#

初始化 LdpcRateMatch。

初始化为 cuPHY 执行所有必要的内存分配。

参数:
  • enable_scrambling (bool) – 是否在代码块连接后启用加扰。

  • num_profiling_iterations (int) – 性能分析迭代次数。设置为 0 以禁用性能分析。默认值:0(无性能分析)。

  • max_num_code_blocks (int) – 代码块的最大数量。内存将基于此数量分配。

  • cuda_stream (int) – CUDA 流。如果未给定,将创建一个。

返回类型:

None

rate_match(
input_data,
tb_size,
code_rate,
rate_match_len,
mod_order,
num_layers,
redundancy_version,
cinit,
)#

LDPC 速率匹配函数。

此函数按照 TS 38.212 执行 LDPC 代码块的速率匹配。 如果启用了加扰,它还会对速率匹配的比特进行加扰。 在这种情况下,c_init 值需要设置为适当的加扰序列初始化值。

参数:
  • input_data (np.ndarray) – 输入比特,为 N x C numpy 数组,dtype 为 np.float32,其中 N 是每个代码块的比特数,C 是代码块的数量。

  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 码率。

  • rate_match_len (int) – 速率匹配输出比特数。

  • mod_order (int) – 调制阶数。

  • num_layers (int) – 层数。

  • redundancy_version (int) – 冗余版本,即 0、1、2 或 3。

  • cinit (int) – 用于初始化加扰的 c_init 值。

返回值:

速率匹配的比特。

返回类型:

np.ndarray

set_profiling_iterations(num_profiling_iterations)#

设置要运行的性能分析迭代次数的特定值。

参数:

num_profiling_iterations (int) – 性能分析迭代次数的值。

返回类型:

None

class aerial.phy5g.ldpc.derate_match.LdpcDeRateMatch#

LDPC 解速率匹配。

__init__(enable_scrambling=True, cuda_stream=None)#

初始化 LdpcDeRateMatch。

初始化为 cuPHY 执行所有必要的内存分配。

参数:
  • enable_scrambling (bool) – 是否在解速率匹配之前解扰比特。默认值:True。

  • cuda_stream (int) – CUDA 流。如果未给定,将创建一个。

返回类型:

None

derate_match(
*,
input_llrs,
pusch_configs=None,
tb_sizes=None,
code_rates=None,
rate_match_lengths=None,
mod_orders=None,
num_layers=None,
redundancy_versions=None,
ndis=None,
cinits=None,
ue_grp_idx=None,
)#

LDPC 解速率匹配函数。

参数:
  • input_llrs (List[Array]) – 输入 LLR,为 N x 1 数组,dtype 为 np.float32,其中 N 是来自均衡器的 LLR 数量。此输入数据的顺序为 bitsPerQam x numLayers x numSubcarriers x numDataSymbols。每个 UE 组一个条目。

  • pusch_configs (List[PuschConfig]) – PUSCH 配置对象列表,每个 UE 组一个。 如果给出了此参数,则忽略其余参数。 如果未给出,则需要给出所有其他参数。

  • tb_sizes (List[int]) – 传输块大小(以比特为单位),不含 CRC,每个 UE 一个。

  • code_rates (List[float]) – 每个 UE 的码率。

  • rate_match_lengths (List[int]) – 速率匹配输出比特数,与 N 相同,每个 UE 一个。

  • mod_orders (List[int]) – 每个 UE 的调制阶数。

  • num_layers (List[int]) – 每个 UE 的层数。

  • redundancy_versions (List[int]) – 冗余版本,即 0、1、2 或 3,每个 UE 一个。

  • ndis (List[int]) – 每个 UE 的新数据指示符。

  • cinits (List[int]) – 用于初始化每个 UE 加扰的 c_init 值。

  • ue_grp_idx (List[int]) – 每个 UE 的 UE 组索引。默认值是一对一映射。

返回值:

每个 UE 的解速率匹配 LLR。

返回类型:

List[Array]

class aerial.phy5g.ldpc.crc_check.CrcChecker#

CRC 校验。

此类支持解码代码块 CRC、将代码块解段在一起、组装传输块以及最终解码传输块 CRC。 它在底层使用 cuPHY 加速的 CRC 例程。

__init__(cuda_stream=None)#

初始化 CrcChecker。

参数:

cuda_stream (int) – CUDA 流。如果未给定,将创建一个。

返回类型:

None

check_crc(
*,
input_bits,
pusch_configs=None,
tb_sizes=None,
code_rates=None,
)#

CRC 校验。

此方法将 LDPC 解码器输出作为其输入,检查代码块 CRC,解段代码块,将它们组合成一个传输块,并检查传输块 CRC。 它返回不含 CRC 的传输块有效负载,以及传输块 CRC 校验结果。 代码块 CRC 结果也存储,并且可以单独查询。

参数:
  • input_bits (List[Array]) – 每个 UE 的 LDPC 解码器输出,每个数组都是 K x C 的 32 位浮点数组,其中 K 是每个代码块的比特数,C 是代码块的数量。

  • pusch_configs (List[PuschConfig]) – PUSCH 配置对象列表,每个 UE 组一个。 如果给出了此参数,则忽略其余参数。 如果未给出,则需要给出所有其他参数。

  • tb_sizes (List[int]) – 传输块大小(以比特为单位),不含 CRC,每个 UE 一个。

  • code_rates (List[float]) – 每个 UE 的目标码率。

返回值:

包含以下内容的元组

  • List[Array]: 传输块有效负载(以字节为单位),不含 CRC,每个 UE 一个。

  • List[Array]: 每个 UE 的传输块 CRC 校验结果。

返回类型:

List[Array], List[Array]

aerial.phy5g.ldpc.util.get_mcs(mcs, table_idx=2)#

根据 MCS 索引获取调制阶数和码率。

参数:
  • mcs (int) – MCS 索引,指向由 table_idx 指示的表。

  • table_idx (int) – TS 38.214 第 5.1.3.1 节中 MCS 表的索引。值:- 1:TS38.214,表 5.1.3.1-1。- 2:TS38.214,表 5.1.3.1-2。- 3:TS38.214,表 5.1.3.1-3。

返回值:

包含以下内容的元组

  • int: 调制阶数。

  • float: 码率 * 1024。

返回类型:

int, float

aerial.phy5g.ldpc.util.get_tb_size(
mod_order,
code_rate,
dmrs_syms,
num_prbs,
start_sym,
num_symbols,
num_layers,
)#

根据给定参数获取传输块大小。

根据 TS 38.214 第 5.1.3.2 节确定传输块大小。

参数:
  • mod_order (int) – 调制阶数。

  • code_rate (float) – TS 38.214 第 5.1.3.1 节中的码率 * 1024。

  • dmrs_syms (List[int]) – 二进制数列表,指示哪些符号包含 DMRS。

  • num_prbs (int) – PRB 数量。

  • start_sym (int) – 起始符号。

  • num_symbols (int) – 符号数量。

  • num_layers (int) – 层数。

返回值:

传输块大小(以比特为单位)。

返回类型:

int

aerial.phy5g.ldpc.util.get_base_graph(tb_size, code_rate)#

获取 LDPC 基图。

参数:
  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 码率。

返回值:

基图,1 或 2。

返回类型:

int

aerial.phy5g.ldpc.util.max_code_block_size(base_graph)#

根据基图获取最大 LDPC 代码块大小。

参数:

base_graph (int) – 基图,1 或 2。

返回值:

最大代码块大小。

返回类型:

int

aerial.phy5g.ldpc.util.find_lifting_size(base_graph, tb_size)#

查找基图的提升大小。

参数:
  • base_graph (int) – 基图,1 或 2。

  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

返回值:

提升大小。

返回类型:

int

aerial.phy5g.ldpc.util.get_num_info_nodes(base_graph, tb_size)#

获取信息节点数。

注意:这是 TS 38.212 中的值 K_b

参数:
  • base_graph (int) – 基图,1 或 2。

  • tb_size (int) – 不含任何 CRC 的传输块大小。

返回值:

信息节点数 (K_b)。

返回类型:

int

aerial.phy5g.ldpc.util.get_code_block_num_info_bits(base_graph, tb_size)#

获取代码块中的信息比特数。

这是 TS 38.212 中的数字 K’,即不含填充比特的信息比特数。

参数:
  • base_graph (int) – 基图,1 或 2。

  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

返回值:

代码块中的信息比特数。

返回类型:

int

aerial.phy5g.ldpc.util.get_code_block_size(tb_size, code_rate)#

获取代码块大小。

这是 TS 38.212 中的数字 K,即包含填充比特的信息比特数。

参数:
  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 码率。

返回值:

代码块大小。

返回类型:

int

aerial.phy5g.ldpc.util.get_num_code_blocks(tb_size, code_rate)#

返回传输块的代码块数。

参数:
  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 码率。

返回值:

代码块数 (C)。

返回类型:

int

aerial.phy5g.ldpc.util.code_block_segment(tb_size, transport_block, code_rate)#

执行代码块分段。

此函数按照 TS 38.212 第 5.2.2 节执行代码块分段。 如果有多个代码块,则将随机生成的 24 位字符串附加到每个代码块以模拟代码块 CRC。

参数:
  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • transport_block (np.ndarray) – 传输块(以比特为单位),包括 CRC。

  • code_rate (float) – 码率。

返回值:

代码块。

返回类型:

np.ndarray

aerial.phy5g.ldpc.util.code_block_desegment(
code_blocks,
tb_size,
code_rate,
return_bits=True,
)#

将来自 LDPC 解码的代码块连接成一个传输块。

此函数按照 TS 38.212 将代码块解段成一个传输块,并删除 CRC,即执行与 code_block_segment() 相反的操作。

参数:
  • code_blocks (np.ndarray) – 来自 LDPC 解码器的代码块,为 N x C 数组。

  • tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

  • code_rate (float) – 码率。

  • return_bits (bool) – 如果为 True(默认值),则以比特为单位给出返回值。 否则转换为字节。

返回值:

传输块(带有 CRC),以比特或字节为单位,具体取决于 return_bits 的值。

返回类型:

np.ndarray

aerial.phy5g.ldpc.util.add_crc_len(tb_size)#

将 CRC 长度附加到传输块大小。

参数:

tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

返回值:

传输块大小(以比特为单位),包括 CRC。

返回类型:

int

aerial.phy5g.ldpc.util.random_tb(
mod_order,
code_rate,
dmrs_syms,
num_prbs,
start_sym,
num_symbols,
num_layers,
return_bits=False,
)#

生成随机传输块。

根据给定参数生成随机传输块。 传输块大小首先按照 TS 38.214 第 5.1.3.2 节确定。

参数:
  • mod_order (int) – 调制阶数。

  • code_rate (float) – TS 38.214 第 5.1.3.1 节中的码率 * 1024。

  • dmrs_syms (List[int]) – 二进制数列表,指示哪些符号包含 DMRS。

  • num_prbs (int) – PRB 数量。

  • start_sym (int) – 起始符号。

  • num_symbols (int) – 符号数量。

  • num_layers (int) – 层数。

  • return_bits (bool) – 是否以比特 (True) 或字节 (False) 返回传输块。

返回值:

随机传输块有效负载。

返回类型:

np.ndarray

aerial.phy5g.ldpc.util.get_crc_len(tb_size)#

根据传输块大小返回 CRC 长度。

参数:

tb_size (int) – 传输块大小(以比特为单位),不含 CRC。

返回值:

CRC 长度(16 或 24 比特)。

返回类型:

int