写写Matlab的Turbo仿真实现吧

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/feifei884431/article/details/51438983

信道编码作用就是针对无线传输环境下复杂多变的信道条件,采取的一种提高发送数据正确率的典型方法。比如对于传输的信息比特序列(例如x=[1 1 0 1 0 1 1 0]是一个长度为8的序列),如果直接经过无线信道,由于各种干扰的存在,接收到的序列y可能出现差错变为了y=[1 1 0 1 1 1 1 0]。其中第五位出现了偏差由0变为了1产生错误。信道编码的职责就是按照某种数学规律在发送数据之后添加一定的校验位比特(例如c=[1 1 0 0])使得发送的数据变为信息比特x和校验比特c的某种组合方式(例如最直接的就是级联的方式s=[x c]=[1 1 0 1 0 1 1 0 1 1 0 0])。此时发送的数据变为s。此时经过无线信道,受干扰影响接收到的数据y'是y'=[1 1 0 1 1 1 1 0 1 1 0 0],不过由于比特流之间满足特定的数学规律,可以纠正这一个错误,恢复出原始发送数据s=[1 1 0 1 0 1 1 0 1 1 0 0],进而提高了数据传输的可靠性。这种措施是针对信道条件的影响采取的编码方式来提高传输可靠性【1】,信道编码由此得名。

Turbo编码属于信道编码的一种,而且是一种性能极好的方案。这个“好”在通信系统中具体体现在具有很好的传输可靠性以及可以接受的实现复杂度。(Bit Error Rate,BER)就是很好的可靠性衡量准则,比方我发送100个比特,其中错了18个比特,那么此时的BER=18%。实现复杂度的问题也可以主观感受一下,我设计一个特别复杂的编码方案,接收端对收到的数据进行对应的复杂的操作,这虽然能带来BER的提升,但是花费的开销太大,实际应用中实用性不高。Turbo编码的BER特性是现有所有信道编码中数一数二的,又具有适度的实现复杂度,因此说Turbo是一种好码。


写着写着就写多了,这篇文章主要是写一下Turbo的编译码思路以及Matlab的仿真实现(译码的话公式没看懂)。

编码器:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/73/0A/wKioL1XyniLwA0tVAABV9uaKhY4241.jpg" title="Enc.png" alt="wKioL1XyniLwA0tVAABV9uaKhY4241.jpg" />

            图-1Turbo码编码器结构

    从图中可以看出Turbo码编码器由两个递归系统卷积码编码器(RSC)和一个交织器(Interleaver)以及一个打空器(Puncturer)组成。和普通的卷积码编码器不同的是,递归系统卷积码编码器有一个反馈支路,同时它有一输出信号就是原始的输入信息。RSC的具体的结构如图-2所示。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/73/0D/wKiom1XynEHQdgByAABN1iDNIvM260.jpg" title="Enc2.png" alt="wKiom1XynEHQdgByAABN1iDNIvM260.jpg" />

            图-2RSC编码器结构

没有打孔的Turbo码编码器的码率是1/3,实际中,常常采用变码率的Turbo码,这时就需要进行打孔操作,从图-1中可以看出,打孔针对的是两个RSC编码器产生的校验比特,原始的信息比特是不参加打孔操作的。

假设RSC编码器的寄存器的个数为:m

输入Turbo编码器的信息记为:Infor

编码的具体流程为:将输入Turbo码编码器的信息(infor)m个尾比特(tail1)输入进第一个RSC编码器进行编码,加m个尾比特的目的是将第一个RSC编码器的最终状态回归到零状态,输出为parity1。将输入Turbo码编码器的原始信息(infor)进行交织,将交织后的信息再加m个尾比特(tail2)输入进第二个RSC编码器进行编码,加m个尾比特的目的是将第二个RSC编码器的最终状态回归到零状态,输出为parity2parity1parity2的长度相等,都是输入信息的长度加上m。假如想得到不同码率的Turbo码,可以对两路校验信息进行打孔,如不进行打孔操作,则Turbo码编码器的输出即为:infor+tail1+tail2+parity1+parity2


