您的当前位置:首页正文

循环码编码

2023-05-06 来源:步旅网
摘 要

本报告详细给出了循环码的定义以及由生成多项式求解生成矩阵和系统生成矩阵的过程,并在Matlab环境下写出了循环码的编码器和解码器代码,实现了编码和译码功能。在计算机通信信息码中循环码是线性分组码的一个重要子集,是目前研究得最成熟的一类码。它有许多特殊的代数性质,它使计算机通信以一种以数据通信形式出现,实现了在计算机与计算机之间或计算机与终端设备之间进行有效的与正确地信息传递,它使得现代通信的可靠性与有效性实现了质的飞跃循环码还有易于实现的特点,很容易用带反馈的移位寄存器实现其硬件。

关键字:循环码;编码;译码;Matlab。

1

目 录

前 言.............................................................................................................................. 3 一 循环码概念及其编译码原理介绍.......................................................................... 4 1.1 线性生成码............................................................................................................ 4

1.1.1 线性生成码的原理.............................................................................. 4 1.1.2 生成矩阵和校验矩阵.......................................................................... 4 1.2 (n ,k)循环码................................................................................................. 5

1.2.1 (n ,k)循环码概念.............................................................................. 5 1.2.2 循环码编码原理.................................................................................. 6 1.2.3 循环码纠错原理.................................................................................. 7 1.2.4 编码过程及实现.................................................................................. 9 1.2.5 译码过程及实现................................................................................ 10

二、(7,3)循环码程序设计...................................................................................... 13

2.1(7,3)循环码编码仿真模块....................................................................... 13 2.2(7,3)循环码译码仿真模块....................................................................... 14 2.3 高斯信道下(7,3)循环码的误码性能..................................................... 15 三、设计与仿真.......................................................................................................... 16

3.1(7,3)循环码的编码................................................................................... 16 3.3 (7,3)循环码的译码................................................................................. 17 3.4 (7,3)循环码在高斯信道下的误码性能................................................. 18 总 结............................................................................................................................ 19 参考文献...................................................................................................................... 20 附 录............................................................................................................................ 21 致 谢............................................................................................................................ 28

2

前 言

在通信软件中大多数采用循环码进行数据差错控制。了解循环码的数学原理, 掌握硬件实现电路,运用简单快速的软件方法,对于各种通信软件编程员(包括单片机、系统机)有很高的实用价值。在计算机通信信息码中循环码是线性分组码的一个重要子集,是目前研究得最成熟的一类码。它有许多特殊的代数性质,它使计算机通信以一种以数据通信形式出现,实现了在计算机与计算机之间或计算机与终端设备之间进行有效的与正确地信息传递,它使得现代通信的可靠性与有效性实现了质的飞跃。

3

一 循环码概念及其编译码原理介绍

1.1 线性生成码

1.1.1 线性生成码的原理

线性分组码的构成方式是把信息序列分成每k 个码元一段,并由这k 个码元按一定规则产生r 个校验位,组成长度为n = k + r 的码字,用(n, k) 表示信息码元与校验位之间为线性关系。一个[n,k]线性分组码,是把从信源输出的以k个码元为一组的信息组m,通过信道编码器后,变成长度为n≥k的码组(码字)c作为[n,k]线性分组码的一个码字。

设GF(q)是一个含有q个元素的有限数域,若每位码元的取值有q种(取自GF(q)),则信息组m共有q种不同的状态,因此,需要q个码字c。而长为n的数组共有q个,二进制时(q=2)共有2n个。显然,q个n维向量组成有限域GF(q)上的一个n维线性空间V,编码就是要在这个n维线性空间中选出q个向量作为合法码字,其余的q-q个向量为禁用码字。

如果选出的q个作为合法码字的向量的集合构成了V的一个k维线性子空间,则称它是一个q进制[n,k]线性分组码。

如果值取自GF(q)上的[n,k]分组码的q个码字的集合C,便构成了有限域GF(q)上的n维线性空间V的一个k维线性子空间,则称C是一个q进制[n,k]线性分组码。

1.1.2 生成矩阵和校验矩阵

kknkknnkk

1000111 生成矩阵: 0100110 GIkQ0010101 (1-1) 00010114

