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. 开篇1-内容介绍&参考文献
  2. 概述2-什么是极化码?
  3. 原理3-Arikan原版论文学习总结
  4. 编码算法4-巴氏参数、GA算法以及matlab仿真
  5. 译码算法5-SC算法及matlab仿真
  6. 译码算法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级前两个2
2模块运行f函数;

3、第三步如图所示,第1级第一个22模块运行f函数,判决u1。由于u1是冻结比特,故直接判决为0。

4、第四步如图4所示,第1级第一个2
2模块运行g函数,判决u2。由于u2是冻结比特,直接判决为0。

5、第五步如图所示,第2级前两个22模块运行g函数。

6、第六步如图所示,第1级第2个2
2模块运行f函数,判决u3。由于u3是冻结比特,直接判决为0。

7、第七步如图所示,第1级第2个22模块运行g函数,判决u4。由于u4是信息比特,其L值为-3.5,小于零,故判决u4=1。

8、第八步如图所示,第3级所有2
2模块运行g函数

9、第九步如图所示,第2级下两个22模块运行f函数。

10、第十步如图所示,第1级第3个2
2模块运行f函数,判决u5。由于u5是冻结比特,故直接将其判决为0。

11、第十一步如图所示,第1级第3个模块运行g函数,判决u6。由于u6是信息比特,其对应的LLR值小于0,故判决u6=1。

12、第十二步如图所示,第2级下两个22模块运行g函数。

13、第十三步如图所示,第1级第4个2
2模块运行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_22​⁡N+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仿真相关推荐

  1. 暗原色先验图像去雾算法研究_先验算法

    暗原色先验图像去雾算法研究 Today we are going to learn about Apriori Algorithm. Before we start with that we need ...

  2. 永磁同步电机矢量控制的matlab仿真研究,永磁同步电机矢量控制MATLAB仿真研究

    科技信息 2012 年 第 3 期SCIENCE & TECHNOLOGY INFORMATION 永磁同步电机矢量控制 MATLAB 仿真研究 彭 超 (重庆邮电大学自动化学院中国重庆 53 ...

  3. 永磁同步电机矢量控制的matlab仿真研究,永磁同步电机矢量控制MATLAB仿真研究报告.doc...

    . .. 永磁同步电机矢量控制的MATLAB仿真研究 永磁同步电机/矢量控制/仿真/模型 1? 引言 ??? 永磁同步电机(PMSM)相对于其它形式的电机有着自身显著的特点:在基速以下不需要励磁电流, ...

  4. 通过Otsu算法实现条形码的角度矫正matlab仿真

    目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 3.1Otsu算法 3.2 条形码角度矫正 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: ​ ...

  5. 基于Flocking算法的多智能体编队matlab仿真

    UP目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 Flocking(有时也称为是warming或herding),拥有4项简单的规则,把它们组合在一起时,为自治主体群给出一个类似于鸟群 ...

  6. 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 ...

  7. 【MATLAB教程案例20】关于优化类算法的改进方向探索及matlab仿真对比分析

    FPGA教程目录 MATLAB教程目录 目录 1.软件版本 2.以PSO粒子群优化算法为例介绍如何改进各种优化类算法 2.1惯性权重的改进分析和对比

  8. 基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真

    up目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 在PSO中,群中的每个粒子表示为向量.在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本.矢量转换为多维搜索空间中的位置 ...

  9. 【polar】协作polar码和非协作polar码的误码率性能matlab仿真

    1.软件版本 matlab2017b 2.本算法理论知识 <基于Polar码的协作编码和分集技术研究> 3.部分源码 clc; clear all; close all; warning ...

  10. 基于FXLMS算法有源降噪毕业论文【matlab仿真】

    一.论文简介 以超声信号特征为依据,结合小波频段变更降噪法和经验分解降噪法对比分析,根据超声无损检测模型,将不同带宽的噪声加入到需要采集的噪声,运用MATLAB对目标信号进行降噪处理,并对金属材料存在 ...

最新文章

  1. Linux下C语言的调试--转
  2. 【机器学习】L1正则化与L2正则化详解及解决过拟合的方法
  3. yum搭建本地仓库、国内源、下载rpm包、源码安装
  4. Java中的Type接口和Class类有什么区别
  5. 计算机硬盘怎么设置ntfs,每次设置系统后,能否更改计算机硬盘分区的fat32和ntfs格式?...
  6. 当AI遇上云计算,北京 · DevRun 华为云开发者大会
  7. 【java】java基础之SPI框架实现-整体设计
  8. oracle sql的正则表达式,Oracle SQL 语句中正则表达式的应用
  9. 温故而知新 forEach 无法中断(break)的问题
  10. 单片机代码怎么读懂_单片机要这么学?八条谨记!
  11. GitHub五万星中文资源:命令行技巧大合集,新老司机各取所需
  12. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
  13. 因为马云,这也许是他们过得最有意思的腊八节
  14. window.opener 与 window.dialogArguments的用法
  15. 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
  16. Windows密钥备份
  17. EBS 使用API更新物料属性 Inv_Item_Grp
  18. Git 推送命令报错
  19. F和弦(大横按)的训练方法
  20. APP的包名和签名获取工具

热门文章

  1. 《Windows核心编程系列》十异步IO之IO完成端口
  2. 《算法分析》——布线问题
  3. 数字化营销怎么做?如何做好数字化营销?
  4. 全国31个省市2001-2017年平均受教育年限学习数据集
  5. 《完全写作指南》晨读笔记
  6. html中css的注释怎么写,html注释和css、js注释的写法,使用场景以及性能优化问题...
  7. VM options
  8. 仿支付宝手势密码解锁
  9. 如何卸载 think-cell?丨卸载教程丨卸载办法
  10. python时间序列分析——基于混沌和数据分形理论的特征构建