译码器:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/73/0A/wKioL1XynkGiVCPIAABXFNLPLwg483.jpg" title="Dec.png" alt="wKioL1XynkGiVCPIAABXFNLPLwg483.jpg" />

            图-3 Turbo码译码器(MAP)

从图-3中可以看出,Turbo码译码器(MAP)由两个MAP译码器和两个交织器,一个解交织器组成。其中MAP Decoder 1MAP Decoder 2分别针对Turbo码编码器的RSC 1RSC2进行译码操作。由于输入到第二个RSC编码器的信息经过了交织的过程,因此,接收到的系统信息在输入到MAP Decoder 2之前,先要进行交织的操作。解交织器和另一个交织器的功能类似,在此不再说明。

译码的流程从图-3中可以很明显的看出来:将原始信息,由第一个RSC编码器产生的第一路校验信息,第二个MAP译码器产生的相对于第一个MAP译码器而言的先验信息(第一次初始化为零)经过解交织后联合输入进第一个MAP译码器进行译码进行译码;将第一个MAP译码器输出的相对于第二个MAP译码器的先验信息经过交织,原始的信息经过交织,第二路校验信息联合输入进第二个MAP译码器进行译码,这时,第二个MAP译码器输出的便是相对于第一个MAP译码器而言的先验信息,完成了一次迭代。可以根据实际的需要,设定译码的迭代次数,一般情况下,随着迭代次数的增加,译码器的性能会增加,但是,当迭代次数增加到一定的程度以后,译码器增加的性能就已经很小了,实际中,迭代次数一般选8

Turbo码大体的编解码思路就说这么多,具体的Matlab程序网上流行的一个WuYufei大神的版本,可以从这里获得链接: http://pan.baidu.com/s/1jG1twhC 密码: w9qe。


这里发现的问题是,Wu的程序是AWGN信道下BPSK调制方式的,调制阶数比较低,从提高传输有效性的角度上需要高阶调制(比如之前的BPSK调制,1就代表比特1,-1就代表比特0,高阶的调制例如QPSK,s1代表00,s2代表01,s3代表10,s4代表11),这样同样传输s1~s4中的一个符号,就可以表示两个比特的数据,速率提升了一倍,同样带来的结果是传输可靠性会有所下降(因为s1~s4之间的区分度不如1、-1之间的区分的好,即更容易互相混淆)但是在可容忍的可靠性下降范围内采用QPSK调制确实提高了传输有效性。所以我需要做的就是在Wu的程序基础上加入调制的步骤。

Turbo编码不需要适配,假设产生了信息比特有100个,经过Turbo编码(码率1/3)那得到的数据比特为300,对这300个比特进行QPSK调制即可,调制完的符号经过AWGN信道叠加噪声时需要注意噪声功率,原本的噪声幅度为sigma,那么加到QPSK符号上的噪声幅度需要变为sigma/sqrt(2)。

Turbo译码器的输入需要提供每一个比特的软信息(符号置信度),所以经过AWGN信道的接收数据y,需要①先进行软解调【2】处理,②将QPSK调制软解调的符号级软信息映射为比特级软信息作为Turbo的输入。

软解调主要根据公式650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/73/0E/wKiom1XyzRawGGYxAABqQTPuTHQ576.jpg" title="软解调1.png" width="250" height="140" border="0" hspace="0" vspace="0" style="width:250px;height:140px;" alt="wKiom1XyzRawGGYxAABqQTPuTHQ576.jpg" />

实际应用中由于在高信噪比的条件下r被判决为s1~s4中某一个的可能性会很有压倒性,另外的三种可能较小,所以导致LLR的计算过程中会出现NaN或Inf之类的结果。所以实际应用中采用更简化的方案:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/73/0B/wKioL1Xyz_byGD-pAACO5YGqH9s766.jpg" title="软解调2.png" width="300" height="96" border="0" hspace="0" vspace="0" style="width:300px;height:96px;" alt="wKioL1Xyz_byGD-pAACO5YGqH9s766.jpg" />采用这个方案不会出现上述NaN,Inf之类的问题。

