1. SC 译码算法原理与核心流程
串行抵消(Successive Cancellation, SC)译码是极化码的基础解码方案。其核心逻辑在于利用已判决比特的信息,递归消除对后续比特推断的干扰,从而实现逐位恢复。
整个流程可以概括为四个关键步骤:
- 初始化:根据接收到的信号计算初始似然比(LLR),这是后续计算的基石。
- 递归译码:从最可靠的子信道开始,自底向上逐层计算左右子节点的 LLR 值。
- 硬判决:依据当前节点的 LLR 正负性确定比特值(0 或 1)。
- 路径更新:将已判决的结果反馈回去,用于更新后续未判决节点的 LLR。
其中,蝶形结构是 SC 译码中最核心的计算单元,它定义了节点间的数据流转关系。递推公式如下所示:

2. MATLAB 实现 SC 译码
2.1 基础代码解析
在 MATLAB 中实现 SC 译码,关键在于构建 LLR 矩阵并模拟递归过程。下面这段代码展示了如何从接收信号还原信息比特。
function decoded_bits = sc_decode(received_llr, frozen_bits)
N = length(received_llr);
n = log2(N);
decoded_bits = zeros(1, N); % 初始化输出向量
% 初始化 LLR 矩阵(模拟蝶形结构层级)
llr = zeros(N, n+1);
llr(:, n+1) = received_llr; % 最后一层填充初始 LLR
% 从倒数第二层向上递归计算
for l = n:-1:1
block_size = 2^l;
for k = 1:block_size/2
% 左上节点(奇数索引)
idx = (2*k-1);
% 注意:atanh 和 tanh 运算需处理数值溢出风险
llr(idx, l) = 2 * atanh(prod(tanh(llr(2*k-1:block_size, l+1)/2)));
% 左下节点(偶数索引)
idx = 2*k;
sign_prod = prod(sign(llr(2*k-1:block_size, l+1)));
llr(idx, l) = llr(k, l) + sum(sign_prod .* llr(2*k:block_size, l+1));
end
end
% 硬判决阶段
for k = 1:N
if ismember(k, frozen_bits)
decoded_bits(k) = 0; % 冻结位强制设为 0
else
% MATLAB 中逻辑判断直接转为 double
decoded_bits(k) = double(llr(k, 1) < 0);
end
end
end
2.2 仿真测试环境
为了验证上述函数的有效性,我们需要构建一个包含编码、加噪和解码的完整链路。这里假设存在 polar_encode 函数用于生成码字。
% 参数设置
N = 1024; % 码长
K = 512; % 信息位长度
frozen_bits = 1:N; % 示例:全冻结(实际应用中需根据可靠性排序选择)
snr = 2; % 信噪比 (dB)
% 生成极化码
info_bits = randi([0, 1], 1, K);
codeword = polar_encode(info_bits, N); % 需自行实现或调用工具箱
% 添加高斯噪声
received_bits = awgn(2*codeword - 1, snr, 'measured');
received_llr = 2 * received_bits ./ (10^(-snr/10));
% 执行解码
decoded_bits = sc_decode(received_llr, frozen_bits);
ber = sum(decoded_bits ~= info_bits) / K;
disp(['BER: ', num2str(ber)]);

