信息论实验报告(20170917045332)

上传人:飞*** 文档编号:47430776 上传时间:2018-07-02 格式:PDF 页数:9 大小:194.62KB
返回 下载 相关 举报
信息论实验报告(20170917045332)_第1页
第1页 / 共9页
信息论实验报告(20170917045332)_第2页
第2页 / 共9页
信息论实验报告(20170917045332)_第3页
第3页 / 共9页
信息论实验报告(20170917045332)_第4页
第4页 / 共9页
信息论实验报告(20170917045332)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《信息论实验报告(20170917045332)》由会员分享,可在线阅读,更多相关《信息论实验报告(20170917045332)(9页珍藏版)》请在金锄头文库上搜索。

1、Viterbi 译码实验班级:硕 834 班姓名:刘莹莹学号: 3108036028 1 一、实验内容:实验要求仿真Viterbi 算法,同样要求仿真出在AWGN 信道下的误码率对 Eb/N0 曲线,调制方式可以选择QPSK 或者 16QAM。实验所用的卷积码可以选 用(7,5)。二、实验原理:分析实验内容,得知本实验主要涉及以下几个重要步骤:卷积编码、QPSK 调制(本实验选择此种调制方式) 、通过 AWGN 信道、解调、 Viterbi 译码,如图 1 所示。图 1 2.1 卷积码编码原理 分组码是把信息序列分成长为k 的许多子段,然后每个子段独立地编出各自 的监督码,形成长为n 的码字。

2、每个子段的监督位只与本子段的信息位有关,而 与其他子段无关。 各个段形成的码字在编码译码时独立进行。为了达到一定的纠 错能力和效率, 分组码的码字 n 通常比较大。 编码解码时必须把本子段的信息码 存储起来再进行编码解码。 这样当码长 n 较大时,编码解码过程所产生的时延也 随之增加。若降低码长n,又会使纠错能力和效率下降。卷积码对信息位的处理 与分组码完全不同, 它是一种连续处理信息序列的编码方式。码字的监督位不仅 与本段的信息位有关而且与其它段落的信息位也有关。整个编码过程前后相互关 联,连续进行。 在编码时将信息序列分成长度为k 的子段,把长度为 k 的信息比 特编为 n个比特, k 和

3、 n 取值通常都很小,特别适合以串行形式传输信息,时延 小。长为 n 的每个子段包括 k 个信息位和 r=n-k 个监督位,这里的监督位不仅与 本段的 k 个信息位有关,也与前面(N-1)段的信息位有关, N 为相关联的信息 序列的分段数目。编码后相互关联的码元数目为nN。卷积码的纠错能力随着N 的增加而增大,差错率随N 的增加而指数下降。与分组码相比,在设备复杂度 相同的条件下卷积码的性能优于分组码。 本实验所使用的卷积码为(2,1,3)卷积码,即 1bit 输入编码为 2bit 输出, 约束长度为 3,寄存器的个数为2,其编码原理图如图2 所示。图 2AWGN 解调Viterbi 译码QP

4、SK 调制卷积编码输入序列输出序列2 在图 1 中,m1 与 m2 为移位寄存器,它们的起始状态均为零。C1、C2 与 b1、b2、b3 之间的关系如下:C1 = b1 + b2 + b3 C2 = b2 + b3 假如输入的信息为D = 11010,为了使信息 D 全部通过移位寄存器,也为 了使寄存器的状态归零并降低判决时的误差,还必须在信息位后面加3 个零。表 1 列出了对信息 D 进行卷积编码时的状态。输入信息 D 1 1 0 1 0 0 0 0 b3b2 00 0 1 1 1 1 0 0 1 1 0 0 0 0 0 输出 C1C2 1 1 0 1 0 1 0 0 1 0 1 1 0 0