附上我做的高阶(QPSK)调制有/无Turbo编码的BER-SNR曲线~

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/73/85/wKiom1YABUmQS-QaAAKtE80GIJI982.jpg" title="SNR-BER.png" alt="wKiom1YABUmQS-QaAAKtE80GIJI982.jpg" />

总结一下的话,主要就是介绍了Turbo编码的思想以及应用于高阶调制的Matlab仿真需要注意的问题。


【1】通信系统主要是解决三个问题:可靠性、有效性、安全性。其中可靠性和有效性是一种矛盾关系,一方面希望我发送一点儿消息(比如一个数字1,接收端可以理解出大量的信息(比如a“我爱北京天安门,天安门上太阳升”);另一方面我又希望我发送的数据可以被接收方正确的理解(即a就是代表那句歌词)。显然消息蕴含的信息时有限的(比如数字1如果规定代表歌词的话,那么真的需要传输数字“1”的信息的时候需要找别的信息来代替)而且传输过程中会发生损失(比如发送数字1,却接受到了数字7,那么收端肯定无法正确理解发端的意思)这对于传输可靠性来说是一个消极因素。这时需要发端进行适当的操作来提高发送数据的准确性,即如前文所述的信道编码,与信道编码类似的提高可靠性的操作会引起信息的冗余,这对于传输有效性来说是一个消极因素。因而通信系统需要在有效性和可靠性之间取得适当的折中。第三个安全性就顾名思义了,我希望我传输的数据只有我和接受的人收到,其他的人收到也是无用的信息,这涉及到一些抗干扰相关的技术,小编研究不深。

【2】软解调,相对应的就有硬解调。

先说硬解调,还记得我们为了提高传输有效性在每次发送信息的时候发的是s1~s4之中的一个嘛,现在假设s1=-1-1i,s2=-1+1i,s3=1-1i,s4=1+1i。那s1~s4可以画成如下的星座图。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/73/0E/wKiom1XyyR-zRIvFAAEvwOd3QA0188.jpg" title="星座1.png" alt="wKiom1XyyR-zRIvFAAEvwOd3QA0188.jpg" />

经过无线信道的各种干扰影响之后,接收到信号r可能位于这个位置,如下图

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/73/0B/wKioL1Xyy-bBFbilAAFicjUyhuw093.jpg" title="星座2.png" alt="wKioL1Xyy-bBFbilAAFicjUyhuw093.jpg" />

那么究竟应该将接收信号r判别成s1~s4中哪一种呢?硬解调给出的方案就是计算一下r到s1~s4之间的各个距离d1~d4,取距离最近的那一个作为判决结果。这么做是有原因的,因为影响因素服从0均值的高斯分布,所以噪声影响从s1(-1,-1i)的位置变到了r所在的位置的概率毕竟是小的,所以优先判决为距离更近的点。这么做比较简单,但是给人一种生硬的感觉,突出一个“强行”,硬判决由此得名。经过应判决我们得知的只有被判决成的符号是s1~s4中的哪一个,并不知道r究竟与判决结果的偏移程度有多大,这是一部分信息损失,我们希望能补偿回来。

再说一下软解调,软解调在判决的时候,并不是生硬的给出r判决为s1~s4的哪一个,而是给出发送s1~s4,收端收到r的这四种情况各自发生的概率p(r|s1)~p(r|s4)(这个概率又称为软信息)。残忍的判决工作软解调并不做,只是把各种概率作为输出,这样的话硬解调损失的r与判决结果的偏移/相似程度就得意保留,没有信息损失。而这个软信息正好可以天然的用于类似于Turbo译码器这种需要软信息的译码操作。

展开阅读全文

没有更多推荐了,返回首页