搜档网
当前位置:搜档网 › 动态规划:卷积码的Viterbi译码算法

动态规划:卷积码的Viterbi译码算法

动态规划:卷积码的Viterbi译码算法
动态规划:卷积码的Viterbi译码算法

动态规划:卷积码的Viterbi译码算法

学院:网研院?姓名:xxx 学号:xxx一、动态规划原理

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。

动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。

二、卷积码的Viterbi译码算法简介

在介绍维特比译码算法之前,首先了解一下卷积码编码,它常常与维特比译码结合使用。(2,1,3)卷积码编码器是最常见的卷积码编码器,在本次实验中也使用了(2,1,3)卷积码编码器,下面介绍它的原理。

(2,1,3)卷积码是把信源输出的信息序列,以1个码元为一段,通过编码器输出长为2的一段码段。该码段的值不仅与当前输入码元有关,而且也与其之前的2个输入码元有关。如下图所示,输出out1是输入、第一个编码器存储的值和第二个编码器存储的值逻辑加操作的结果,输出out2是输入和第二个编码器存储的值逻辑加操作的结果。

(2,1,3)卷积码编码器

(2,1,3)卷积码编码器的状态转移图如下所示,圆圈中的数字表示当前编码器中的状态,箭头指向下一个可能的状态,箭头边上的数字是状态转移对应的输出out1、out2。

(2,1,3)卷积码编码器状态转移图

维特比译码中使用了汉明距离的概念,下面了解一下汉明距离的原理。汉明距离是两个等长字符串对应位置的字符不同的个数,如0 1 1 0 0 1 0 0

和0 0 1 1 1 0 0 0的汉明距离是4。

维比特译码的基本思想是把接收到的矢量,和网格图上诸种可能的路径比较,删去距离大的路径,保留距离小的路径,以距离最小路径作为发码的估值。如输入信息比特1 0 0 1,则(2,1,3)卷积码编码器输出的信息比特是1 1 1 0 1 1 1 1,假设经过信道干扰后接收到的信息比特是1 1 0 0 1 1 1 1,则维特比译码过程是:

1.从T0时刻的全零状态开始,零状态初始度量(汉明距离)为0,其它状

态初始度量为正无穷;

2.在任一时刻t向t+1时刻前进,对每一个状态只记录到达路径中度量最

小的一个(残留路径)及其度量;

3.前进过程中,对t时刻的每个状态作延伸,即在状态度量基础上加上分

支度量,得到8条路径;

4.在t+1时刻,对到达每一个状态的2条路径进行比较,找到一个度量

最小的作为残留路径;

5.直到码的终点,如果终点是一个确定状态,则最终保留的路径就是译码

结果。

维特比译码算法执行过程

三、卷积码的Viterbi译码算法

1.算法

●输入比特流个数、比特流和有噪信道的误码率(0~1);

●对比特流数据进行补0操作(在比特流的最后编码器中仍保存着2

个之前输入比特的状态,因此需要进行补0操作,即给输入比特流加

上2个0比特);

●对补0后的比特流进行(2,1,3)卷积码编码操作,编码输出的第一

个结果是输入、第一个编码器存储的值和第二个编码器存储的值逻

辑加操作的结果,第二个结果是输入和第二个编码器存储的值逻辑

加操作的结果;

●对(2,1,3)卷积码编码输出的数据进行传输(加上误码);

●对从信道得到的有误码的比特流进行维特比译码:

?对比特流进行分组,2个一组循环;

?根据这2个比特对当前的4个状态(StateNode)计算从它出发到它可能到达的2个状态对应路径的汉明距离,并保存对应的

译码序列和汉明距离;

?根据上一步的结果,取汉明距离小的更新这4个状态;

?最后,第1个状态(0状态)对应的译码序列就是维特比译码的结果(因为补零操作保证了最后肯定会回到0状态)。

2.算法复杂度

假设输入比特流序列的长度为L。由于(2,1,3)卷积码的状态数是4,对每个时刻要做4次“加-比-选”操作得到4个状态的残留路径,每次“加-比-选”操作包括2次加法和1次比较,因此总运算量约为4L次“加-比-选”操作。同时要能保存4条残留路径,因此需要4L个存贮单元。由此可见,(2,1,3)卷积码的维特比译码算法的时间和空间复杂度均与比特流序列长度呈线性关系,但维特比译码算法的时间空间复杂度与卷积码的约束长度呈指数关系。

3.可能的改进

由于维特比译码算法的时间空间复杂度与卷积码的约束长度呈指数关系,因此对状态数很大的卷积码编码,维特比算法要经一定的修正后才可能实用,常用的算法是缩减状态的维特比译码,即在每一时刻,只处理部分的状态。

四、算法实现框架

本次实验使用的语言是java,具体的算法实现包含4个类:ViterbiDecode、StateNode、ConvEncode和Channel。

ViterbiDecode类用于实现维特比译码,它有一个静态的decode()方法用于译码和一个静态的hammingDistance()方法用于计算汉明距离,ViterbiDecode的main方法是程序的入口;

StateNode是一个实体类,它用于保存状态,有value(状态,如“00”)、distance(汉明距离)和solution(对应译码序列)属性;

ConvEncode类用于实现(2,1,3)卷积码编码,它只有一个静态的encode()方法用于编码和一个静态的addZero()方法用于补0操作;

Channel类用于模拟有噪信道,它只有一个静态的transfer()方法用于给比特流序列加上误码。

五、总结

本科的时候曾经学习过卷积码编码和维特比译码的知识,考研的时候也复习了该方面知识,在理解题目上没有遇到困难。但由于从未尝试编程实现维特比译码,因此在本次实验的过程中还是遇到了许多问题。经过查看课件及网上查找资料,我对如何编码实现卷积码的维特比译码算法有了一个较好的理解,知道了算法主要应该包括补0、卷积编码、信道传输和维特比译码4步操作,并使用了ja va语言自主完成了该实验。由于该实验完成的比较仓促,程序中仍有许多地方能进行优化,但总的来说,通过本次试验,我对维特比译码有了一个直观的理解,同时锻炼了使用java语言编程的能力,有不小的收获。

附录

程序运行示例:

源程序:

import java.util.Random;

