极化码理论及算法研究5-SC算法及matlab仿真
SC算法及matlab仿真
- 1、内容目录
- 2、引言
- 3、串行抵消(SC)译码算法
- 3.1、算法介绍
- 3.2、长度为2的极化码的SC译码过程
- 3.2.1、数学计算过程
- 3.2.2、译码举例
- 3.3、长度为2n2^n2n的极化码的SC译码过程
- 4、SC译码算法matlab仿真代码
- 5、总结
1、内容目录
- 开篇1-内容介绍&参考文献
- 概述2-什么是极化码?
- 原理3-Arikan原版论文学习总结
- 编码算法4-巴氏参数、GA算法以及matlab仿真
- 译码算法5-SC算法及matlab仿真
- 译码算法6-SCL、CA-SCL及matlab仿真
2、引言
上一章叙述了极化码的编码过程和针对不同信道的经典构造算法,本章对极化码的几种不同的译码算法进行详细介绍。首先介绍的是SC译码算法,该译码算法是E.Arikan针对极化码的递归编码结构所提出的,可以很好的反映编码过程,是下面几种译码的基础,需要详细介绍和研究。之后介绍目前使用范围最广的SCL译码算法,该算法原理是基于SC译码算法的,增加了译码器列表这一个参数,可以解决SC译码器的一些不足。最后介绍CA-SCL译码算法,这种算法是针对SCL译码算法,在纠错性能上的一个改进,即利用CRC辅助译码,提高对译码结果的纠错性能。接下来,就对这三种算法进行详细介绍。
3、串行抵消(SC)译码算法
3.1、算法介绍
该译码算法是极化码的经典译码算法之一。对于长度为N =2n2^n2n的极化码,SC译码器接收到的信号为y1Ny_1^Ny1N,该信号是发送端发出的经BPSK调制的信息比特,并且通过高斯信道加噪之后的信号。译码时首先利用接收信号y1Ny_1^Ny1N译码u1u_1u1,然后再利用接收信号和u1u_1u1的译码结果(这里假设u1u_1u1译码正确)继续译码u2u_2u2,之后利用接收信号和u1u_1u1,u2u_2u2,…,uiu_iui−_-−1_11 的译码结果去译码uiu_iui,直到译码uNu_NuN为止。在本节中,我们先介绍长度为2的极化码的SC译码,然后推广至长度为2n2^n2n的极化码。
3.2、长度为2的极化码的SC译码过程
3.2.1、数学计算过程
让我们来考虑一个联合分布Pr(u1,u2,y1,y2),这些随机变量的关系为:u1,u2是生成概率均为1/2的(0,1)变量,x1,x2表示经过极化码编码后的比特,则有如下等式:
它们经过二进制输入无记忆离散信道W的传输,分别形成接收信号y1,y2。现在想用观测值 y1,y2 估计原信息比特的值u1,u2。
用条件概率Pr (y1y2|u1)作为判决u1的依据:如果Pr (y1y2|u1=0)≥Pr (y1y2|u1=1),则u1判决为0;反之,将u1判决为1。结合条件概率的含义,这一点十分好理解。那么如何计算该条件概率呢?
计算过程如下:
上式中之所以得到(a)式,是因为对于任意u1,u2,Pr(u1)=0.5, Pr(u1u2)=0.25,且发送u1,u2与发送x1,x2的概率一一对应。得到等号(b)处是因为W是无记忆信道,即从信道发出x1,对应收到的信号则对应y1,同理x2与y2对应。因此可以根据以上结果,来计算该条件概率的对数似然比为:
上式在各个文献中常被称为 f 运算,其中L1和L2的表达式如下所示,他们分别表示接收信号y1和y2的LLR,若我们能计算得到L1和L2的值,则可以计算得到上式的对数似然比的值。如何计算呢?
二元输入AWGN信道是连续输出信道,如果使用BPSK调制,即s=1-2x,其中x∈{0,1},s∈{-1,1},s是发送的调制信号,y=s + n是接收信号,其中n是均值为0,方差为δ2δ^2δ2的高斯加性白噪声,则Pr(yiy_iyi)是均值为{-1,+1},方差为δ2δ^2δ2的函数,故yiy_iyi的对数似然比的形式为,将该计算公式命名为 2.2.1式 :
由以上公式可得,当我们已知接收的信号以及信道的噪声方差时,便可计算每一个接收信号的对数似然比,这一点是极化码译码的起点,理解这一点很重要。
由于f运算的计算非常复杂,同时包括指数和对数的运算,不利于硬件实现,故常常使用它的近似式,其中sign表示取符号位,将该式命名为 2.2.2式 :
到此,基本的计算公式都已经介绍完毕。下面举例来说明如何利用以上公式来进行译码。
3.2.2、译码举例
首先完成u1的译码:
当我们接收到y1和y2,就结合信道噪声方差,利用2.2.1式计算y1,y2对应的对数似然比L1,L2。再把L1和L2代入2.2.2式中进行计算得到接收信号条件概率的对数似然比 。如果u1是冻结比特,直接把它判决为预设的值;否则,如果计算结果≥0,说明Pr(y1y2|u1=0)≥Pr(y1y2|u1=1),那么将u1判决为0;反之,u1判决为1。
下面再开始判决u2的值。我们利用接收信号y1、y2与u1的值来判决u2,考虑条件概率为Pr(y1y2u1|u2),它的计算过程与计算Pr (y1y2|u1)类似,读者可自行推演,可得:
上式中代入前面判决所得到的u1的值,可求得对数似然比为,该式最后的结果在文献中被称为 g运算,该结果的推导需结合前面的推导结果才能得到正确的结果,若读者推导有困难,可私信我为你解答:
得到了该结果后,我们就可以对u2进行译码:
在第一步中获得L1,L2,u1后,代入式g运算的式子中,得到u2对应的条件概率的对数似然比的值。若u2是冻结比特,直接把它判决为预设值;若计算结果≥0,说明 Pr(y1y2u1|u2=0)≥Pr(y1y2u1|u2=1),将u2判决为0,反之,u2判决为1。
通过两步操作,我们已经完成了长度为2的极化码的译码工作。
3.3、长度为2n2^n2n的极化码的SC译码过程
通过上一章极化码的编码过程可知,长度为2n2^n2n的极化码是用n2n2^n2n−^-−1^11个2*2的基本极化码模块按照一定规则拼凑成的,于是可得,长度为2n2^n2n的极化码的SC译码也是用n2n2^n2n−^-−1^11个2*2基本极化码模块按照一定规则拼凑起来的。下面,以一个长度N=8的极化码为例,来进行极化码译码演示。
(高能预警:下面的内容需要在充分理解2.2节内容的基础上再来阅读)
例:先设置传输基本参数:AWGN信道,信噪比Eb/N0=4dB;
码长N=8,信息比特长度K=4,码率R=K/N=0.5;
信息位集合A={4,6,7,8},冻结比特全部取0;
四个信息比特为(1,1,1,1),则u18=(00010111),编码后 =(01101001)。
x18进行BPSK调制s=1-2x后得s18=(1,-1,-1,1,-1,1,1,-1)。
调制序列通过高斯信道后得到接收序列y18=(-0.4,-0.5,-0.8,0.2,-1.3,1.2,3.3,0.7)。
计算对数似然比 =(-2.0,-2.5,-4.0,1.0,-6.5,6.0,16.6,3.5)。
接下来开始译码工作(所有标红的元素都是对应步骤所计算得到的结果):
1、第一步如图所示,第4级所有元素为接收信号的LLR值,对第3级所有22模块执行f运算,得到第3级对应的LLR值。
2、第二步如图所示,对第2级前两个22模块运行f函数;
3、第三步如图所示,第1级第一个22模块运行f函数,判决u1。由于u1是冻结比特,故直接判决为0。
4、第四步如图4所示,第1级第一个22模块运行g函数,判决u2。由于u2是冻结比特,直接判决为0。
5、第五步如图所示,第2级前两个22模块运行g函数。
6、第六步如图所示,第1级第2个22模块运行f函数,判决u3。由于u3是冻结比特,直接判决为0。
7、第七步如图所示,第1级第2个22模块运行g函数,判决u4。由于u4是信息比特,其L值为-3.5,小于零,故判决u4=1。
8、第八步如图所示,第3级所有22模块运行g函数
9、第九步如图所示,第2级下两个22模块运行f函数。
10、第十步如图所示,第1级第3个22模块运行f函数,判决u5。由于u5是冻结比特,故直接将其判决为0。
11、第十一步如图所示,第1级第3个模块运行g函数,判决u6。由于u6是信息比特,其对应的LLR值小于0,故判决u6=1。
12、第十二步如图所示,第2级下两个22模块运行g函数。
13、第十三步如图所示,第1级第4个22模块运行f函数,判决u7。由于u7是信息比特,其对应的LLR值小于0,故u7判决为1。
14、第十四步如图所示,第1级第4个2*2模块运行g函数,判决u8。由于u8是信息比特,其对应的LLR值小于0,故u8判决为1。
通过以上十四步的SC译码步骤,我们最终获得了译码结果为(00010111),该结果与发送的信息比特是相同的,译码正确。经过该例的SC译码推算,可以获得更加一般的SC译码步骤,无非就是将上述译码表扩展为N*(log2_22N+1)的一个矩阵,按照上述流程一步步推算,最终译码得出所有的结果。
4、SC译码算法matlab仿真代码
在这里我仅提供SC译码算法的代码,供大家理解,若要运行该函数,需要搭配极化码编码算法来使用,完整的项目代码我将会在之后上传至CSDN上。
function polar_info_esti = SC_decoder(llr,K, frozen_bits, lambda_offset, llr_layer_vec, bit_layer_vec)
N = length(llr);%llr refers to channel LLR.
n = log2(N);
P = zeros(N - 1, 1);%channel llr is not include in P.
C = zeros(N - 1, 2);%C stores internal bit values
polar_info_esti = zeros(K, 1);
cnt_K = 1;
for phi = 0 : N - 1switch phicase 0%for decoding u_1index_1 = lambda_offset(n);for beta = 0 : index_1 - 1%use llr vectorP(beta + index_1) = sign(llr(beta + 1)) * sign(llr(beta + 1 + index_1)) * min(abs(llr(beta + 1)), abs(llr(beta + 1 + index_1)));endfor i_layer = n - 2 : -1 : 0%use P vectorindex_1 = lambda_offset(i_layer + 1);index_2 = lambda_offset(i_layer + 2);for beta = index_1 : index_2 - 1P(beta) = sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));endendcase N/2%for deocding u_{N/2 + 1}index_1 = lambda_offset(n);for beta = 0 : index_1 - 1%use llr vector. g function.P(beta + index_1) = (1 - 2 * C(beta + index_1, 1)) * llr(beta + 1) + llr(beta + 1 + index_1);endfor i_layer = n - 2 : -1 : 0%use P vector. f functionindex_1 = lambda_offset(i_layer + 1);index_2 = lambda_offset(i_layer + 2);for beta = index_1 : index_2 - 1P(beta) = sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));endendotherwisellr_layer = llr_layer_vec(phi + 1);index_1 = lambda_offset(llr_layer + 1);index_2 = lambda_offset(llr_layer + 2);for beta = index_1 : index_2 - 1%g function is first implemented.P(beta) = (1 - 2 * C(beta, 1)) * P(beta + index_1) + P(beta + index_2);endfor i_layer = llr_layer - 1 : -1 : 0%then f function is implemented.index_1 = lambda_offset(i_layer + 1);index_2 = lambda_offset(i_layer + 2);for beta = index_1 : index_2 - 1P(beta) = sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));endendendphi_mod_2 = mod(phi, 2);if frozen_bits(phi + 1) == 1%frozen bitC(1, 1 + phi_mod_2) = 0;else%information bitC(1, 1 + phi_mod_2) = P(1) < 0;%store internal bit valuespolar_info_esti(cnt_K) = P(1) < 0;cnt_K = cnt_K + 1;endif phi_mod_2 == 1 && phi ~= N - 1bit_layer = bit_layer_vec(phi + 1);for i_layer = 0 : bit_layer - 1%give values to the 2nd column of Cindex_1 = lambda_offset(i_layer + 1);index_2 = lambda_offset(i_layer + 2);for beta = index_1 : index_2 - 1C(beta + index_1, 2) = mod(C(beta, 1) + C(beta, 2), 2);C(beta + index_2, 2) = C(beta, 2);endendindex_1 = lambda_offset(bit_layer + 1);index_2 = lambda_offset(bit_layer + 2);for beta = index_1 : index_2 - 1%give values to the 1st column of CC(beta + index_1, 1) = mod(C(beta, 1) + C(beta, 2), 2);C(beta + index_2, 1) = C(beta, 2);endend
end
end
当运行完整的项目代码时,将会有如下图所示效果:
5、总结
在本节中,我们主要介绍了极化码三种常见译码算法中的最基础,也是最经典的一种译码算法—串行译码(SC)。这一节有两大难点:
第一点是推导与理解SC译码的数学推导公式,这是该算法的基础,若大家理解并可以自己推导出文中提到的所有公式,相信对你理解后面的内容将十分有帮助。
第二点如何将推导出的公式,应用到实际的译码过程中,长度为2的极化码译码与长度为8的极化码译码,对于其译码过程的理解难度是指数级增长的,但是如果大家跟着我的推导思路走一遍,理解我对每个环节的描述,相信到最后也不会特别的难。
最后,给大家提供了SC译码算法的matlab仿真代码,读者可以根据前面的内容,去理解代码所表示的意思。但是,要运行该代码,还需要结合我的整个系列的文章,才能真正将该极化码编码和译码的过程演示出来。
相信通过本节的学习,大家可以对极化码的SC译码算法过程有一个很直观的理解和认识,在下一节中,我会为各位读者介绍其余的两种极化码译码算法SCL与CA-SCL。
欢迎大家与我进行交流,新人博主写帖子不易,如果你觉得对你有帮助,多多点赞分享关注打赏,给我更多创作动力。祝大家都能有所学,有所获,加油!
闲言:由于去年开始工作后,比较忙碌,一直没有时间和精力去更新这个系列的帖子,停滞了大概半年左右没有更新。近期,有很多读者私信我催更,说我写的内容有帮助到他们理解极化码及其算法是怎么一回事,我十分开心,因为这就是我当初写这个系列的帖子的初衷。非常感谢大家的支持,因此我打算在工作之余忙里偷闲,继续更新这个系列的帖子,争取把这个系列完结,给大家一个交代,希望大家继续给我支持。有任何内容上的问题可以私信或者评论,我看到一定回复。
极化码理论及算法研究5-SC算法及matlab仿真相关推荐
- 暗原色先验图像去雾算法研究_先验算法
暗原色先验图像去雾算法研究 Today we are going to learn about Apriori Algorithm. Before we start with that we need ...
- 永磁同步电机矢量控制的matlab仿真研究,永磁同步电机矢量控制MATLAB仿真研究
科技信息 2012 年 第 3 期SCIENCE & TECHNOLOGY INFORMATION 永磁同步电机矢量控制 MATLAB 仿真研究 彭 超 (重庆邮电大学自动化学院中国重庆 53 ...
- 永磁同步电机矢量控制的matlab仿真研究,永磁同步电机矢量控制MATLAB仿真研究报告.doc...
. .. 永磁同步电机矢量控制的MATLAB仿真研究 永磁同步电机/矢量控制/仿真/模型 1? 引言 ??? 永磁同步电机(PMSM)相对于其它形式的电机有着自身显著的特点:在基速以下不需要励磁电流, ...
- 通过Otsu算法实现条形码的角度矫正matlab仿真
目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 3.1Otsu算法 3.2 条形码角度矫正 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: ...
- 基于Flocking算法的多智能体编队matlab仿真
UP目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 Flocking(有时也称为是warming或herding),拥有4项简单的规则,把它们组合在一起时,为自治主体群给出一个类似于鸟群 ...
- AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真
二站测向定位算法 1.测向原理 如图所示,有基站S1(x1,y1,z1),S2(x2,y2,z2)S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2)S1(x1,y1,z1),S ...
- 【MATLAB教程案例20】关于优化类算法的改进方向探索及matlab仿真对比分析
FPGA教程目录 MATLAB教程目录 目录 1.软件版本 2.以PSO粒子群优化算法为例介绍如何改进各种优化类算法 2.1惯性权重的改进分析和对比
- 基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真
up目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 在PSO中,群中的每个粒子表示为向量.在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本.矢量转换为多维搜索空间中的位置 ...
- 【polar】协作polar码和非协作polar码的误码率性能matlab仿真
1.软件版本 matlab2017b 2.本算法理论知识 <基于Polar码的协作编码和分集技术研究> 3.部分源码 clc; clear all; close all; warning ...
- 基于FXLMS算法有源降噪毕业论文【matlab仿真】
一.论文简介 以超声信号特征为依据,结合小波频段变更降噪法和经验分解降噪法对比分析,根据超声无损检测模型,将不同带宽的噪声加入到需要采集的噪声,运用MATLAB对目标信号进行降噪处理,并对金属材料存在 ...
最新文章
- Linux下C语言的调试--转
- 【机器学习】L1正则化与L2正则化详解及解决过拟合的方法
- yum搭建本地仓库、国内源、下载rpm包、源码安装
- Java中的Type接口和Class类有什么区别
- 计算机硬盘怎么设置ntfs,每次设置系统后,能否更改计算机硬盘分区的fat32和ntfs格式?...
- 当AI遇上云计算,北京 · DevRun 华为云开发者大会
- 【java】java基础之SPI框架实现-整体设计
- oracle sql的正则表达式,Oracle SQL 语句中正则表达式的应用
- 温故而知新 forEach 无法中断(break)的问题
- 单片机代码怎么读懂_单片机要这么学?八条谨记!
- GitHub五万星中文资源:命令行技巧大合集,新老司机各取所需
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
- 因为马云,这也许是他们过得最有意思的腊八节
- window.opener 与 window.dialogArguments的用法
- 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
- Windows密钥备份
- EBS 使用API更新物料属性 Inv_Item_Grp
- Git 推送命令报错
- F和弦(大横按)的训练方法
- APP的包名和签名获取工具