# tpcdec
Turbo 乘积码解码器
函数库: TyCommunication
# 语法
(decoded, actualnumiter) = tpcdec(llr, N, K)
(decoded, actualnumiter) = tpcdec(llr, N, K, S)
(decoded, actualnumiter) = tpcdec(llr, N, K, S, maxnumiter)
(decoded, actualnumiter) = tpcdec(llr, N, K, S, maxnumiter, earlyterm)
# 说明
(decoded, actualnumiter) = tpcdec(llr, N, K) 使用由码字长度 N 和消息长度, K 指定的两个线性块代码对输入对数似然比 llr 执行 2-DTPC 解码, 返回实际解码迭代次数 actualnumiter。有关 2-DTPC 解码的说明,请参见算法。
(decoded, actualnumiter) = tpcdec(llr, N, K, S) 使用由码字长度 (N–K+S) 和消息长度 S 指定的 2-D TPC 解码器在缩短的 llr 上执行 2-D TPC 解码。
(decoded, actualnumiter) = tpcdec(llr, N, K, S, maxnumiter) 执行 2-D TPC 解码,以实现最大迭代次数。要将 maxnumiter 用于全长消息,请将 S 指定为空 [ ]。 示例
(decoded, actualnumiter) = tpcdec(llr, N, K, S, maxnumiter, earlyterm) 执行 2-D TPC 解码,如果计算出的综合征或组件代码的奇偶校验在最大数字解码迭代之前计算为零,则提前终止。要将 maxnumiter 和 earlyterm 用于全长消息,请将 S 指定为空[ ]。
# 示例
使用 Turbo 乘积码进行编解码
使用 Turbo 乘积码进行编解码。
using TyCommunication
using TyBase
using TyMath
rng = MT19937ar(1234)
N = [32; 16];
K = [21; 11];
msg = rand(rng,0:1, prod(K), 1);
code = tpcenc(msg, N, K);
iterations = 3;
decoded, = tpcdec(code, N, K, [], iterations);
numerr, = biterr(msg, decoded)
numerr = 0
使用缩短的 TPC 码解码
解码一个缩短的 TPC 编码。应用 QPSK 调制,并输出从 QPSK 解调得到的近似对数似然比信号。
首先,使用扩展汉明码和扩展 BCH 码对随机比特向量进行 2-D turbo 乘积编码(TPC)。
指定 (N,K) 编码对和 S 用于 TPC 编码。
using TyCommunication
using TyMath
rng = MT19937ar(5489)
N = [32; 32]
K = [21; 26]
S = [19; 24]
生成一个随机消息比特的列向量,并对该消息进行 TPC 编码。将缩短的消息比特指定为长度等于 S 元素乘积的向量。
msg = randi(rng, [0 1], prod(S), 1)
code = tpcenc(msg, N, K, S)
应用 QPSK 调制。给信号添加加性白噪声(AWGN)。对信号进行解调并输出近似的 LLR。
M = 4
snr = 3
txsig = qammod(code, M; InputType="bit", UnitAveragePower=true)
rxsig = awgn(rng, txsig, snr, "measured")
llr = qamdemod(
rxsig, M; OutputType="approxllr", UnitAveragePower=true, NoiseVariance=10 .^ (-snr / 10)
)
进行 TPC 解码,进行两次迭代。因为解调器的输出为负双极映射,而 TPC 解码器期望正双极映射的输入,因此解调信号输出必须在解码器输入处取反。检查解码信号的比特错误率。
iterations = 2
decoded, = tpcdec(-llr, N, K, S, iterations)
_, ber = biterr(msg, decoded)
ber = 0.0
采用缩短和提前终止技术的 TPC 解码
解码一个缩短的 TPC 编码,并指定解码的提前终止。应用 QPSK 调制,并输出从 QPSK 解调中获得的近似对数似然比信号。
首先,使用扩展汉明码和扩展 BCH 码对随机比特向量进行 2-D turbo 乘积编码(TPC)。指定 (N,K) 编码对和用于 TPC 编码的 S,以及最多 10 次解码迭代。对信号进行 QPSK 调制。
using TyCommunication
using TyMath
rng = MT19937ar(5489)
n = [64; 32]
k = [51; 26]
s = [49; 24]
maxnumiter = 10
M = 4
msg = randi(rng, [0 1], prod(s), 1);
code = tpcenc(msg, n, k, s)
txsig = qammod(code, M; InputType="bit", UnitAveragePower=true)
向传输信号添加噪声。
snr = 5
rxsig = awgn(rng, txsig, snr, "measured")
使用近似的 LLR 解映射对接收到的信号进行解调。
llr = qamdemod(
rxsig, M; OutputType="approxllr", UnitAveragePower=true, NoiseVariance=10 .^ (-snr / 10)
)
指定最大的 TPC 解码迭代次数,并返回实际执行的迭代次数。默认情况下,TPC 解码的提前终止是开启的。显示错误数量和执行的迭代次数。
decoded, actualNumIter = tpcdec(-llr, n, k, s, maxnumiter)
numErr, = biterr(msg, decoded)
display([
"Terminated after " *
string(actualNumIter) *
" iterations." *
" Number of errors = " *
string(numErr) *
".",
])
1-element Vector{String}:
"Terminated after 10 iterations. Number of errors = 0."
# 输入参数
N - 码字长度二元整数向量
K - 消息长度二元整数向量
S - 缩短消息长度二元整数向量
缩短的消息长度,指定为双元素整数向量,[
指定此参数时,请为缩短为
数据类型: Int64
maxnumiter - 最大解码迭代次数4(默认值)| 正整数
解码迭代的最大次数,指定为正整数。
数据类型: Int64
earlyterm - 允许提前终止true(默认值)| false
启用解码的提前终止,指定为逻辑终止。当 earlyterm 为 true 时,如果在 maxnumiter 解码迭代之前,分量代码的计算出的综合征或奇偶校验值计算为零,则解码提前终止。
数据类型: Bool
# 输出参数
decoded - TPC 解码的消息向量
actualnumiter - 实际解码迭代次数正整数
执行的实际解码迭代次数,以正整数返回。
数据类型: Int64
# 更多相关
组件代码
此表列出了行 (
表示乘积码矩阵的行数; 表示消息矩阵的行数; 表示乘积码矩阵的列数; 表示消息矩阵的列数。
在每种代码类型中,任意两个组件代码对都可以形成二维 TPC 代码。该表还包括每个代码对的纠错能力。
| 编码类型 | 组件代码对 (NR, kR) 和 (NC, KC) | 纠错能力 T |
|---|---|---|
| Hamming Code | (255,247) | 1 |
| (127,120) | 1 | |
| (63,57) | 1 | |
| (31,26) | 1 | |
| (15,11) | 1 | |
| (7,4) | 1 | |
| Extended Hamming Code | (256,247) | 1 |
| (128,120) | 1 | |
| (64,57) | 1 | |
| (32,26) | 1 | |
| (16,11) | 1 | |
| (8,4) | 1 | |
| BCH Code | (255,239) | 2 |
| (127,113) | 2 | |
| (63,51) | 2 | |
| (31,21) | 2 | |
| (15,7) | 2 | |
| Extended BCH Code | (256,239) | 2 |
| (128,113) | 2 | |
| (64,51) | 2 | |
| (32,21) | 2 | |
| (16,7) | 2 | |
| Parity Check Code | (256,255) | - |
| (128,127) | - | |
| (64,63) | - | |
| (32,31) | - | |
| (16,15) | - | |
| (8,7) | - | |
| (4,3) | - |
# 算法
Turbo 乘积码 (TPC) 是一种串联代码,用作前向纠错 (FEC) 代码。两个或多个组件块代码(例如系统线性块代码)用于构建 TPC。TPC 解码器使用 Chase 解码和 Pyndiah 算法实现乘积码的接近最佳解码,以执行迭代软输入,软输出解码。该解码器使用两个线性块代码实现迭代软输入、软输出二维乘积码解码,
提示
TPC 解码器需要一个正双极性映射输入,特别是映射到 0 的 –1 和映射到 1 的 +1。通信工具箱中解调器的输出是负双极性映射,特别是映射到 0 的 +1 和映射到 +1 的 –1。因此,必须否定解调器的 llr 输出,以提供 TPC 解码器所期望的正双极性映射输入。
TPC 解码全长消息
TPC 编码的全长输入消息使用指定的 2-D TPC 代码对进行解码。行解码使用 (
TPC 解码器使用 Chase 解码和 Pyndiah 算法实现乘积码的接近最佳解码,以执行迭代软输入,软输出解码。Chase 解码为每行或每列形成一组可能的码字。Pyndiah 算法计算下一个解码步骤所需的软信息。
迭代软输入,软输出解码器
迭代软输入,软输出解码,如框图所示,为每次迭代执行两个解码步骤。
用于解码的软输入为
- 迭代循环计数器 i 从 i = 1 递增到指定的迭代次数;
- m = 2i – 1是解码步长索引;
- R 是接收的 LLR 矩阵;
- R(m) 是第 m 个解码步骤的软输入;
- W(m) 是第 m 个解码步骤的输入外在信息;
- α(m) = [0,0.2,0.3,0.5,0.7,0.9,1,1, ...],其中 α 是基于解码步骤索引应用的加权系数。对于更高的解码步骤,
= 1; - β(m) = [0.2,0.4,0.6,0.8,1,1, ...],其中 β 是基于解码步骤索引应用的可靠性系数。对于更高的解码步骤,
= 1; - D 包含解码的消息位。输出消息位由 D 组成,方法是将 –1 映射到 0 和 +1 到 1,然后将消息块重塑为列向量。
输出消息位是在循环访问指定次数的迭代后形成的,或者,如果启用了提前终止,则在代码收敛之后形成。
TPC 解码的提前终止
如果启用了提前终止,则会在每个逐行和按列解码步骤中对软输入的硬决策执行代码收敛检查。可以在行间解码或列解码收敛后触发提前终止。
如果对于所有行或所有列,
- 该综合征在编码(Hamming codes, Extended Hamming codes, BCH codes, or Extended BCH codes)中评估为零;
- 奇偶校验在奇偶校验代码中计算为零。
报告的迭代次数将计算为当前正在进行的迭代值。例如,如果在第三次迭代中(在 2.5 个解码步骤之后)逐行解码后满足代码收敛检查,则返回的迭代次数为 3。