极化码的matlab仿真(2)——编码
第二篇我们来介绍一下极化码的编码。
首先为了方便进行编码,我们需要进行数组的定义
signal = randi([0,1],1,ST); %信息位比特,随机二进制数
frozen = zeros(1,FT); %固定位比特,规定全为0
encode = zeros(1,N * block); %编码后的比特
noise = snr(i) ^ 1/2 * randn(1,N * block); %加性高斯白噪声
极化码的编码重点在于生成矩阵的产生,以及信息位、冻结位的选取。
- 我们先来看生成矩阵的产生。

这是Arikan论文中的编码示意图,好像挺复杂,不过看不懂也没关系。我们来看一下编码过程中都做了哪些事。
首先是向量元素的翻转,通过翻转矩阵RN来实现,然后是信道的联合和信道的分裂。
什么?你问我为什么要这样做?我也不知道,极化码本身就建立在信道极化的现象之上,信道极化就是信道以特定方式联合和分裂所产生的现象。要想问为什么这么做,到土耳其找Arikan教授喝茶去吧。
论文中将这个翻转过程简化为矩阵运算,这就为我们进行程序仿真提供了方便:

其中:

BN 为排序矩阵,以N=8为例,解释它的作用:

传化过程为:%将向量下标减一后,转化为二进制数%----%将得到的二进制数反序排列%----%将反序后的二进制数转化为十进制数,加一%
例:

我们通过 BN 的递推式可以求得 BN,再将其与 F 的 n 次克劳尼克积相乘,就能够得到生成矩阵。
这样说你明白了吗?什么?没有???
不错,说明你是个正常人。实际编码的时候,如果真的在matlab中将上述过程模拟一遍来求生成矩阵的话,是非常耗时耗力的。我们还有另外一条路可以走——找规律。

上式为 GN 的原始求解方法,其中 I 为单位矩阵,F 定义为[1 0; 1 1],RN 为翻转矩阵,对于
,有:
N=4:

N=8:

可以发现 A 的元素排列十分有规律。前 N/2 列元素总是奇偶成对出现“1”,后 N/2 元素仅出现在偶数位,且与同处在一行的前一个“1”保持固定距离。根据此规律编写程序如下:
for i = 1 : N/2
A(2 * i - 1, i) = 1;
A(2 * i, i) = 1;
A(2 * i, N / 2 + i) = 1;
end
递归部分:
G = A * kron(eye(2),Gpre); %Gpre即上一层递归所得生成矩阵
Gpre = G;
如果将生成矩阵的产生编写为一个函数,则代码如下:
function GN = G(n)
N = 2 ^ n;
Gpre = 1;
for i=1:n %每一层递归都相当于计算一个新的生成矩阵
Ni = 2 ^ i; %这个新的生成矩阵的维度为 Ni/2
G = zeros(Ni);
%Fn = zeros(Ni);
A = zeros(Ni);
for j = 1 : Ni / 2
A(2 * j - 1 , j) = 1;
A(2 * j , j) = 1;
A(2 * j , Ni / 2 + j) = 1;
end
G = A*kron(eye(2),Gpre);
Gpre = G;
end
GN = G;
end
- 其次,来看信息位与冻结位的选取
信道极化过程中,有一部分信道的信道容量 I(W) 可以到达1,另一部分则趋近于0。信道容量反映了信道无失真传输的最大信息率,我们可以通过计算联合、分裂后各信道的信道容量并对它们进行排序,然后根据码率,选择排序靠前的信道作为信息传输的信道,剩余的信道用来传输冻结位。
另一种方法是计算巴氏参数Z(W),对于一个给定信道,巴氏参数越大说明该信道越不可靠。因此我们只需计算出联合、分裂后信道的巴氏参数,并对它们进行排序,然后根据码率选择巴氏参数较小的信道作为信息位,剩余信道作为冻结位。Arikan论文中给出了巴氏参数的递归求解办法,这使得我们能够很方便的通过matlab实现信息位的选取。