G称为生成矩阵,因为可以用它产生整个码组A,即有

Aa6a5a4a3a2a1a0a6a5a4a3G (1-2)

生成矩阵的性质:具有[IkQ]形式的生成矩阵称为典型生成矩阵。由典型生成矩阵得出的码组A中,信息位的位置不变,监督位附加于其后。这种形式的码组称为系统码。 矩阵G的各行也必须是线性无关的。如果已有k个线性无关的码组,则可以将其用来作为生成矩阵G,并由它生成其余码组。

监督矩阵:

1110100PIH1101010r1011001 (1-3)

监督矩阵可用来校验和纠错。

1.2 (n ,k)循环码

1.2.1 (n ,k)循环码概念

在实际应用中,数据传输一般采用系统码的编码方式,即在发送的信息序列之后附加上特定位数序列的冗余位,该冗余位称为所发送的信息序列的监督位。监督位一般是由所发送的信息序列经过恰当的变化而产生。若监督位由信息序列经过线性组合得到,则称得到的系统码为线性分组码。

循环码是线性分组码的一个重要子类,具有严密的代数学理论。循环码“线性”是指任意两个循环码模2相加所得的新码仍为循环码。循环码具有线性码的一般性质(即封闭性.指一种线性分组码的任意两个码组之和仍是该分组码的另一个码组)外,还具有循环性,即循环码中任一码组循环一位(将最右端码元移至左端,或反之)以后,仍为该码组中的一个码组。(n,k)循环码表示其中信息位为k,监督位为n-k位。

若一个循环码的所有码字多项式都是一个次数最低的非零首一多项式g(x)的倍式,则g(x)生成该码,并称g(x)为该码的生成元或生成多项式。若在GF(2)上的(n,k)循环码中,存在唯一的

5

n-k次首一多项式

使得每一个码多项式c(x)都是g(x)

的倍式,且每一低于或等于n-1次的g(x)的倍式,一定是码多项式。(n,k)循环码的生成多项式g(x)一定是为n-k次,且除尽

的因式:

;反之,若g(x)

,则此g(x)一定生成一个(n,k)循环码。

对于一般的(n,k)循环码,设其生成多项式为

,由于

等k个

码多项式必线性无关,故可用它们组成码的一组基底,而与这些码多项式相对应的k个线性无关的码向量就构成除生成矩阵G,即

...g1g00...0gnkgnk1

gnkgnk1...g1g00...00 G(x)= (1-4) ......0gnkgnk1...g1g0 0

若g(x)是(n,k)循环码的生成多项式,有多项式,称为校验多项式。令

,h(x)是k次

,则

0h0h1...hk0...0h0h1h2...hk...0H = (1-5) ......

0h0h1...hk 0...

为(n-k)x n阶矩阵,称为码的校验矩阵。可以证明,

1.2.2 循环码编码原理

有信息码构成信息多项式m(x)mk1xk1m0,其中最高幂次为k-1; 用xnk乘以信息多项式m(x),得到的xnkm(x),最高幂次为n-1,该过程相

6

当于把信息码(mk1,mk2,……,m1,m0)移位到了码字德前k个信息位,其后是r个全为零的监督位;

用g(x)除xnkm(x)得到余式r(x),其次数必小于g(x)的次数,即小于(n-k),将此r(x)加于信息位后做监督位,即将r(x)于xnkm(x)相加,得到的多项式必为一码多项式。

根据上面的讨论,可得到在(7,4)循环码编码的程序框图如图1 所示:

存储c(x) 图1.2.2.1 编码程序框图

初始化 (1-6) 确定余式r(x): r(x)m(x)xnkg(x) (1—7) 确定c(x): c(x)m(x)xnkr(x) (1—8) 1.2.3 循环码纠错原理

纠错码的译码是该编码能否得到实际应用的关键所在。译码器往往比编码较难实现,对于纠错能力强的纠错码更复杂。根据不同的纠错或检错目的,循环码译码器可分为用于纠错目的和用于检错目的的循环码译码器。 通常,将接收到的循环码组进行除法运算,如果除尽,则说明正确传输;如果未除尽,则在寄存器中的内容就是错误图样,根据错误图样可以确定一种逻辑,来确定差错的位置,从而达到纠错的目的。用于纠错目的的循环码的译码算法比较复杂,感兴趣的话可以参考一些参考书。而用于检错目的循环码,一般使用ARQ通信方式。检测过程也是将接受到的码组

