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