% 将巴氏参数计算过程封装在函数B_para之中方便调用,Z为数组,作为实参传递进来。数组中只有第一个元素。
% Z第一个元素可以通过计算得到,计算公式为Z(1) = 2*(p*(1-p))^0.5;
function y = B_para(Z)
for i = 1 : log2(N) %迭代次数,N为码长
Z_pre = Z; %z_pre为上一层信道巴氏参数
for j = 1 : 2^(i-1) %本层运算使用的下标
Z(2*j-1) = 2*Z_pre(j) - Z_pre(j)^2;
Z(2*j) = Z_pre(j)^2; %递推公式
end
end
y = z; % y作为实参从函数中传递出去,y就是最终的巴氏参数
得到巴氏参数序列后,下面的操作就是将此序列进行排序,并根据码率确定信息位和固定位。
[Z_in_order,index] = sort( y ); %将巴氏参数从小到大排列
signal_index = sort( index( 1:S ) ); %前S位作为信息位
frozen_index = sort( index( s+1:end ) ); %后面的作为冻结位
得到了生成矩阵,确定了信息位冻结位,下面要做的就是进行编码。
for j=1:block %对每一个码块都要进行编码处理
encoded(1,((j-1)*N+1):(j*N)) = signal(((j-1)*S+1):(j*S))*G(signal_index,:) + frozen(((j-1)*F+1):(j*F))*G(frozen_index,:);
end %进行编码
encode = mod(encode,2); %对2取模
encode = 2 * encode - 1; %符号化
encode = encode + noise; %叠加噪声
数组 encode 就是我们得到的编码矩阵。
编码matlab实现就是这样,为了照顾和知识点讲解同步,各个部分代码并未进行完整、严谨的书写。本系列最后我会整合与各章节中分散的代码,为大家带来可运行的代码,并将M文件附在文后。敬请期待。
下一节我们要探讨的是polar code中非常重要的译码部分——连续消除译码(SC译码)。
极化码的matlab仿真(2)——编码的更多相关文章
- 极化码的matlab仿真(4)——SC译码(2)
================================================ 首先自作多情的说一句--"抱歉!" 古语"有志者.事竟成",是 ...
- 极化码的matlab仿真(3)——SC译码(1)
一个好码必须具备两个要素:可靠.高效. 高效的码要求码的编译方案都具有较低的复杂度.极化码出现后,Arikan本人提出使用SC译码方案来进行译码操作.SC全称successive cancellati ...
- 极化码的matlab仿真(1)——参数设置
根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...
- OFDM通信系统的MATLAB仿真(1)
由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...
- 极化码之tal-vardy算法(1)
继前两节我们分别探讨了极化码的编码,以及深入到高斯信道探讨高斯近似法之后,我们来关注一个非常重要的极化码构造算法.这个算法并没有一个明确的名词,因此我们以两位发明者的名字将其命名为“Tal-Vardy ...
- OFDM通信系统的MATLAB仿真(2)
关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...
- 经典功率谱估计及Matlab仿真
原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...
- MATLAB仿真总结
MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事.记录下自己犯错的点点滴滴,并引以为戒.使用MATLAB版本为2014a,以下内容如有不当还请指正. 1. 仿真开始前清理工 ...
- 极化码之tal-vardy算法(2)
上一节我们了解了tal-vardy算法的大致原理,对所要研究的二元输入无记忆对称信道进行了介绍,并着重介绍了能够避免输出爆炸灾难的合并操作,这一节我们来关注信道弱化与强化操作. [1]<Chan ...
随机推荐
- 关于vue组件的一个小结
用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- 切糕[HNOI2013]
经过千辛万苦小A 得到了一块切糕,切糕的形状是长方体,小A 打算拦腰将切糕切成两半分给小B.出于美观考虑,小A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案. 出于简便考虑, ...
- python 集合 set
集合 set:可变集合与不可变集合 可变集合:可以向集合中添加删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素. 把不同的元素组成一起形成集合,集合不记录元素的位置或者插入点,也就是不能 ...
- AWK求和、平均值、最值
--AWK求和.平均值.最值------------------------2014/02/14 打包当前目录下的所有文件 ls | awk '{ print "tar zcvf &quo ...
- @font-face 使用过程
格式: TureTpe(.ttf)格式: .ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有[IE9+,Firefox3.5+,Chr ...
- 【算法与数据结构】Java实现字符串的全排列及组合
注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ...
- iOS9中关于 NSURLSession/NSURLConnection HTTP load failed 的解决办法
最近为了新的存管app上线,忙了近一个月,重新过了一段996的日子,今天终于可以喘口气,继续更新博客了.本文记录一下在iOS 9中发送https请求遇到的问题及解决办法,希望通过本文,可以对ATS的配 ...
- Go语言数组的使用
Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...
- noip普及组2004 火星人
火星人 描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类 ...