7

进行除法运算,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错,要求发送端重发。用于这种目的的循环码经常被成为循环冗余校验码,即CRC校验码。CRC校验码由于编码电路、检错电路简单且易于实现,因此得到广泛的应用。在通过MODEM传输文件的协议如ZMODEM、XMODEM协议中均用到了CRC校验技术。在磁盘、光盘介质存储技术中也使用该方法。 当码字c通过噪声信道传送时,会受到干扰而产生错误。如果信道产生的错误图样是e,译码器收到的n重接受矢量是y,则表示为:

yce (1-9) 上式也可以写成多项式形式:

y(x)c(x)e(x) (1-10) 译码器的任务就是从y(x)中得到e(x),然后求的估值码字

c(x)y(x)e(x) (1-11)

并从中得到信息组m(x)。 循环码译码可按以下三个步骤进行: (1)有接收到的y(x)计算伴随式s(x);

(2)根据伴随式s(x)找出对应的估值错误图样e(x);

(3)计算c(x)y(x)e(x),得到估计码字c(x)。若c(x)c(x),则译码正确,否则,若c(x)c(x),则译码错误。

由于g(x) 的次数为n - k 次,g(x) 除E(x) 后得余式(即伴随式)的最高次数为n-k-1次,故S(x) 共有2n-k 个可能的表达式,每一个表达式对应一个错误格式。可以知道(7,4)循环码的S(x) 共有2(7-4) = 8个可能的表达式,可根据错误图样表来纠正(7,4)循环码中的一位错误,其伴随式如表1所示。 BCH(7,4)循环码错误图样表: 错误图样 E6(x)=x6 E5(x)=x5

^^^^^^^表1 BCH(7,4)循环码错误图样表

错误图样码字 1000000 0100000 8

伴随式S(x) x2 x2+x 伴随式 100 110 E4(x)=x4 E3(x)=x3 E2(x)=x2 E1(x)=x1 E0(x)=x0 E(x)=0 0010000 0001000 0000100 0000010 0000001 0000000 x2+x+1 x+1 x2+1 x 1 0 111 011 101 010 001 000

上式指出了系统循环码的译码方法:将收到的码字R(x) 用g(x) 去除,如果除尽则无错;否则有错。如果有错,可由余式S(x) 一一找出对应图样,然后将错误图样E(x) 与R(x) 模2 和,即为所求码字C(x) ,从而实现纠错目的。 根据前面的讨论,可得(7,4)循环码译码的程序框图如图2.3.1 所示:

存储c(x) 纠错c(x)E(X)R(X) S(x)=0,无误码误否 由S(x)确定错误图样E(x) 由R(x)确定S(x): 初始化

图2译码程序框图

1.2.4 编码过程及实现

在编码时,首先需要根据给定循环码的参数确定生成多项式g(x),也就是从

的因子中选一个(n-k)次多项式作为g(x);然后,利用循环码的编码

9

特点,即所有循环码多项式A(x)都可以被g(x)整除,来定义生成多项式g(x)。

根据上述原理可以得到一个较简单的系统:设要产生(n,k)循环码,m(x)表示信息多项式,循环码编码方法则其次数必小于k,而于n,用

·m(x)的次数必小

·m(x)除以g(x),可得余数r(x),r(x)的次数必小于(n-k),将

r(x)加到信息位后作监督位,就得到了系统循环码。下面就将以上各步处理加以解释:

(1)用

乘m(x)。这一运算实际上是把信息码后附加上(n-k)个“0”。

+x。当n-k=7-3=4时,

·m(x)

例如,信息码为110,它相当于m(x)==

+

,它相当于1100000。而希望的到得系统循环码多项式应当是A(x) =

·m(x) + r(x)。

(2)求r(x)。由于循环码多项式A(x)都可以被g(x)整除,也就是:

A(x)xnmm(x)r(x)xnmm(x)r(x)Q(x) (1-12)g(x)g(x)g(x)g(x) 因此,用

·m(x)除以g(x),就得到商Q(x)和余式r(x),即

xnmm(x)r(x)G(x) (1-13)

g(x)g(x)这样就得到了r(x)。

(3)编码输出系统循环码多项式A(x)为:

(1-14)

1.2.5 译码过程及实现

对于接收端译码的要求通常有两个:检错与纠错。达到检错目的的译码十分简单,可以由式(1),通过判断接收到的码组多项式B(x)是否能被生成多项式

g(x)整除作为依据。当传输中未发生错误时,也就是接收的码组与发送的码组相

10

同,即A(x)=B(x),则接收的码组B(x)必能被g(x)整除;若传输中发生了错误,则A(x)≠B(x),B(x)不能被g(x)整除。因此,可以根据余项是否为零来判断码组中有无错码。

设发射的码字为C(x),而收到的码字为R(x),如果C(x) = R(x),则说明收到码字正确。如果C(x) ≠ R(x),则说明收到的码字出现错误,即为:R(x) = C(x) + E(x)。……(1)

公式(1)中E(x) 称为错误图样。当E(x) = 0 时,则无错误。用g(x)去除R(x),因为C(x)是由g(x)生成的,故C(x)必能为g(x)除尽,显然,R(x)与E(x)为同余式(R(x) ≡ E(x)mod g(x)),以g(x)除E(x)所得余式称之为伴随式S(x)。

由公式(1)可知, R(x)⋅

= (C(x) + E(x))⋅H(x) = E(x)⋅H(x) 。若E(x)

仅与

= 0,则E(x)⋅H(x) = 0;若E(x) ≠ 0,则H(x) ≠ 0。这说明,R(x) ⋅错误图样有关,而与发送的码字无关,由此可以确定错误图样表。

由于g(x)的次数为n − k 次,g(x)除E(x)后得余式(即伴随式)的最高次数为n−k−1次,故S(x)共有

个可能的表达式,每一个表达式对应一个错误格式。

= 8个可能的表达式,可根据错误图样

可以知道(7,4)循环码的S(x)共有

表来纠正(7,4)循环码中的一位错误,其伴随式如表1所示。

表 1 BCH(7,4)循环码错误图样表 错误图样

错误图样码字 1000000 0100000 0010000 0001000 0000100 0000010 0000001 0000000 11

伴随式S(x) 1 0 伴随式 100 110 111 011 101 010 001 000 上式指出了系统循环码的译码方法:将收到的码字R(x)用g(x)去除,如果除尽则无错;否则有错。如果有错,可由余式S(x)一一找出对应图样,然后将错误图样E(x)与R(x)模2和,即为所求码字C(x),从而实现纠错目的。

需要指出的是,有错码的接收码组也有可能被g(x)整除,这时的错码就不能检出了。这种错误被称为不可检错误,不可检错误中的错码数必将超过这种编码的检错能力。

在接收端为纠错而采用的译码方法自然比检错要复杂许多,因此,对纠错码的研究大都集中在译码算法上。

我们知道,校正子与错误图样之间存在某种对应关系。如同其它线性分组码,循环编码和译码可以分三步进行:

(1)由接收到的码多项式B(x)计算校正子(伴随式)多项式S(x); (2)由校正子S(x)确定错误图样E(x); (3)将错误图样E(x)与B(x)相加,纠正错误。

上述第(1)步运算和检错译码类似,也就是求解B(x)整除g(x)的余式,第(3)步也很简单。因此,纠错码译码器的复杂性主要取决于译码过程的第(2)步。

12

二、(7,3)循环码程序设计

本设计分为三个模块: (7,3)循环码编码仿真模块、(7,3)循环码译码仿真模块、(7,3)循环码误码性能分析模块

2.1(7,3)循环码编码仿真模块

按照循环码的编码原理设计流程图如下

输入消息m(x)如[1 1 1 0 0 0 0] 开始

图2-1 (7,3)循环码编码程序流程图

结束 输出码字C(x) 确定c(x): c(x)m(x)x nknk确定余式r(x): r(x)m(x)x g(x) r(x)