5、 0 0 表 1 如果输入一个单位冲击响应,那么C1、C2的输出分别为 111 、101,整个过 程是线性的, 输出序列可以认为是输入序列通过了两个FIR 滤波器,那么输出序 列就是输入序列同111和 101的卷积,用生成矩阵表示为G = 111,101,用八进制 表示即为 7,5。 本实验所用的卷积码的状态图表示如图3所示,这中表示方法方便理清编程 的思路。其中的实线表示输入为0,虚线表示输入为1,线上的码字即为输出码 字。图 3 2.2 维特比译码 卷积码的译码方法可分为代数译码和概率译码两大类,概率译码比较常用的 有两种,一种叫序列译码,另一种叫Viterbi 译码法,本实验主要是Vit

6、erbi 译码 方法的实现。 它的基本思想是把接收到的矢量,和网格图上诸种可能的路径比较,删去距 离大的路径,保留距离小的路径,以距离最小路径作为发码的估值3 下面利用图解的方法来说明维特比解码的方法和运作过程。设输入编码器的 信息序列为 (1 1 0 1 1 0 0 0 ),则由编码器输出的序列Y=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 ),编码器的状态转移路线为abcdbdca 。若收到的序列 R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 ) ,对照网格图来说明维特比译码的方法。 由于该卷积码的约束长度为3 位, 因此先选择接收序列的前6

7、位序列 R1 = (0 1 0 1 0 1) ,同到达第3 时刻可能的8 个码序列(即8 条路径)进行比较, 并计算出码距。 该例中到达第 3 时刻 a点的路径序列是 (0 0 0 0 0 0 )和(1 1 1 0 1 1 ) ,它们与 R1 的距离分别是3 和 4;到达第 3 时刻 b 点的路径序列是 (0 0 0 0 1 1)和( 1 1 1 0 0 0) ,它们与 R1 的距离分别是3 和 4,到达第3 时刻 c 点的路径序列是 (0 0 1 1 1 0)和(1 1 0 1 1 0) ,与 R1 的距离分别是4 和 1; 到达第 3 时刻 d 点的路径序列是( 0 0 1 1 0 1 )

8、和(1 1 0 1 1 0) ,与 R1 的距 离分别是2 和 3。上述每个节点都保留码距较小的路径为幸存路径,所以幸存 路径码序列是 (0 0 0 0 0 0) 、(0 0 0 0 1 1) 、(1 1 0 1 0 1)和 (0 0 1 1 0 1) , 如图 4(a)所示。用与上面类同的方法可以得到第4、5、6、7 时刻的幸存路 径。需指出对于某一个节点而言比较两条路径与接收序列的累计码距时,若发生 两个码距值相等, 则可以任选一路径作为幸存路径,此时不会影响最终的译码结 果。图 4(b)给出了第5 时刻的幸存路径,在码的终了时刻a 状态,得到一根 幸存路径,如图4(c)所示。由此看到译码

