目录
1.引言
2.算法测试效果
3.算法涉及理论知识概要
3.1 自适应参数量化译码原理
3.2 自适应参数量化完整实现步骤
4.核心程序
5.完整算法代码文件获得
1.引言
5G通信系统采用LDPC码作为数据信道的编码方案,该码具备码长灵活、译码并行度高的优势,适配5G高速率传输需求。在硬件实现LDPC译码时,浮点译码虽然拥有最优误码性能,但硬件资源开销巨大,无法工程落地,因此固定点量化成为硬件实现的必选方案。普通固定量化会受到信噪比变化带来的对数似然比动态范围波动影响:低信噪比条件下信道噪声大,对数似然比幅值偏小;高信噪比条件下噪声减弱,对数似然比幅值显著增大,固定位宽的量化会出现幅值饱和或者量化精度不足的问题,造成译码性能大幅损失。
2.算法测试效果
传统固定定点量化方案,在高信噪比区域,对数似然比动态范围超限发生饱和,误码性能相比浮点译码存在明显的性能损失。采用本文自适应参数量化方案后,低信噪比下保留完整信道缩放系数,维持译码精度;高信噪比切换输入为接收采样,规避饱和失真。仿真结果表明,自适应参数量化译码的误码、误帧性能显著优于固定量化方案,同时性能略优于迭代缩放的归一化最小和量化译码,而硬件开销远小于迭代缩放方案。该机制在有限的量化比特条件下,缩小定点译码与浮点译码的性能差距,适合5G系统LDPC译码器的硬件工程实现。
3.算法涉及理论知识概要
3.1 自适应参数量化译码原理
定点量化一般使用(q,f)定点格式描述,q代表总量化比特数,f代表小数部分比特数。总比特数确定时,小数比特越多,量化精度越高,但可表示数据动态范围越小;小数比特减少,可表示幅值范围变大,但量化步长增大,精度下降。传统固定量化方案全程使用同一套定点格式,无法同时兼顾动态范围与量化精度。
低信噪比时,噪声方差sigma^2数值大,2*rv/sigma^2幅值整体偏小,此时优先保证量化精度,采用完整的信道先验对数似然比2*rv/sigma^2作为译码器输入,使用小数位更多的定点格式完成量化。当信道信噪比超过预设阈值之后,噪声方差变小,2*rv/sigma^2的动态范围超出定点格式可表示区间,发生饱和失真;此时放弃完整信道缩放系数,直接将接收信号rv作为变量节点初始输入,降低对数似然比的整体幅值,压缩信号动态范围,避免饱和问题,仅需要切换量化定点格式,就可以在有限比特下保留有效信息。
自适应参数量化的核心就是设置信噪比阈值C,根据实时信道信噪比与阈值C的大小关系,动态切换变量节点初始先验信息yv的计算方式,表达式为
阈值C不是理论推导得到,需要针对5G‑LDPC的码率、扩展因子,通过大量蒙特卡洛仿真确定。在本文面向的5G系统场景下,通过多组仿真对比不同阈值下的误码率、误帧率曲线,确定最优阈值C=0.4dB。当信噪比低于阈值,信道噪声较强,保留完整信道缩放增益获取足够的译码精度;信噪比高于阈值,直接使用接收采样rv,压缩对数似然比动态范围,规避定点饱和带来的性能损失。
该方案不需要在迭代内部引入迭代相关的缩放因子、多级移位运算,仅依靠多路选择器完成输入的切换,相比迭代过程中对内外信息做迭代式缩放的方案,不会带来大量加法器、移位器硬件开销,仅仅需要信道模块输出信噪比估计值作为多路选择器控制信号,硬件实现代价很低。
3.2 自适应参数量化完整实现步骤
步骤1:信道接收与信噪比估计
接收端完成5G‑LDPC码的BPSK解调,获取经过AWGN信道污染的接收采样序列rv,同时信道估计模块完成信道信噪比估计,得到当前时刻信道SNR数值,将估计结果作为自适应切换的控制信号。
步骤2:自适应选择初始先验对数似然比
将估计信噪比和预设阈值C=0.4dB做比较。SNR<=0.4dB,按照yv=2*rv/sigma^2计算初始对数似然比;若SNR>0.4dB,直接取接收采样值,令yv=rv。之后对yv做定点饱和量化,低信噪比条件采用高小数位定点格式,高信噪比切换为适配\(r_v\)幅值的定点格式,超出定点可表示区间的数据执行截断饱和处理,限制对数似然比最大、最小幅值。
步骤3:校验节点迭代更新
读取来自各个邻接变量节点经过量化后的外信息Lnc,计算输入信息符号乘积Scv,求取除目标边之外全部输入绝对值的最小值,乘以归一化补偿系数alpha,得到校验节点输出外信息Rcv,对输出结果执行定点饱和处理,防止迭代过程中数值溢出。
步骤4:变量节点迭代更新
汇总全部邻接校验节点输出的量化外信息,执行加法运算,减去对应变量节点的初始量化先验信息yv,得到变量节点发送至各个校验节点的外信息Lvc,加法运算后做饱和截断,维持在定点数表示范围之内。
步骤5:后验信息计算、硬判决与迭代终止判断
累加全部校验节点传递到变量节点的外信息,叠加初始先验信息得到后验对数似然比Lv,根据符号完成比特硬判决。校验输出码字是否满足全部奇偶校验方程,若全部校验式成立,立刻终止迭代输出译码比特;若不满足,则判断当前迭代次数。未达到最大迭代次数,则回到步骤3继续迭代更新;达到最大迭代次数,直接输出判决比特,结束译码流程。
4.核心程序
% start simulating for indx = list_indx snr = list_snr(indx); sum_err_nms_pun = 0; sum_bits = 0; for indx_block = 1:MAX_BLOCK [C,snr,indx_block] % get tbs_bits tbs_bits = randi(2, 1, ldpc_param.B) - 1; % code block segmentation [cbs_bits] = nr15_ldpc_cbs(tbs_bits, ldpc_param); % encode [coded_bits, punctured_bits] = nr15_fec_ldpc_encoder_mex(cbs_bits,ldpc_param); % rate matching [rmed_bits] = nr15_fec_ldpc_rate_matching(coded_bits,ldpc_param); % map mapped_sigs = -2.*rmed_bits+1; % through channel received_sigs = awgn(mapped_sigs,snr+10*log10(code_rate/0.5)); % get llr sigma2 = 1/10^((snr+10*log10(code_rate/0.5))/10); llr0 = 2*received_sigs./sigma2; %量化参数 if snr<=C q = 6; f = 1; else q = 6; f = 2; end llr = qbit(llr0,q,f); % rate dematching dermed_llr = nr15_fec_ldpc_rate_dematching(llr,ldpc_param); % statistics of one block sum_bits = sum_bits + K; if (sum_err_nms_pun > MIN_ERR || flag_nms_pun == 0) break; end end list_ber_nms_pun(indx) = sum_err_nms_pun/sum_bits; end Csave{ij}=list_ber_nms_pun; end figure; semilogy(list_snr,list_ber_nms_pun,'b-o'); grid on xlabel('SNR'); ylabel('error'); save Q1nms.mat list_snr list_ber_nms_pun Csave Cs5.完整算法代码文件获得
完整程序见博客首页左侧或者打开本文底部GZH名片
(V关注后回复码:X154)
V