13

2.2(7,3)循环码译码仿真模块

可得(7,3)循环码译码的程序框图如图1.2.3.1 所示:

开始

由接收信号r确定伴随式s:s=r*h 是 S是否为0 否否 由S确定错误图样e 纠错cer 输出码字c 结束

图2-2 (7,3)循环码译码程序流程图

14

2.3 高斯信道下(7,3)循环码的误码性能

信号源 (7,3)循环码编码 (7,3)循环码译码 误码分析 加入不同信噪比的高斯白噪声 图2-3 (7,3)循环码在高斯信道下的误码性能

15

三、设计与仿真

3.1(7,3)循环码的编码

在循环码编码模块的程序中,主要是根据一个输入的消息矢量从而产生(7,3)循环码编码后的序列。

(1)输入矢量为[1 1 0 0 1 1 0]时的编码输出序列如下图所示:

图3-1 (7,3)循环码的编码程序仿真结果图(1)

(2)输入矢量为[1 1 1 0 0 0 0]时的编码输出序列如下图所示:

图3-2 (7,3)循环码的编码程序仿真结果图(2)

由上图可看出,本程序实现了对任意输入消息进行(7,3)循环码的编码。

16

3.3 (7,3)循环码的译码

在MATLAB环境下实现对任意码的编码 (1) 将3.2中编出的码字输入译码程序中可得

图3-3 (7,3)循环码的译码程序仿真结果图

由上图可以看出,用编出的码字译码,没有错误,正确译出原码。验证了译码程序的正确性。

(2) 将3.2中编出的码字改变一位作为译码程序的输入,译码程序仿真输

出为中可得

图3-4 (7,3)循环码的纠一位错程序仿真结果图

由上图可以看出本程序可以正确纠正一位错码。

17

3.4 (7,3)循环码在高斯信道下的误码性能

图3-5 信源产生的序列及无噪输出序列

在加性高斯白噪声下的误码率00510152025300010203040500.50.5005101520253000102030频谱图14050600.50.5编码器输入信号11编码器输出信号译码器输出信号1循环码在不同信噪比下的误码率0.35误码率0.3

0.250.20.150.10.050 01020304050信噪比60708090100图3-6循环码在不同信噪比下的误码率分析

18

总 结

本报告详细给出了循环码的定义以及由生成多项式求解生成矩阵和系统生成矩阵的过程,并在Matlab环境下写出了循环码的编码器和解码器代码,实现了编码和译码功能。分析和讨论了此码发现错误、纠正错误的能力。通过分析查阅(n,k)循环码的编码方法,在MATLAB环境下设计了对(7,3)循环码编译码方法的仿真,首先设计了对任意(7,3)循环码的编译码,然后使一个经过(7,3)循环码编码的信号序列通过高斯信道,再对译码后的序列进行误码分析。

通过本次课程设计,我掌握了(7,3)循环码的编译码方法,并求出该码的最小码距及纠检错能力,通过观察该码通过高斯信道后的仿真结果,并参考其他编码方法,可发现循环码纠检错能力较强并且比较易用。

19

参考文献

[1] 曾凡鑫. 现代编码技术. 西安:西安电子科技大学出版社,2007;33-42 [2] 樊昌信.通信原理. 北京市:国防工业出版社,2009;79-83

[3] 李鹏.计算机通信技术及其程序设计.西安: 西安电子科技大学出版社,1999.6 ;67-73

[4]徐明远,邵玉斌 MATLAB仿真在通信与电子工程中的应用.西安:西安电子科技大学学出版社,2005.6;126

[5]曹志刚等著,现代通信原理,北京:清华大学出版社,2001.5。:65-78 [6]吴伟陵等著,移动通信原理,北京:电子工业出版社,2005:30-57 [7].李建新,现代通信系统分析与仿真-MATLAB 通信工具箱,西安:西安电子科技大学出版社,2000:13-45

[8]唐向宏,岳恒立,郑雪峰 MATLAB及在电子信息类课程中的应用(第二版).北京:电子工业出版社,2009.6;240-249

20

附 录

源程序代码如下

1.(15,7)循环码的编码

clear; clc;