9、器输出是R =(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0) ,即可变换成序列( 1 1 0 1 1 0 0 0 ) ,恢复了发端原始信息。比较R 和 R 序列,可以看到在译码过程中己纠正了在码序列第1 和第 7 位上的差错。 当然,差错出现太频繁,以至超出卷积码的纠错能力,则会发生误纠,这是不希 望的。图 4(a) 图 4(b) 4 图 4(c)Viterbi 译码的缺点是随着约束长度的增加算法的复杂度增加很快。约束长度N 为 7 时要比较的路径就有64条, 为 8 时路径变为 128条。(2(1,1),01-(-1.1),00-(-1,-1),10-(1,-1),解调时

10、第一象限判为11,第二象 限判为 01,第三象限判为 00,第四象限判为 10. 三、 编程思路:整体思路如图 1 中所示,其中输入序列使用randn函数来产生,卷积也采用 matlab 本身的函数 conv,加性高斯白噪声用wgn 函数来产生,由于实验的重点 在 Viterbi 译码,下面介绍译码的实现。 译码总体上是先通过加比选来得到最优路径,然后根据状态转移图 来得到解码后的码字。 由图 4 可以看到在选择最佳路径时, 第一时刻和第二时刻需要特殊处理,从 第三时刻开始直到译码结束处理方式都相同。在整个过程中需要记录的是到达各 个状态的累计最小汉明距离及路径。用RouteS0-RouteS

11、3来记录到达各个状态 的路径,用数组D 来记录到达各个状态时的累计汉明距离。 从 S0状态( a 状态)开始,第一时刻只能到达S0 和 S1 状态,且输出分别 为 00 和 11, 这时只记录到达 S0和 S1时输出与接收码字的汉明距离D(1)和 D(2), 第二时刻可达的状态为全部, 但是到达个状态也只有一条路径,此时记录下到达 四个状态的累计汉明距离及路径。从第三时刻开始,到达每个状态有两条路径, 将这两天路径的累计汉明距离进行比较保存下距离小的,以及与该距离相对应的 路径。由于对原序列添加了2 比特的 0,所以理论上最终的状态归于S0,故最终 的 RouteS0就是最佳路径。 在这个过程

12、中要注意使用临时变量来保存上一时刻的 路径和累计距离, 以免在该时刻重新赋值时发生覆盖。最后利用状态转移图来根 据最佳路径得到码字。程序见附录。四、实验结果及分析5 1234567891010-1100Eb/N0Pe由图可见随着信噪比的增大,误码率减小,最后趋于0.五、心得体会关于 Viterbi 译码,原理上很早就明白,但是具体实现还是有相当的难度, 理清思路花的时间比编写程序花的时间要多。在写的过程中整体思路很清晰,但 是在细枝末节上偶尔又会钻牛角尖,要感谢任龙博同学帮我排除了一些弱智型错 误。通过本次实验,对Viterbi 译码有了更深刻的理解。当然也掌握了几个以前 不曾用过的 matl

13、ab函数,总之做完整个实验,获益良多。六、附录:下面是主程序 clc clear all Frame = 100; for i = 1 : Frame SignNum = 1000; Length = SignNum + 3; OrigiSeq=(sign(randn(1,SignNum)+1)/2; OrigiSeq=OrigiSeq 0 0 0 ; ConCode = ConEncode(OrigiSeq, Length); QPSKCode = QPSKEncode(ConCode, Length); a = 1: -0.1 : 0.1; p = 10*log10(a); error =

14、 zeros(10,10); for k = 1:length(p)NoiseSeq = wgn(1,2*Length,p(k); RecCode = QPSKCode + NoiseSeq; DQPSKCode = QPSKDecode(RecCode, Length); Decoder = Viterbi(DQPSKCode, Length); error(i,k) = sum(abs(Decoder-OrigiSeq); end end6 AveError = zeros(1,10); for column = 1:10 for row = 1:10AveError(column) =

15、AveError(column) + error(row,column); end end AveError; x = 1:10; plot(x,AveError./1000); xlabel(Eb/N0) ylabel(Pe) grid on function ConCode = ConEncode(OrigiSeq, Length) ConCode1 = mod(conv(OrigiSeq, 1,1,1), 2); ConCode2 = mod(conv(OrigiSeq, 1,0,1), 2); ConCode1 = ConCode1(1:Length); ConCode2 = ConC

16、ode2(1:Length); ConCode = zeros(1,2*Length); for j = 1 : LengthConCode(2*j-1) = ConCode1(j);ConCode(2*j) = ConCode2(j); end function QPSKCode = QPSKEncode(ConCode, Length)QPSKCode = zeros(size(ConCode); for i = 1 : LengthL = 2*i-1;R = 2*i; if ConCode(L:R) = 1 1QPSKCode(L:R) = 1 1; elseif ConCode(L:R) = 0 1QPSKCode(L:R) = -1 1; elseif ConCode(L:R) = 0 0QPSKCode(L:R) = -1

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号