import java.util.Scanner;

publicclass ViterbiDecode{

publicstatic byte[] decode(byte[] inBytes) {

StateNode[] stateNodes = new StateNode[4];

StateNode[]tmpNodes = new StateNode[4];

stateNodes[0] = newStateNode("00", 0, "");

??for (int i = 0;i< inBytes.length - 4; i = i + 2) {

byte[] twoBytes = { inBytes[i], inBytes[i + 1] };

?for (int j = 0; j < stateNodes.length; j++) {

??if (stateNodes[j] != null) {

???String value = stateNodes[j].value;

???byte[] byteValue = {

???Byte.parseByte(value.substring(0,

??????value.length() - 1)),

????Byte.parseByte(value.substring(value.length()-1)) };

??byte[][] possibleNextValue = {{0, byteValue[0] },

???{ 1, byteValue[0] } };

???// String[] possibleNextOutput ={};

???byte[][] possibleNextOutput = {

?????{

???(byte) ((byteValue[0] +byteValue[1] + possib leNextValue[0][0]) % 2),

??(byte) ((byteValue[1] + possibleNextValue[0][0]) % 2) },

????{

????(byte) ((byteValue[0] + byteValue[1] + possibleNextVa lue[1][0]) % 2),

????(byte) ((byteValue[1] + possibleNextValue[1][0]) % 2) } };

???int[] distances ={

???stateNodes[j].distance

??????+ViterbiDecode.hammingDistance(twoBytes,

????possibleNextOutput[0]),

???stateNodes[j].distance

???+ ViterbiDecode.hammingDistance(twoBytes,

???possibleNextOutput[1]) };

????for (int k = 0; k < possibleNextValue.length; k++) {

??byte[] next = possibleNextValue[k];

????StateNode tmpNode = tmpNodes[next[1] + 2 * next[0]];

????if (tmpNode != null) {

??int d = tmpNode.distance;

????if (distances[k]< d){

????tmpNode.distance =distances[k];

?????tmpNode.solution = stateNodes[j].solution

????+possibleNextValue[k][0];

???}

???} else {

????tmpNodes[next[1] + 2 * next[0]] = new StateNode(

??????next[0] + ""+ next[1], distances[k],

?????stateNodes[j].solution

????????+ possibleNextValue[k][0]);

?????}

???}

??}

?}

?for (int m = 0; m < tmpNodes.length; m++) {

?stateNodes[m] = tmpNodes[m];

???tmpNodes[m] = null;

?}

?for (int i = inBytes.length - 4; i < inBytes.length; i = i+2) { ??byte[] twoBytes = { inBytes[i], inBytes[i+ 1] };

?for (int j = 0; j < stateNodes.length; j++) {

if (stateNodes[j] != null) {

?String value = stateNodes[j].value;

???byte[] byteValue = {

?????Byte.parseByte(value.substring(0,

???value.length() - 1)),

????Byte.parseByte(value.substring(value.length() - 1)) }; ????byte[] possibleNextValue = { 0, byteValue[0] };

??byte[]possibleNextOutput = {

?????(byte) ((byteValue[0] + byteValue[1]) % 2),

????(byte) ((byteValue[1]) % 2) };

????int distance =stateNodes[j].distance

????+ViterbiDecode.hammingDistance(twoBytes,

?????possibleNextOutput);

????StateNodetmpNode = tmpNodes[possibleNextValue[1]+2

???* possibleNextValue[0]];

??if (tmpNode!= null) {

????int d = tmpNode.distance;

????if (distance < d) {

?tmpNode.distance = distance;

???tmpNode.solution = stateNodes[j].solution

????+ possibleNextValue[0];

???}

???} else {

???tmpNodes[possibleNextValue[1]+2

???* possibleNextValue[0]] = new StateNode( ???possibleNextValue[0] + ""

????+ possibleNextValue[1], distance,

????stateNodes[j].solution + possibleNextValue[0]);

????}

}

?}

?for(int m = 0;m <tmpNodes.length; m++) {

???stateNodes[m] = tmpNodes[m];

?tmpNodes[m] = null;

?}

?}

byte[] outBytes =newbyte[stateNodes[0].solution.length()];

??for (int i = 0; i < outBytes.length; i++) {

??outBytes[i] = Byte.parseByte(stateNodes[0].solution.substring(i,

????i + 1));

}

??return outBytes;

}

?// a和b都是0 1,且a b等长

?public static int hammingDistance(byte[] a, byte[] b) {

?int distance =0;

??for (int i = 0; i < a.length; i++) {

??if (a[i] != b[i])

?distance++;

?}

?return distance;

?}

?publicstatic void main(String[]args) {

?// 输入参数

?Scanner in=newScanner(System.in);

??while (true) {

???System.out

??.println("********模拟实现比特流的(2,1,3)卷积编码->经过有噪信道->维特比译码********");

?System.out.println("请输入比特流的长度并回车:");

int n = in.nextInt();

???System.out.println("请输入比特流(0或者1,空格隔开)并回车:");

??byte[] a = new byte[n];

?for (int i = 0; i < a.length; i++) {

??a[i] = in.nextByte();

}

???System.out.println("请输入有噪信道误码率(0~1)并回车:");

???double r= in.nextDouble();

??//记录信道传输造成的误码个数err1和维特比译码还原结果的误码个数err2

??int err1 = 0;

?int err2 = 0;

?// 输出原始比特流数据

???System.out.println("原始比特流数据:");

??for (int i = 0; i < a.length; i++) {

??System.out.print(a[i] + "");

?}

System.out.println("");

???// 输出卷及编码结果

???System.out.println("经过(2,1,3)卷积编码后的比特流数据:");

??byte[] b = ConvEncode.encode(a);

?for (int i = 0; i < b.length; i++) {

?System.out.print(b[i] + " ");

}

??System.out.println("");

???// 输出信道传输结果

System.out.println("经过误码率为" + r + "的有噪信道后的比特流数据:");

byte[] c= Channel.transfer(b, r);

??for (int i = 0;i < c.length; i++) {

?System.out.print(c[i] + " ");

?if(c[i] != b[i]) {

?????err1++;

??}

?}

???System.out.println("");

??//输出有噪信道造成的误码个数

?System.out.println("经过有噪信道后造成的误码个数是" + err1);

?//输出维特比译码结果

System.out.println("经过维特比译码还原的比特流数据:");

?byte[] d = ViterbiDecode.decode(c);

?for (int i=0; i < d.length - 2; i++) {

??System.out.print(d[i] + " ");

?if(d[i] != a[i]) {

?err2++;

??}

}

?System.out.println("");

?//输出维特比译码还原结果的误码个数

?System.out.println("经过维特比译码还原后,与原始比特流数据相比的误码个数是" + err2);

??System.out.println("");

?}

?}

}

class StateNode {

String value;

?int distance;

String solution;

public StateNode(String value, int distance, String solution) {

?this.value = value;

??this.distance = distance;

?this.solution = solution;

}

}

// 模拟实现(2,1,3)卷积码

class ConvEncode {

?// 输入只能是0 1,编码器的顺序是输入->s1->s2->丢弃

public staticbyte[] encode(byte[] inBytes) {

?byte[] actualBytes = ConvEncode.addZero(inBytes);

?byte[] outBytes= new byte[2 * actualBytes.length];

?bytes1 = 0;

??byte s2 =0;

?for (inti=0; i < actualBytes.length; i++){

??outBytes[2 * i] = (byte) ((s1 + s2 +actualBytes[i]) % 2 == 0 ? 0

?: 1);

??outBytes[2 * i+1] = (byte) ((s2 +actualBytes[i]) % 2== 0?0????: 1);

??s2 = s1;

??s1 = actualBytes[i];

?}

return outBytes;

?private static byte[] addZero(byte[] inBytes) {

??byte[] outBytes = new byte[inBytes.length +2];

?for (int i = 0; i < outBytes.length - 2; i++) {

?outBytes[i] = inBytes[i];

}

?outBytes[outBytes.length - 2] = 0;

??outBytes[outBytes.length- 1] =0;

return outBytes;

?}

}

//模拟传输信道,为比特增加误码

class Channel {

// 输入只能是01,errorRate取值0(包含)~1(不包含)

?public static byte[] transfer(byte[] inBytes, double errorRate) {??byte[] outBytes =new byte[inBytes.length];

?Random r = new Random();

?double randomDouble;

?for (int i =0; i < outBytes.length; i++) {

outBytes[i]= inBytes[i];

randomDouble= r.nextDouble();

?if (randomDouble < errorRate) {

???outBytes[i] = (byte) (outBytes[i] ==0 ? 1 : 0);

??}

?}

return outBytes;

?}

}

动态规划算法原理与的应用

动态规划算法原理及其应用研究 系别:x x x 姓名:x x x 指导教员: x x x 2012年5月20日

摘要:动态规划是解决最优化问题的基本方法,本文介绍了动态规划的基本思想和基本步骤,并通过几个实例的分析,研究了利用动态规划设计算法的具体途径。关键词:动态规划多阶段决策 1.引言 规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。将各个阶段的决策综合起来构成一个决策序列,称为一个策略。显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。动态规划的主要创始人是美国数学家贝尔曼(Bellman)。20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。爱尔思先后于1961年和1964年出版了两部关于动态规划的著作,并于1964年同尼母霍思尔(Nemhauser)、威尔德(Wild)一道创建了处理分枝、循环性多阶段决策系统的一般性理论。梅特顿提出了许多对动态规划后来发展有着重要意义的基础性观点,并且对明晰动态规划路径的数

Viterbi译码的Matlab实现

2010年12月(上) Viterbi 译码的Matlab 实现 张慧 (盐城卫生职业技术学院,江苏盐城 224006) [摘要]本文主要介绍了Viterbi 译码是一种最大似然译码算法,是卷积编码的最佳译码算法。本文主要是以(2,1,2)卷积码为例,介 绍了Viterbi 译码的原理和过程,并用Matlab 进行仿真。[关键词]卷积码;Viterbi 译码 1卷积码的类型 卷积码的译码基本上可划分为两大类型:代数译码和概率译码,其中概率译码是实际中最常采用的卷积码译码方法。 2Viterbi 译码 Viterbi 译码是由Viterbi 在1967年提出的一种概率译码,其实质是最大似然译码,是卷积码的最佳译码算法。它利用编码网格图的特殊结构,降低了计算的复杂性。该算法考虑的是,去除不可能成为最大似然选择对象的网格图上的路径,即,如果有两条路径到达同一状态,则具有最佳量度的路径被选中,称为幸存路径( surviving path )。对所有状态都将进行这样的选路操作,译码器不断在网格图上深入,通过去除可能性最小的路径实现判决。较早地抛弃不可能的路径降低了译码器的复杂性。 为了更具体的理解Viterbi 译码的过程,我们以(2,1,2)卷积码为例,为简化讨论,假设信道为BSC 信道。译码过程的前几步如下:假定输入数据序列m ,码字U ,接收序列Z ,如图1所示,并假设译码器确知网格图的初始状态。 图1 时刻t 1接收到的码元是11,从状态00出发只有两种状态转移方向,00和10,如图a 所示。状态转换的分支量度是2;状态转换的分支径量度是0。时刻t 2从每个状态出发都有两种可能的分支,如图b 所示。这些分支的累积量度标识为状态量度┎a ,┎b ,┎c ,┎d ,与各自的结束状态相对应。同样地,图c 中时刻t 3从每个状态出发都有两个分支,因此,时刻时到达每个状态的路径都有两条,这两条路径中,累积路径量度较大的将被舍弃。如果这两条路径的路径量度恰好相等,则任意舍弃其中一条路径。到各个状态的幸存路径如图d 所示。译码过程进行到此时,时刻t 1和t 2之间仅有一条幸存路径,称为公共支(com-mon stem )。因此这时译码器可以判决时刻t 1和t 2之间的状态转移是00→10;因为这个状态转移是由输入比特1产生的,所以译码器输出1作为第一位译码比特。由此可以看出,用实线表示输入比特0,虚线表示输入比特1,可以为幸存路径译码带来很大的便利。注意,只有当路径量度计算进行到网格图较深处时,才产生第一位译码比特。在典型的译码器实现中,这代表了大约是约束长度5倍的译码延迟。 图2幸存路径选择 在译码过程的每—步,到达每个状态的可能路径总有两条,通过比较路径量度舍弃其中一条。图e 给出了译码过程的下一步:在时刻t 5到达各个状态的路径都有两条,其中一条被舍弃;图f 是时刻t 5的幸存路径。注意,此例中尚不能对第二位输入数据比特做出判决,因为在时刻t 2离开状态10的路径仍为两条。图g 中的时刻t 6同样有路径合并,图h 是时刻t 6的幸存路径,可见编码器输出的第二位译码比特是1,对应了时刻t 2和t 3之间的幸存路径。译码器在网格图上继续上述过程,通过不断舍弃路径直至仅剩一条,来对输入数据比特做出判决。 网格图的删减(通过路径的合并)确保了路径数不会超过状态数。对于此例的情况,可证明在图b 、d 、f 、h 中,每次删减后都只有4条路径。而对于未使用维特比算法的最大似然序列彻底比较法,其可能路径数(代表可能序列数)是序列长度的指数函数。对于分支字长为L 的二进制码字序列,共有2L 种可能的序列。下面我们用Matlab 函数viterbi (G,k,channel_output )来产生输入序列经Viterbi 译码器得到的输出序列,并将结果与输入卷积码编码器的信息序列进行比较。在这里,G =g ,k=k0,channel_output=output 。用Matlab 函数得到的译码输出为10011100110000111,这与我们经过理论分析得出的结果是一致的。 我们用subplot 函数将译码器最终的输出结果与(下转第261页) 250

DSP卷积码的维特比译码的分析与实现

编号: 《DSP技术与应用》课程论文卷积码的维特比译码的分析与实现 论文作者姓名:______ ______ 作者学号:___ ______ 所在学院: 所学专业:_____ ___ 导师姓名职称:__ _ 论文完成时间: _

目录 摘要: (1) 0 前言 (2) 1 理论基础 (2) 1.1信道理论基础 (2) 1.2差错控制技术 (3) 1.3纠错编码 (4) 1.4线性分组码 (5) 2 卷积码编码 (7) 2.1 卷积码概要 (7) 2.2 卷积码编码器 (8) 2.3卷积码的图解表示 (8) 2.4 卷积码的解析表示 (11) 3 卷积码的译码 (14) 3.1 维特比译码 (15) 3.2 代数译码 (17) 3.3 门限译码 (18) 4 维特比译码器实现 (18) 4.1 TMS320C54 系列DSP概述 (18) 4.2 Viterbi译码器的DSP实现 (19) 4.3 实现结果 (21) 5 结论 (21) 参考文献 (22) II

卷积码的维特比译码的分析与实现 摘要: 针对数据传输过程中的误码问题,本文论述了提高数据传输质量的一些编码及译码的实现问题。自P.Elias 首次提出卷积码编码以来,这一编码技术至今仍显示出强大的生命力。在与分组码同样的码率R 和设备复杂性的条件下,无论从理论上还是从实际上均己证明卷积码的性能至少不比分组码差,且实现最佳和准最佳译码也较分组码容易。目前,卷积码已广泛应用在无线通信标准中,其维特比译码则利用码树的重复性结构,对最大似然译码算法进行了简化。本文所做的主要工作: 首先对信道编码技术进行了研究,根据信道中可能出现的噪声等问题对卷积码编码方法进行了主要阐释。 其次,对卷积码维特比译码器的实现算法进行了研究,完成了译码器的软件设计。 最后,结合实例,采用DSP芯片实现卷积码的维特比译码算法的仿真和运行。 关键词: 卷积码维特比译码DSP Convolutional codes and Viterbi decoding analysis and realization Zhang Yi-Fei (School of Physics and Electronics, Henan University, Henan Kaifeng 475004, China) Abstract: Considering the error bit problem during data transmission,this thesis discussed some codings and decoders,aiming at enhancing transmission performance. From P.Elias first gave the concept of convolutional code, it has show its’ great advantage. Under the same condition and the same rate of block code, the performance of convolutional code is better than block code, and it’s easier to implement the best decoding.Convolutional codes have been widely used in wireless communication standards, the V iterbi decoding using the repetitive structure of the code tree, the maximum likelihood decoding algorithm has been simplified. Major work done in this article: First, the channel coding techniques have been studied, the main interpretation of the convolutional code encoding method according to the channel may be noise and other issues. Secondly, the convolutional code V iterbi decoder algorithm has been studied, the software design of the decoder. Finally, with examples, simulation and operation of the DSP chip convolutional codes, Viterbi decoding algorithm. 1

经典算法——动态规划教程

动态规划是对最优化问题的一种新的算法设计方法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。不存在一种万能的动态规划算法。但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。 多阶段决策过程最优化问题 ——动态规划的基本模型 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。 【例题1】最短路径问题。图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。具体计算过程如下: S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3 S2: K=3,有: F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8 F3(C2)=d3(C2,D1)+f4(D1)=5+3=8 F3(C3)=d3(C3,D3)+f4(D3)=8+3=11 F3(C4)=d3(C4,D3)+f4(D3)=3+3=6

Viterbi译码的MATLAB仿真研究

BUPT 卷积码编码及Viterbi译码 班级:07114 学号:070422 姓名:吴希龙 指导老师:彭岳星 邮箱:FusionBupt@https://www.sodocs.net/doc/4b14233243.html,

1. 序言 卷积码最早于1955年由Elias 提出,稍后,1957年Wozencraft 提出了一种有效地译码方法即序列译码。1963年Massey 提出了一种性能稍差但是比较实用的门限译码方法,使得卷积码开始走向实用化。而后1967年Viterbi 提出了最大似然译码算法,它对存储级数较小的卷积码很容易实现,被称作Viterbi 译码算法,广泛的应用于现代通信中。 2. 卷积码编码及译码原理 2.1 卷积码编码原理 卷积码是一种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。卷积码一般表示为(n,k,K)的形式,即将k 各信息比特编码为n 个比特的码组,K 为编码约束长度,说明编码过程中相互约束的码段个数。卷积码编码后的n 各码元不经与当前组的k 个信息比特有关,还与前K-1个输入组的信息比特有关。编码过程中相互关联的码元有K*n 个。R=k/n 是编码效率。编码效率和约束长度是衡量卷积码的两个重要参数。典型的卷积码一般选n,k 较小,但K 值可取较大(>10),以获得简单而高性能的卷积码。 卷积码的编码描述方式有很多种:冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。 2.1.1 卷积码解析表示法 卷积码的解析表示发大致可以分为离散卷积法,生成矩阵法,码多项式法。下面以离散卷积为例进行说明。 卷积码的编码器一般比较简单,为一个具有k 个输入端,n 个输出端,m 级移位寄存器的有限状态有记忆系统。下图所示为(2,1,7)卷积码的编码器。 若输入序列为u =(u 0u 1u 2u 3……), 则对应两个码字序列c ①=(c 0①c 1①c 2①c 3①……)和c ②=(c 0②c 1②c 2②c 3② ……) 相应的编码方程可写为c ①=u ?g ①,c ②=u ?g ②,c=(c ①,c ②)。 “?” 符号表示卷积运算,g ①,g ②表示编码器的两个冲激响应,即编码器的输出可以由输入序列和编码器的两个冲击响应卷积而得到,故称为卷积码。这里的冲激响应指:当输入为[1 0 0 0 0 … … ]序列时,所观察到的两个输出序列值。由于上图K 值为7,故冲激响应至

Matlab的卷积码译码器的仿真要点

基于Matlab的卷积码译码器的 设计与仿真 学生姓名:指导老师:** 摘要本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出, 并通过Matlab软件进行设计与仿真,并进行误码率分析。在课程设计中,系统开发平台为Windows Vista Ultimate,程序设计与仿真均采用Matlab R2007a(7.4),最后仿真详单与理论分析一致。 关键词课程设计;卷积码译码器;Matlab;Simulink;设计与仿真 1引言 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通 过Matlab软件进行设计与仿真。卷积码的译码有两种方法——软判决和硬判决,此课程设计采用硬判决的维特比译码。 1.1课程设计目的 卷积码是一种向前纠错控制编码。它将连续的信息比特序列映射为连续的编码器输出符号。这种映射是高度结构化的,使得卷积码的译码方法与分组码译码所采用的方法完全不同。可以验证的是在同样复杂度情况下,卷积码的编码增益要大于分组码的编码增益。对于某个特定的应用,采用分组编码还是采用卷积编码哪一种更好则取决于这一应用的具体情况和进行比较时可用的技术[1]。 本课程设计便是通过Matlab设计一个硬判决维特比译码输出的完整电路,并进行误码率分析。

1.2 课程设计的原理 卷积码,又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。 卷积编码的最佳译码准则为:在给定已知编码结构、信道特性和接收序列的情况下,译码器将把与已经发送的序列最相似的序列作为传送的码字序列的估值。对于二进制对称信道,最相似传送序列就是在汉明距离上与接收序列最近的序列。 卷积码的译码方法有两大类:一类是大数逻辑译码,又称门限译码(硬判决,编者注);另一种是概率译码(软判决,编者注),概率译码又分为维特比译码和序列译码两种。门限译码方法是以分组码理论为基础的,其译码设备简单,速度快,但其误码性能要比概率译码法差[2]。 当卷积码的约束长度不太大时,与序列译码相比,维特比译码器比较简单,计算速度快。维特比译码算法是1967年由Viterbi提出,近年来有大的发展。目前在数字通信的前向纠错系统中用的较多,而且在卫星深空通信中应用更多,该算法在卫星通信中已被采用作为标准技术。 2维特比译码原理 采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。如果发送L组信息比特,那么对于(n,k)卷积码来说,可能发送的序列有2kL个,计算机或译码器需存储这些序列并进行比较,以找到码距最小的那个序列。当传信率和信息组数L较大时,使得译码器难以实现。维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。它并不是在网格图上一次比较所有可能的2kL条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。 下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。为了能说明解码过程,这里给出该码的状态图,如图2.2所

卷积码编码和维特比译码

卷积码编码维特比译码实验设计报告 SUN 一、实验目的 掌握卷积码编码和维特比译码的基本原理,利用了卷积码的特性, 运用网格图和回溯以得到译码输出。 二、实验原理 1.卷积码是由连续输入的信息序列得到连续输出的已编码序列。其编码器将k个信息码元编为n个码元时,这n个码元不仅与当前段的k个信息有关,而且与前面的(m-1)段信息有关(m为编码的约束长度)。 2.一般地,最小距离d表明了卷积码在连续m段以内的距离特性,该码可以在m个连续码流内纠正(d-1)/2个错误。卷积码的纠错能力不仅与约束长度有关,还与采用的译码方式有关。 3. 维特比译码算法基本原理是将接收到的信号序列和所有可能的发送信号序列比较,选择其中汉明距离最小的序列认为是当前发送序列。卷积码的Viterbi 译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。 4.所谓“最佳”, 是指最大后验条件概率:P( C/ R) = max [ P ( Cj/ R) ] , 一般来说, 信道模型并不使用后验条件概率,因此利用Beyes 公式、根据信道特性出结论:max[ P ( Cj/ R) ]与max[ P ( R/ Cj) ]等价。考虑到在系统实现中往往采用对数形式的运算,以求降低运算量,并且为求运算值为整数加入了修正因子a1 、a2 。令M ( R/ Cj) = log[ P ( R/ Cj) ] =Σa1 (log[ P( Rm/ Cmj ) ] + a2) 。其中, M 是组成序列的码字的个数。因此寻找最佳路径, 就变成寻找最大M( R/ Cj) , M( R/ Cj) 称为Cj 的分支路径量度,含义为发送Cj 而接收码元为R的似然度。 5.卷积码的viterbi译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程并可以纠正接收码字中的错误比特。 三、实验代码 #include<> #include "" #define N 7 #include "" #include <> #include<> #define randomize() srand((unsigned)time(NULL)) encode( unsigned int *symbols, /*编码输出*/ unsigned int *data, /*编码输入*/ unsigned int nbytes, /*nbytes=n/16,n为实际输入码字的数目*/ unsigned int startstate /*定义初始化状态*/

解0-1背包问题的动态规划算法

关于求解0/1背包问题的动态规划算法 摘要:本文通过研究动态规划原理,提出了根据该原理解决0/1背包问题的方法与算法实现, 并对算法的正确性作了验证.观察程序运行结果,发现基于动态规划的算法能够得到正确的决策方案且比穷举法有效. 关键字:动态规划;0/1背包;约束条件;序偶;决策序列;支配规则 1、引 言 科学研究与工程实践中,常常会遇到许多优化问题,而有这么一类问题,它们的活动过程可以分为若干个阶段,但整个过程受到某一条件的限制。这若干个阶段的不同决策的组合就构成一个完整的决策。0/1背包问题就是一个典型的在资源有限的条件下,追求总的收益最大的资源有效分配的优化问题。 对于0/1背包问题,我们可以这样描述:设有一确定容量为C 的包及两个向量C ’=(S 1,S 2,……,S n )和P=(P 1,P 2,……,P N ),再设X 为一整数集合,即X=1,2,3,……,N ,X 为SI 、PI 的下标集,T 为X 的子集,那么问题就是找出满足约束条件∑S i 〈=C ,使∑PI 获得最大的子集T 。在实际运用中,S 的元素可以是N 个经营项目各自所消耗的资源,C 可以是所能提供的资源总量,P 的元素可是人们从各项项目中得到的利润。 0/1背包问题是工程问题的典型概括,怎么样高效求出最优决策,是人们关心的问题。 2、求解问题的动态规划原理与算法 2.1动态规划原理的描述 求解问题的动态规划有向前处理法向后处理法两种,这里使用向前处理法求解0/1背包问题。对于0/1背包问题,可以通过作出变量X 1,X 2,……,X N 的一个决策序列来得到它的解。而对于变量X 的决策就是决定它是取0值还是取1值。假定决策这些X 的次序为X n ,X N-1,……,X 0。在对X 0做出决策之后,问题处于下列两种状态之一:包的剩余容量是M ,没任何效益;剩余容量是M-w ,效益值增长了P 。显然,之后对X n-1,Xn-2,……,X 1的决策相对于决策X 所产生的问题状态应该是最优的,否则X n ,……,X 1就不可能是最优决策序列。如果设F j (X )是KNAP (1,j ,X )最优解的值,那么F n (M )就可表示为 F N (M )=max(f n (M),f n-1(M-w n )+p n )} (1) 对于任意的f i (X),这里i>0,则有 f i (X)=max{f i-1(X),f i-1(X-w i )+p i } (2) 为了能由前向后推而最后求解出F N (M ),需从F 0(X )开始。对于所有的X>=0,有F 0(X )=0,当X<0时,有F 0(X )等于负无穷。根据(2),可求出0〈X 〈W 1和X 〉=W 1情况下F 1(X )的值。接着由(2)不断求出F 2,F 3,……,F N 在X 相应取值范围内的值。 2.2 0/1背包问题算法的抽象描述 (1)初始化各个元素的重量W[i]、效益值P[i]、包的最大容量M ; (2)初始化S0; (3)生成S i ;

Viterbi译码器研究目的意义及现状

Viterbi译码器研究目的意义及现状Viterbi译码器研究目的意义及现状 1研究的目的和意义 由于卷积码的优良性能,被广泛的应用于深空通信,卫星通信和2G及3G移动通信中,卷积码有三种译码方法:门限译码,门限译码,概率译码和Viterbi 算法,其中Viterbi算法是一种基于网格图的最大似然译码算法,是卷积码的最佳译码方式,具有效率高、速度快等优点。Viterbi译码充分发挥了卷积码的特点,使译码错误概率达到最小,在码的约束度较小时,它具有译码算法效率高,速度快,译码器也简单的特点。 FPGA(Field,Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 同时在FPGA的基础上实现Viterbi译码器,迎合了当前FPGA迅猛发展的趋势。把相对成熟的技术应用到某些特定领域如通讯,视频,信息处理等等开发出满足行业需要并能被行业客户接受的产品这方面主要是FPGA技术和专业技术的结合问题,另外还有就是与专业客户的界面问题产品设计还包括专业工具类产品及民用产品,前者重点在性能,后者对价格敏感产品设计以实现产品功能为主要目的,FPGA技术是一个实现手段在这个领域,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计将是FPGA技术应用最广大的市场,具有极大的爆发性的需求空间产品设计对技术人员的要求比较高,路途也比较漫长不过现在整个行业正处在组建“首发团队”的状态,只要加入,前途光明产品设计是一种职业发展方向定位,不是简单的爱好就能

213卷积码编码和译码

No.15 (2,1,3)卷积码的编码及译码 摘要: 本报告对于(2,1,3)卷积码原理部分的论述主要参照啜刚教材和课件,编程仿真部分绝对原创,所有的程序都是在Codeblocks 8.02环境下用C语言编写的,编译运行都正常。完成了卷积码的编码程序,译码程序,因为对于短于3组的卷积码,即2 bit或4 bit纠错是没有意义的,所以对正确的短序列直接译码,对长序列纠错后译码,都能得到正确的译码结果。含仿真结果和程序源代码。 如果您不使用Codeblocks运行程序,则可能不支持中文输出显示,但是所有的数码输出都是正确的。

一、 卷积码编码原理 卷积码编码器对输入的数据流每次1bit 或k bit 进行编码,输出n bit 编码符号。但是输出的分支码字的每个码元不仅于此时可输入的k 个嘻嘻有关,业余前m 个连续式可输入的信息有关,因此编码器应包含m 级寄存器以记录这些信息。 通常卷积码表示为 (n,k,m). 编码率 k r n = 当k=1时,卷积码编码器的结构包括一个由m 个串接的寄存器构成的移位寄存器(成为m 级移位寄存器、n 个连接到指定寄存器的模二加法器以及把模二加法器的输出转化为穿行的转换开关。 本报告所讲的(2,1,3)卷积码是最简单的卷积码。就是2n =,1k =,3m =的卷积码。每次输入1 bit 输入信息,经过3级移位寄存器,2个连接到指定寄存器的模二加法器,并把加法器输出转化为串行输出。 编码器如题所示。 二、卷积码编码器程序仿真 C 语言编写的仿真程序。 为了简单起见,这里仅仅提供数组长度30 bit 的仿真程序,当然如果需要可以修改数组大小。为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果需要也可以增加相应的功能。 进入程序后,先提示输入数据的长度,请用户输入int (整型数)程序默认用户输入的数据小于30,然后提示输入01数码,读入数码存储与input 数组中,然后运算输出卷积码。经过实验仿真,编码完全正确。 以下是举例: a.课件上的输入101 输出11 10 00 的实验

算法分析复习题目及答案

一、选择题 1、二分搜索算法是利用 (A)实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是(A)。 A、找出最优解的性 质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是 ( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、在下列算法中有时找不到问题解的是(B)。 A、蒙特卡罗算 法B、拉斯维加斯算法C、舍伍德算法D、数值概率算法5.回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 6.下列算法中通常以自底向上的方式求解最优解的 是(B)。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C)。 A运行速度快B 占用空间少C时间复杂度低D代码短 8、以下不可以使用分治法求解的是 ( D )。 A棋盘覆盖问题 B 选择问题C归并排序D0/1背包问题 9.实现循环赛日程表利用的算法是(A)。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C) A数值概率算法B舍伍德算法C拉斯维加斯算法D蒙特卡罗算法 11.下面不是分支界限法搜索方式的是(D)。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 12.下列算法中通常以深度优先方式系统搜索问题解的是(D)。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13.备忘录方法是那种算法的变形。(B) A、分治法 B、动态规划法 C、贪心法 D、回溯法14.哈弗曼编码的贪心算法所需的计算时间为 (B)。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n)15.分支限界法解最大团问题时,活结点表的组织形式是(B)。 A、最小堆 B、最大堆 C、栈 D、数组16.最长公共子序列算法利用的算法是 (B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法17.实现棋盘覆盖算法利用的算法是(A)。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 18.下面是贪心算法的基本要素的是(C)。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 19.回溯法的效率不依赖于下列哪些因素 (D) A.满足显约束的值的个 数 B. 计算约束函数的时间C.计算限界函数的时间 D. 确定解空间的时间

动态规划:卷积码的Viterbi译码算法

动态规划:卷积码的Viterbi译码算法 学院:网研院?姓名:xxx 学号:xxx一、动态规划原理 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。 二、卷积码的Viterbi译码算法简介 在介绍维特比译码算法之前,首先了解一下卷积码编码,它常常与维特比译码结合使用。(2,1,3)卷积码编码器是最常见的卷积码编码器,在本次实验中也使用了(2,1,3)卷积码编码器,下面介绍它的原理。 (2,1,3)卷积码是把信源输出的信息序列,以1个码元为一段,通过编码器输出长为2的一段码段。该码段的值不仅与当前输入码元有关,而且也与其之前的2个输入码元有关。如下图所示,输出out1是输入、第一个编码器存储的值和第二个编码器存储的值逻辑加操作的结果,输出out2是输入和第二个编码器存储的值逻辑加操作的结果。 (2,1,3)卷积码编码器

浅谈我国动态规划算法研究与应用

动态规划算法研究与应用 1.引言 动态规划被认为是组成运筹学其中的一部分,也被当成为进行运算决定时最好的一种数学方式。在1950年左右,美国相关方面的几位数学家,对阶段决策期间关于优化的问题做了大量的研究,并发布著名的最优化理论,将众多的阶段变成了一个一个单一的问题,并分别进行解答,最后,发明了能够处理这种相关优化方面事情新的解决措施——动态规划。到了1957年,创造出了Dynamic Programming这一名著,被称为该领域创作第一人[1]。 在数学和计算机科学领域,动态规划算法对于求解最优解的问题方便快捷。动态规划方法经常用来解决生活中的实际问题,这些问题往往可以分解为很多个子问题,每个子问题都有一个对应解,其中的临界值就是我们所要求得的最优解。动态规划并非一种数学算法,而是用于最优化解题的一种技巧和方法。它非但不具有一个标准的数学方程式,不能够推导出清晰明确的解题步骤,更不具备万能性。对于要解决的若干问题,一定要建立在正确理解的基础上具体问题具体分析,用我们现有的数学知识和丰富的想象力创建模型,结合日常的技巧分析求解。客观人为的介入时间和空间因素,只要可以分为若干子问题的多状态过程,就可以用此方法快速求解。 2.动态规划算法简介 动态规划诞生之后,很快就在在工业生产、金融管理、工程技术、和资源最大化利用等领域得到了好评。在处理路线规划、物品进出库管理、资源最优化利用、更换设备、顺序、装载等问题,动态规划算法相比于其他算法更有优势而且更加便捷。 2.1基本原理 其主要的理论可以被理解成是将求解的划分成若干个子问题,并将其称作为N,然后这些子问题又有N个解的情况,其中这些可行解之中一定会有一个最优解,研究动态规划也就是希望能够找到最优解[2]。 如何能够合理的推导出基本的最优化方程式和找出唯一的临界值是研究动

MATLAB实现卷积码编译码-

本科生毕业论文(设计) 题目:MATLAB实现卷积码编译码 专业代码: 作者姓名: 学号: 单位: 指导教师: 年月日

目录 前言----------------------------------------------------- 1 1. 纠错码基本理论---------------------------------------- 2 1.1纠错码基本理论 ----------------------------------------------- 2 1.1.1纠错码概念 ------------------------------------------------- 2 1.1.2基本原理和性能参数 ----------------------------------------- 2 1.2几种常用的纠错码 --------------------------------------------- 6 2. 卷积码的基本理论-------------------------------------- 8 2.1卷积码介绍 --------------------------------------------------- 8 2.1.1卷积码的差错控制原理----------------------------------- 8 2.2卷积码编码原理 ---------------------------------------------- 10 2.2.1卷积码解析表示法-------------------------------------- 10 2.2.2卷积码图形表示法-------------------------------------- 11 2.3卷积码译码原理---------------------------------------------- 15 2.3.1卷积码三种译码方式------------------------------------ 15 2.3.2V ITERBI译码原理---------------------------------------- 16 3. 卷积码编译码及MATLAB仿真---------------------------- 18 3.1M ATLAB概述-------------------------------------------------- 18 3.1.1M ATLAB的特点------------------------------------------ 19 3.1.2M ATLAB工具箱和内容------------------------------------ 19 3.2卷积码编码及仿真 -------------------------------------------- 20 3.2.1编码程序 ---------------------------------------------- 20 3.3信道传输过程仿真-------------------------------------------- 21 3.4维特比译码程序及仿真 ---------------------------------------- 22 3.4.1维特比译码算法解析------------------------------------ 23 3.4.2V ITERBI译码程序--------------------------------------- 25 3.4.3 VITERBI译码MATLAB仿真----------------------------------- 28 3.4.4信噪比对卷积码译码性能的影响 -------------------------- 28

卷积码中的维特比译码和序贯译码算法

卷积码是1955年由Elias 等人提出的,是一种非常有前途的编码方法。我们在一些资料上可以找到关于分组码的一些介绍,分组码的实现是将编码信息分组单独进行编码,因此无论是在编码还是译码的过程中不同码组之间的码元无关。卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输 入的信息序列得到连续输出的已编码序列。即进行分组编码时,其本组中的n-k 个校验元仅与本组的k 个信息元有关,而与其它各组信息无关;但在卷积码中,其编 码器将k 个信息码元编为n 个码元时,这n 个码元不仅与当前段的k 个信息有关,而且与前面的(m -1)段信息有关(m 为编码的约束长度)。同样,在卷积码译码过程中,不仅从此时刻收到的码组中提取译码信息,而且还要利用以前或以后各时刻收到的码组中提取有关信息。而且卷积码的纠错能力随约束长度的增加而增强,差错率则随着约束长度增加而呈指数下降 。卷积码(n,k,m) 主要用来纠随机错误,它的码元与前后码元有一定的约束关系,编码复杂度可用编码约束长度m*n 来表示。一般地,最小距离d 表明了卷积码在连续m 段以内的距离特性,该码可以在m 个连续码流内纠正(d-1)/2个错误。卷积码的纠错能力不仅与约束长度有关,还与采用的译码方式有关。总之,由于n ,k 较小,且利用了各组之间的相关性,在同样的码率和设备的复杂性条件下,无论理论上还是实践上都证明:卷积码的性能至少不比分组码差。 编码原理[回目录] 以二元码为例,编码器如图。输入信息序列为u =(u 0, u 1,…),其多项式表示为u (x )=u 0+u 1x +…+u l x l +…。 编码器的连接可用多项式表示为g (1,1)(x )=1+x +x 2和 g (1,2)(x )=1+x 2,称为码的子生成多项式。它们的系数矢 量g (1,1)=(111)和g (1,2)=(101)称作码的子生成元。以子生成多项式为阵元构成的多项式矩阵G (x )= [g (1,1)(x ),g (1,2)(x )],称为码的生成多项式矩阵。由生成元构成的半无限矩阵 称为码的生成矩阵。其中(11,10,11)是由g (1,1)和g (1,2)交叉连接构成。编码器输出序列为c =u ·G ,称为码序 列,其多项式表示为c (x ),它可看作是两个子码序列c (1)(x )和c (2)(x )经过合路开关S 合成的,其中c (1)(x )=u (x )g (1,1)(x )和c (2)(x )=u (x )g (1,2)(x ),它们分别是信息序列和相应子生成元的卷积,卷积码由此得名。 在一般情况下,输入信息序列经过一个时分开关被分成k 0个子序列,分别以u (x )表示,其中i =1,2,…k 0,即u (x )=[ u (x ),…, u (x )]。编码器的结构由k 0×n 0阶生成多项式矩阵给定。输出码序列由n 0个子序列组成,即c (x )=[ c (x ), c (x ),…,c (x )],且c (x )=u (x )·G (x )。若m 是所有子生成多项式 g (x )中最高次式的次数,称这种码为(n 0,k 0,m ) 卷积码。 表示方法[回目录] 描述卷积码编码器过程的方法有很多,如矩阵法、多项式、码树和网格图等,这里我们主要介绍和卷积码编码器结构密切相关的多项式法,以及与卷积码译码密切相关的网格图法。 一种卷积码编码器 卷积码编码器

贪心算法与动态规划的比较

贪心算法与动态规划的比较 【摘要】介绍了计算机算法设计的两种常用算法思想:贪心算法与动态规划算法。通过介绍两种算法思想的基本原理,比较两种算法的联系和区别。通过背包问题对比了两种算法的使用特点和使用范围。 【关键字】动态规划;贪心算法;背包问题 1、引言 为了满足人们对大数据量信息处理的渴望,为解决各种实际问题,计算机算法学得到了飞速的发展,线性规划、动态规划、贪心策略等一系列运筹学模型纷纷运用到计算机算法学中,产生了解决各种现实问题的有效算法。虽然设计一个好的求解算法更像是一门艺术而不像是技术,但仍然存在一些行之有效的、能够用于解决许多问题的算法设计方法,你可以使用这些方法来设计算法,并观察这些算法是如何工作的。一般情况下,为了获得较好的性能,必须对算法进行细致的调整。但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。本文针对部分背包问题和0/ 1 背包问题进行分析,介绍贪心算法和动态规划算法的区别。 2、背包问题的提出 给定n种物品( 每种物品仅有一件) 和一个背包。物品i的重量是w i,其价值为p i,背包的容量为M。问应如何选择物品装入背包,使得装入背包中的物品的总价值最大,每件物品i的装入情况为x i,得到的效益是p i*x i。 ⑴部分背包问题。在选择物品时,可以将物品分割为部分装入背包,即0≤x i≤1 ( 贪心算法)。 ⑵0/ 1背包问题。和部分背包问题相似,但是在选择物品装入时要么不装,要么全装入,即x i = 1或0。( 动态规划算法) 。 3、贪心算法 3.1 贪心算法的基本要素 能够使用贪心算法的许多例子都是最优化问题,每个最优化问题都包含一组限制条件和一个优化函数,符合限制条件的问题求解方案称为可行解;使优化函数取得最佳值的可行解称为最优解。此类所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到(这是贪心算法与动态规划的主要区别) 。 3.2贪心策略的定义 贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值( 或较优解) 的一种解题方法。贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该问题运用贪心策略可以得到最优解或较优解。(注:贪心算法不是对所有问题都能

相关主题