a=input('请输入消息矢量:'); %高次项系数在前的生成多项式 Gx=[1 0 0 0 1 0 1 1 1];

%将数组a的高位依次放在数组Data的低位 Data=zeros(1,15); Data(1)=a(7); Data(2)=a(6); Data(3)=a(5);

Data(4)=a(4); Data(5)=a(3); Data(6)=a(2); Data(7)=a(1);

%Data除以Gx得到余数Rx [Qx,Rx]=deconv(Data,Gx); b=Rx+Data;

%将数组b的高位放在后面 c=b(1); b(1)=b(15); b(15)=c; c=b(2); b(2)=b(14); b(14)=c; c=b(3); b(3)=b(13);

21

b(13)=c; c=b(4); b(4)=b(12); b(12)=c; c=b(5); b(5)=b(11); b(11)=c; c=b(6); b(6)=b(10); b(10)=c; c=b(7); b(7)=b(9); b(9)=c;

%将数组b校正 for i=1:15

if rem(abs(b(i)),2)==0 b(i)=0;end end for i=1:15

if rem(abs(b(i)),2)==1 b(i)=1;end end

disp('输入序列:'); a

disp('编码输出序列:'); b

2.(15,7)循环码的编码 clear; clc;

r=[ 1 0 1 0 0 0];

0 1 0 0 22

1 1 0 0 1 h=[1,0,0,0,0,0,0,0;1,1,0,0,0,0,0,0;0,1,1,0,0,0,0,0;1,0,1,1,0,0,0,0;0,1,0,1,1,0,0,0;0,0,1,0,1,1,0,0;0,0,0,1,0,1,1,0;1,0,0,0,1,0,1,1;0,1,0,0,0,1,0,1;0,0,1,0,0,0,1,0;0,0,0,1,0,0,0,1;0,0,0,0,1,0,0,0;0,0,0,0,0,1,0,0;0,0,0,0,0,0,1,0;0,0,0,0,0,0,0,1]; b=flipud(h); s=r*b; for i=1:8

if rem(abs(s(i)),2)==0 s(i)=0;end end for i=1:8

if rem(abs(s(i)),2)==1 s(i)=1;end end

if s==[0 0 0 0 0 0 0 0]

e=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; elseif s==[1 0 0 0 0 0 0 0]

e=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]; elseif s==[1,1,0,0,0,0,0,0]

e=[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]; elseif s==[0,1,1,0,0,0,0,0]

e=[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]; elseif s==[1,0,1,1,0,0,0,0]

e=[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]; elseif s==[0,1,0,1,1,0,0,0]

e=[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]; elseif s==[0,0,1,0,1,1,0,0]

e=[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]; elseif s==[0,0,0,1,0,1,1,0]

e=[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]; elseif s==[1,0,0,0,1,0,1,1]

e=[0 0 0 0 0 0 0 1 0 0 0 0 0 0 0];

23

elseif s==[0,1,0,0,0,1,0,1]

e=[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]; elseif s==[0,0,1,0,0,0,1,0]

e=[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]; elseif s==[0,0,0,1,0,0,0,1]

e=[0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]; elseif s==[0,0,0,0,1,0,0,0]

e=[0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]; elseif s==[0,0,0,0,0,1,0,0]

e=[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]; elseif s==[0,0,0,0,0,0,1,0]

e=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]; else s==[0,0,0,0,0,0,0,1]

e=[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; end u=r+e; for i=1:7

if rem(abs(u(i)),2)==0 u(i)=0;end end for i=1:7

if rem(abs(u(i)),2)==1 u(i)=1;end end

Data=zeros(1,7); Data(1)=u(9); Data(2)=u(10); Data(3)=u(11); Data(4)=u(12); Data(5)=u(13); Data(6)=u(14);

24

Data(7)=u(15);

if e==[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

disp('没有错误:') k=0,else

disp('第几位错误:') k=find(e) ;end

disp('接收码字') r

disp('译码输出序列:') Data

3.循环码编码与解码Matlab源程序(实验以(7,4)循环码进行分析)

n = 7; %定义码长 k = 3; %信息位长

msg = randint(k*4,1,2); %随机提取信号,引起一致地分布的任意整数矩阵

subplot(2,2,1) stem(msg)

title('编码器输入信号')

p=cyclpoly(n,k) %循环码生成多项式,n=7,k=4 code = encode(msg,n,k,'cyclic',p); %编码函数,对信号进行差错编码 subplot(2,2,2) stem(code)

title('编码器输出信号')

recode=decode(code,n,k,'cyclic',p) %对信号进行译码,对接收到的码字进行译

码,恢复出原始的信息,译码参数和方式必须和编码时采用的严格相同

subplot(2,2,3)

25

stem(recode)

title('译码器输出信号') t=-1:0.01:1;

x=recode; %将recode赋值给x,并进行长度与fft设定

N=length(x); fx=fft(x); df=100/N; n=0:N/2; f=n*df; subplot(2,2,4);

plot(f,abs(fx(n+1))*2/N); grid; title('频谱图')

4、误码率与信噪比之间的关系程序(以(3,2)循环码进行测试)

n = 7; %定义码长 k = 3; %信息位长 Fs=40; %系统采样频率 Fd=1; %码速率 N=Fs/Fd; M=2; %进制数

for SNRpBit=1:100;%信噪比 SNR=SNRpBit/log2(M); %制造100个信息组,每组k位 msg = randint(100,k,[0,1]);

code = encode(msg,n,k,'cyclic/binary'); %加入噪声

%在已调信号中加入高斯白噪声 noisycode=awgn(code,SNR);

%将浮点数转化为二进制,波形整形过程 for i=1:100

26

for a=1:7

if noisycode(i,a)<0.5 noisycode(i,a) = 0; else

noisycode(i,a) = 1; end end end

%译码

newmsg = decode(noisycode,n,k,'cyclic'); %计算误码率

[number,ratio]=biterr(newmsg,msg); result(SNRpBit)=ratio;

disp(['The bit error rate is',num2str(ratio)]); end

%不同信噪比下循环码经过加性高斯白噪声信道的误码率 figure(1) stem(result);

title('循环码在不同信噪比下的误码率') legend('误码率','*') xlabel('信噪比');

ylabel('在加性高斯白噪声下的误码率');

27

致 谢

课程设计写到这里已接近尾声,在本文完成之际,首先,我要特别感谢我的指导老师郑玉峰老师,在他的谆谆教导和督促之下,我才顺利的完成了我的课程设计工作,在这段时间里,我又学到了新的知识。其次,我还要感谢这三年来给予我辛勤教育的老师们,他们不仅教会了我扎实的专业知识,还教会了我如何为人处事,在此对他们致以最诚挚的谢意!没有他们的帮助和教导,就没有今天的这份课程设计,再次为他们的付出表示由衷的感谢。

另外,我还要感谢在论文撰写过程中给我帮助的同学们,特别是和我同宿舍的他们,他们给予了我很大的帮助和支持,是他们无私的付出才成就了我今天的成功,谢谢!

不仅是知识方面,在编程能力方面我也有了很大的提高,我们一次又一次的修改调试所设计的程序,不断研究那些代码,不懂的地方就查阅网上和图书馆的资料,最终成功运行,使我的编程能力得到锻炼。

同时,和班里同学一起讨论,共同解决问题,查到了有用的资料,就大家一起分享,我们合理的分工,才能高效的完成这次课设,而且促进了同学之间的相互了解,加深了我们的友谊,提高了我们的团队协作精神。

经过这次课程设计,我深深体会到了从书本学习与实际应用中的不同,这种感同身受必将对我们今后的学习与生活带来很大的帮助。在大学阶段,理论的学习和实践是密不可分的。离开了实践的理论是没有任何意义可言的,理论是需要伴随着实践才能完善。

最后,在这里,我还要非常感谢郑老师给予我的帮助,以前很少与他进行交流,但是通过这次课程设计,他让我学到了很多以前没有学到的东西也让我明白了自己的不足,在以后的日子里,我会不断的努力学习,珍惜每次机会,把专业学好,并锻炼自己独立思考问题的能力,理论联系实际才能学以致用,才能真正锻炼自己的能力,取得更大的进步!

28

因篇幅问题不能全部显示,请点此查看更多更全内容