视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
2015--通信系统课程设计
2025-09-25 17:42:16 责编:小OO
文档
课程设计任务书

 

学生姓名:    罗序森           专业班级:  通信gj1101        

指导教师:     方艺霖          工作单位:  武汉理工大学       

题  目:  通信系统课群综合训练与设计

 

初始条件

 1)MATLAB软件

 2)通信原理各模块相关知识

 

要求完成的主要任务: 

主要任务:利用仿真软件(如Matlab或SystemView),或硬件实验系统平台上设计完成一个典型的通信系统其中信源为随机确定的一个模拟时间函数,数字化方式采用PCM编码,基带码为HDB3码,信道码采用循环码,调制方式为PSK,信道类型为衰落信道。

要求:掌握以上各种电路与通信技术的基本原理,掌握实验的设计、电路调试与测量的方法。

 

时间安排:

序号设  计   内   容

所用时间
1根据设计任务,分析电路原理,确定实验方案2天

2根据实验条件进行电路的测试,并对结果进行分析7天

3撰写课程设计报告1天

合    计

2周

 

 

指导教师签名:                               年     月    日

 

系主任(或责任教师)签名:                   年     月    日

摘要

通信系统是一个十分复杂的系统,在具体实现上有多种多样的方法,但总的 过程却是具有共性的。对于一个模拟信号数字化传输,过程可分为数字化,信源编解码,信道编解码,调制解调,加扰等。本实验利用MATLAB实现了PCM编码,HDB3码,循环码,PSK调制,衰落信道及对应的解调过程,完整实现了一个通信系统的全部过程。

MATLAB是由美国Mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。

关键字: 通信系统 循环码 PSK调制 衰落信道 MATLAB

Abstract

Communication system is a very complicated system in the implementation of a variety of methods. But the process has general characters. For a analog signal digital transmission, the process can be divided into digital, source decoding, channel decoding, modem, scrambling, etc. This experiment using MATLAB the delta modulation, Miller code, cycle code, PSK modulation, fading channel and the corresponding demodulation process, complete implements a communication system of all process.

MATLAB is a high-level technical computing language and interactive environment for algorithm development, data visualization, data analysis, and numeric computation. Using MATLAB, you can solve technical computing problems faster than with traditional programming languages, such as C, C++, and Fortran.

Keywords: Communication system  cycle code  PSK modulation  fading channel  MATLAB

1 课程设计任务与要求

1.1课程设计的目的

通过课程设计,使学生加强对电子电路的理解,学会对电路分析计算以及设计。进一步提高分析解决实际问题的能力,通过完成综合设计型和创新性实验及训练,创造一个动脑动手﹑开展电路实验的机会,锻炼分析﹑解决电子电路问题的实际本领,实现由课本知识向实际能力的转化;加深对通信原理的理解,提高学生对现代通信系统的全面认识,增强学生的实践能力。

1.2课程设计的任务与要求

要求利用仿真软件(如Matlab或SystemView),或硬件实验系统平台上设计完成一个典型的通信系统(如图1-1所示)。其中信源为随机确定的一个模拟时间函数,数字化方式采用PCM编码,基带码为HDB3码,信道码采用循环码,调制方式为PSK,信道类型为衰落信道。要求完成整个系统各环节以及整个系统的仿真,最终在接收端或者精确或者近似地再现输入(信源),计算失真度,并且分析原因。

图1.1 典型的通信系统

2 PCM(脉冲编码调制)编译码

2.1脉冲编码调制的基本原理

把从模拟信号抽样、量化,直到变换成为二进制符号的基本过程,称为脉冲编码调制,简称脉码调制。

如:在下图中,模拟信号的抽样值为3.15,3.96,5.00,6.38,6.80和6.42。若按照“四舍五入”的原则量化为整数值,则抽样值量化后变为3,4,5,6,7和6。在按照二进制数编码后,量化值(quantized value)就变成二进制符号:011、100、101、110、111和110。

图2.1 二进制编码原理

图2.2  PCM系统的原理方框图

2.2 逐次比较法编码

上节编码器(a)中的量化器和编码器常构成一个不能分离的编码电路,这种编码电路有不同的实现方案,最常用的一种方案成为逐次比较法编码,其基本原理方框图如下图所示。

图2.3 逐次比较法编码原理方框图

图中示出一个3位编码器。其输入信号抽样脉冲值在0和7.5之间。它将输入模拟抽样脉冲编成3位二进制编码c1 c2 c3。

图中输入信号抽样脉冲电流Is由保持电路短时间保持,并和几个称为权值电流的标准电流Iw逐次比较。每比较一次,得出1位二进制码。权值电流Iw是在电路中预先产生的。Iw的个数决定于编码的位数,现在共有3个不同的Iw值。因为表示量化值的二进制码有3位,即c1c2c3。它们能够表示8个十进制数,从0至7,如下表所示。 

量化值c1c2c3量化值c1c2c3
00004100
10015101
20106110
30117111
表1 编码表

因此,若按照“四舍五入”原则编码,则此编码器能够对-0.5至+7.5之间的输入抽样值正确编码。

由此表可推知,用于判定c1值的权值电流Iw=3.5,即若抽样值Is < 3.5,则比较器输出c1 = 0;若Is > 3.5,则比较器输出c1 = 1。c1除输出外,还送入记忆电路暂存。

第二次比较时,需要根据此暂存的c1值,决定第二个权值电流值。若c1 = 0,则第二个权值电流值Iw = 1.5;若c1 = 1,则Iw = 5.5。第二次比较按照此规则进行:若Is < Iw,则c2 = 0;若Is > Iw,则c2 = 1。此c2值除输出外,也送入记忆电路。

2.3 折叠二进制码原理

表1给出的二进制编码是按照二进制数的自然规律排列的,称为自然二进制码。但这不是唯一编码方法,常用的还有折叠二进制码。折叠二进制码是用最高位表示电压的极性正负,而用其他位来表示电压的绝对值。这就是说,在用最高位表示极性后,双极性电压可以采用单极性编码方法处理,从而使编码电路和编码过程大为简化。折叠码的另一个优点是误码对于小电压的影响较小。

在13折线法中采用的折叠码有8位。其中第一位c1表示量化值的极性正负。后面的7位分为段落码和段内码两部分,用于表示量化值的绝对值。其中第2至4位(c2 c3 c4)是段落码,共计3位,可以表示8种斜率的段落;其他4位(c5 ~ c8)为段内码,可以表示每一段落内的16种量化电平。段内码代表的16个量化电平是均匀划分的。所以,这7位码总共能表示27 = 128种量化值。在下面的表中给出了段落码和段内码的编码规则。

段落序号段落码

c2 c3 c4

段落范围 

(量化单位)

段落序号段落码 

c2 c3 c4

段落范围 

(量化单位)

81111024~20484011~128
7110512~1024301032~
6101256~512200116~32
5100128~25610000~16
表2 段落码编码规则

量化间隔段内码

c5 c6 c7 c8

量化间隔段内码

c5 c6 c7 c8

量化间隔段内码

c5 c6 c7 c8

量化间隔段内码

c5 c6 c7 c8

1511111110117011130011
1411101010106011020010
131101910015010110001
121100810004010000000
表3 段内码编码规则

在上述编码方法中,虽然段内码是按量化间隔均匀编码的,但是因为各个段落的斜率不等,长度不等,故不同段落的量化间隔是不同的。其中第1和2段最短,斜率最大,其横坐标x的归一化动态范围只有1/128。再将其等分为16小段后,每一小段的动态范围只有(1/128)*(1/16) = 1/2048。这就是最小量化间隔,后面将此最小量化间隔(1/2048)称为1个量化单位。第8段最长,其横坐标x的动态范围为1/2。将其16等分后,每段长度为1/32。假若采用均匀量化而仍希望对于小电压保持有同样的动态范围1/2048,则需要用11位的码组才行。现在采用非均匀量化,只需要7位就够了。

2.4逐次比较法译码原理 

下图所示编码器中虚线方框内是本地译码器,而接收端译码器的核心部分原理就和本地译码器的原理一样。

 

图2.4 逐次比较法非均匀编码器原理框图

在此图中,本地译码器的记忆电路得到输入c7值后,使恒流源产生为下次比较所需要的权值电流Iw。在编码器输出c8值后,对此抽样值的编码已经完成,所以比较器要等待下一个抽样值到达,暂不需要恒流源产生新的权值电流。

在接收端的译码器中,仍保留本地译码器部分。由记忆电路接收发送来的码组。当记忆电路接收到码组的最后一位c8后,使恒流源再产生一个权值电流,它等于最后一个间隔的中间值。在上如中,此中间值等于1248。由于编码器中的比较器只是比较抽样的绝对值,本地译码器也只是产生正值权值电流,所以在接收端的译码器中,最后一步要根据接收码组的第一位c1值控制输出电流的正负极性。

2.5 MATLAB编程实现PCM编译码

1、PCM编码流程图                            2、PCM译码流程图

      图2.5 编码流程图                           图2.6译码流程图

3 HDB3码编解码

3.1 AMI码编码基本原理

AMI码的全称为传号交替反转码,其编码规则为将消息码的“1”(传号)交替地变换为“+1”和“-1”,而“0”(空号)保持不变。如:

    消息码: 0   1   1  0 0 0 0 0 0 0   1  1 0 0   1  1…

    AMI码: 0  -1  +1  0 0 0 0 0 0 0 –1 +1 0 0 –1  +1… 

AMI码对应的波形是具有正、负、零三种电平的脉冲序列。它可以看成是单极性波形的变形,即“0”仍对应零电平,而“1”交替对应正负电平。

AMI码的优点:没有直流成分,且高、低频分量少,编译码电路简单,且可利用传号极性交替这一规律观察误码情况;如果它是AMI-RZ波形,接收后只要全波整流,就可变为单极性RZ波形,从中可以提取位定时分量

AMI码的缺点:当原信码出现长连“0”串时,信号的电平长时间不跳变,造成提取定时信号的困难。解决连“0”码问题的有效方法之一是采用HDB3码。

3.2 HDB3码编码基本原理

HDB3码的全称为3阶高密度双极性码,它是AMI码的一种改进型,改进目的是为了保持AMI码的优点而克服其缺点,使连“0”个数不超过3个。 其编码规则是:

(1)检查消息码中“0”的个数。当连“0”数目小于等于3时,HDB3码与AMI码一样,+1与-1交替;

(2)连“0”数目超过3时,将每4个连“0”化作一小节,定义为B00V,称为破坏节,其中V称为破坏脉冲,而B称为调节脉冲;

(3)V与前一个相邻的非“0”脉冲的极性相同(这破坏了极性交替的规则,所以V称为破坏脉冲),并且要求相邻的V码之间极性必须交替。V的取值为+1或-1;

(4)B的取值可选0、+1或-1,以使V同时满足(3)中的两个要求; 

(5)V码后面的传号码极性也要交替。 

如:消息码:   1 0 0 0  0  1  0 0 0 0  1 1 0 0 0 0   0 0 0  0  l  1

    AMI码:  -1 0 0 0  0 +1  0 0 0 0  -1 +1 0 0 0 0   0 0 0  0  -1 +1

    HDB3码: -1 0 0 0 –V +1  0 0 0 +V -1 +1-B 0 0–V  +B 0 0 +V -l +1

其中的V脉冲和B脉冲与1脉冲波形相同,用V或B符号表示的目的是为了示意该非“0”码是由原信码的“0”变换而来的。

HDB3码既要包含AMI的交替特性使输出无直流特性,又要不出现四个以上的连0,因此可以先满足后者。

  1)把“0000”换为取代节。

  规则:先将“0000”分离开来,第一个“0000”直接变为“0000”,然后数相邻两个“0000”之间“1”的个数,奇数则变为“000V”,偶数则变为“B00V”。

  2)更新符号。

  根据HDB3码的编码规则有:B总是与其前面的1或V符号相反,V总是与前面的1或B相符号相同,1总是与前面的V或B符号相反,就可编符号了。

 例如:

消息代码:1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1

中间码: 1 0 0 0 V 1 0 0 0 V 1 1 B 0 0 V 1 1 B 0 0 V B 0 0 V 1 1 1 0 0 0 V 1

HDB3码:+1 0 0 0 +V -1 0 0 0 -V +1 -1 +B 0 0 + V -1 +1 -B 0 0 -V +B 0 0 +V -1 +1 -1 0 0 0 -V +1

3.3 HDB3码的译码

HDB3码的编码虽然比较复杂,但译码却比较简单。从上述编码规则看出,每一个破坏脉冲V总是与前一非“0”脉冲同极性(包括B在内)。这就是说,从收到的符号序列中可以容易地找到破坏点V,于是也断定V符号及其前面的3个符号必是连“0”符号,从而恢复4个连“0”码,再将所有-1变成+1后便得到原消息代码。解码规则如下:

1)若3连“0”前后非零脉冲同极性,则将最后一个非零元素译为零,如+1000+1 就应该译成“10000”;若2连 “0”前后非零脉冲极性相同,则两零前后都译为零,如-100-1,就应该译为0000。

2)再将所有的-1变换成+1后,就可以得到原消息代码。

3.4 MATLAB实现HDB3码编解码

    1、HDB3码编码                             2、HDB3码解码

图3.1  HDB3编码流程图                             图3.2  HDB3解码流程图

4 信道编码循环码编译码

4.1 循环码编译码原理与特点

设C使某线性分组码的码字集合,如果对任,它的循环移位也属于C,则称该码为循环码。

该码在结构上有另外的,即一个码字任意循环移位的结果仍是一个有效码字。其特点是:(1)可以用反馈移位寄存器很容易实现编码和伴随式的计算;(2)由于循环码有很多固有的代数结构,从而可以找到各种简单使用的译码办法。

循环码特点有:

1)循环码是线性分组码的一种,所以它具有线性分组的码的一般特性,且具有循环性,纠错能力强。

2)循环码是一种无权码,循环码编排的特点为相邻的两个数码之间符合卡诺中的邻接条件,即相邻数码间只有一位码元不同,因此它具有一个很好的优点是它满足邻接条件,没有瞬时错误(在数码变换过程中,在速度上会有快有慢,中间经过其他一些数码形式,即为瞬时错误)。

3)码字的循环特性,循环码中任一许用码经过牡环移位后,所得到的码组仍然是许用码组。

4.2循环码编码原理

有信息码构成信息多项式,其中最高幂次为k-1;

用乘以信息多项式m(x),得到的,最高幂次为n-1,该过程相当于把信息码(,,……,,)移位到了码字德前k个信息位,其后是r个全为零的监督位;

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

1)有信息码构成信息多项式m(x)=mk-1xk-1+``````m0

其中高幂次为k-1。

2)用xn-k乘上信息多项式m(x),得最高幂次为n-1,做移位。

3)用g(x)除xn-km(x)和到余式r(x)。

4.3循环码译码原理

1)有接收到的y(x)计算伴了随式s(x)。

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

3)计算c^(x)=y(x)+e^(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)循环码中的一位错误。

4.4 MATLAB实现循环码编译码

循环码的编译码原理相对复杂,但是MATLAB软件中有可以直接对二进制序列进行编译码的函数,分别为encode编码函数和decode译码函数,它们的用法如下:

1)encode函数

功能:编码函数

语法:code=encode(msg,N,K,method,opt)

说明:用method指定的方法完成纠错编码。其中msg代表信息码元,是一个K列矩阵,N是编码后的码字长度;K是信息位的长度;opt是有些编码方式需要的参数。

2)decode函数

功能:译码函数

语法:msg=decode(code,N,K,method,opt1,opt2,opt3,opt4); 

说明:这个函数对接收到的码字进行译码,恢复出原始的信息,译码参数和方式必须和编码时采用的严格相同。它对接收到的码字,按method指定的方式进行译码;opt1,…,opt4是可选项的参数。

利用这两个函数可以很方便的实现循环码的编译码,使用(7,4)码进行编解码,循环码编码时,函数变量中的method应为cyclic。

5 2PSK调制与解调

5.1数字调制技术

为了使数字信号在带通信道中传输,必须用数字基带信号对载波进行调制以使信号与信道的特性相匹配。这种用数字信号控制载波,把数字基带信号变换为数字带通信号(已调信号)的过程成为数字调制。在接收端通过解调器把带通信号还原成数字基带信号的过程成为数字解调。通常把包括调制和解调过程的数字传输系统叫做数字带通传输系统。

一般来说,数字调制与模拟调制的基本原理相同,但是数字调制有离散取值的特点。因此数字调制技术有两种方法:

①利用模拟调制的方法去实现数字式调制;

②通过开关键控载波,通常称为键控法。基本键控方式有振幅键控、频移键控、相移键控。

  振幅键控                频移键控              相移键控

图5.1 正弦载波的三种键控波形

5.2 二进制相移键控(2PSK)基本原理

数字调制可分为二进制调制和多进制调制。

相移键控是利用载波的相位变化来传递数字信息,而振幅和频率保持不变。在2PSK中,通常用初始相位0和π分别表示二进制“1”和“0”。因此,2PSK信号的时域表达式为:

式中,   n表示第n个符号的绝对相位:

因此,上式可以改写为

由于表示信号的两种码元的波形相同,极性相反,故2PSK信号可以表述为一个双极性全占空矩形脉冲序列与一个正弦载波的相乘:

式中

这里,g(t)是脉宽为Ts的单个矩形脉冲,而an的统计特性为

即发送二进制符号“0”时,e2psk(t)取0相位;发送二进制符号“1”时,e2psk(t)取π相位。这种以载波的不同相位直接去表示相应二进制数字信号的调制方式,称为二进制绝对相移方式。

 

(a)模拟调制的方法

 

(b)键控法

图5.2  2PSK信号调制器原理方框图

2PSK信号的解调通常采用相干解调法,解调器原理框图如下图5.3所示。假设数字信息为“10011”,相干解调各点波形如下图5.4所示。

图5.3 2PSK信号的解调原理框图

图5.4 2PSK信号相干解调时各点时间波形

5.3 MATLAB实现2PSK调制与解调

1、2PSK调制流程图                        2、2PSK解调流程图

图5.5  2psk调制                          图5.6  2psk解调

5.4 瑞利衰落信道方案设计

本次课程设计中要求使用衰落信道,我们采用较为简单的瑞利衰落信道,在无线通信信道环境中,电磁波经过反射折射散射等多条路径传播到达接收机后,总信号的强度服从瑞利分布。 同时由于接收机的移动及其他原因,信号强度和相位等特性又在起伏变化, 故称为瑞利衰落。瑞利衰落中最简单的模型就是两个高斯噪声矢量模的平方开方,即是产生的瑞丽衰落信道模型,在MATLAB软件中很容易实现。

瑞利衰落信道是一种无线电信号传播环境的统计模型。这种模型假设信号通过无线信道之后,其信号幅度是随机的,即“衰落”,并且其包络服从瑞利分布。在MATLAB软件中有可以产生瑞利衰落信道的函数即rayleignchan函数,用此函数便可以产生一个简单的瑞利衰落信道。

6 MATLAB软件仿真

6.1 发送端仿真结果

6.1.1 PCM编码仿真

图6.1 原始信号与PCM编码输出

6.1.2 HDB3码及循环码编码仿真

图6.2 HDB3编码与循环码信号输出

6.1.3 2PSK调制以及衰落信道仿真

图6.3  2PSK调制信号与加噪信号

6.2 接收端仿真结果

6.2.1 2PSK解调仿真

图6.4  2PSK信号相干解调时间波形

6.2.2 循环码及HDB3码解码仿真

图6.5 HDB3码解码信号输出

6.2.3 PCM解码仿真

图6.6  PCM解码信号输出

6.3 仿真结果分析

由以上图可知,并比较PCM编码信号、HDB3码编码信号、汉明码编码信号可看出代码正确,能够实现PCM编码、HDB3编码、汉明码编码的功能。比较汉明码编码信号、2PSK调制信号与2PSK解调信号可看出,2PSK调制与解调代码正确,可实现2PSK调制与解调。比较原始正弦信号与输出信号波形可看出,最终在接收端能够近似地再现信源,实现整个通信系统的仿真。

6 小结与体会

做通信群课设这段时间是大四以来最忙的一段时间,不仅面临着要考研找工作的压力,还要面临着要做课程设计的压力。刚开始拿到题目时,觉得不是很难,但是认真地做起来发现还是有一定的难度的,于是便去图书馆找各种关于MATLAB与通信的资料书,认真努力地阅读各方面的知识,才有了一定的领悟,渐渐有了自己的课设方案,然后便开始动手实践起来,动手实践的过程当然是比较痛苦的,需要自己不断地开发自己的思维,并且通过无数次的改错纠错才能得到比较正确的结果,不过幸好大学前三年已经很认真在学习有关方面的知识了,已经有了较为深厚的积累,这些也不足以成为问题,在自己的努力与同学老师的帮助指导下,终于在一周的时间内完成了相应的程序代码的编写,然后就是写报告了,写报告向来是我的弱项,花了两三天的时间终于完成了报告的书写,这对我来说是一个更累的过程,至此差不多就完成了课设的任务。

最后,还要感谢方艺霖老师对我们认真负责地指导,还有通信原理老师李平安老师之前认真地讲解通信原理的知识,还有身边默默帮助我的同学们,有了你们我才能顺顺利利地完成了整个课设。这次课程设计受益匪浅,是我的能力有了很大的提升。

参考文献

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

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

[3]樊昌信,张甫翊,徐炳祥,吴成柯.通信原理.第5版.国防工业出版社,2007

[4]郭仕剑,王宝顺,贺志国,杨可心.MATLAB7.X数字信号处理.人民邮电出版,2006

[5]孙祥,徐流美,吴清.MATLAB7.0基础教程.清华大学出版社,2006

附录

程序代码:

一、主程序:

clear;

clc;

%原始信号与PCM编码

t=[0:0.3:2*pi];   s=sin(t);

code=pcm(s);    figure(1);

subplot(2,1,1);plot(t,s); title('原始正弦信号');

subplot(2,1,2);stairs([0:length(code(1:))-1],code(1:));

axis([0 length(code(1:)) -2 2]);title('PCM编码信号输出');

%HDB3编码

xn=code(1:21*8);             % 输入单极性码/ AMI码的编码

yn=xn;                      % 输出yn初始化

num=0;                     % 计数器初始化

for k=1:length(xn)

   if xn(k)==1

      num=num+1;           % "1"计数器

         if num/2 == fix(num/2) % 奇数个1时输出-1,进行极性交替

              yn(k)=1;

         else

              yn(k)=-1;

         end

    end

end

num=0;                % 连零计数器初始化

yh=yn;                 % 输出初始化

sign=0;                 % 极性标志初始化为0

V=zeros(1,length(yn));    % V脉冲位置记录变量 

B=zeros(1,length(yn));    % B脉冲位置记录变量

for k=1:length(yn)

   if yn(k)==0

       num=num+1;     % 连“0”个数计数

       if num==4        % 如果4连“0”

         num=0;        % 计数器清零

         yh(k)=1*yh(k-4); % 让0000最后一个0改变为与前一个非零符号相同极性的符号

         V(k)=yh(k);       % V脉冲位置记录

         if yh(k)==sign     % 如果当前V符号与前一个V符号的极性相同

            yh(k)=-1*yh(k); % 让当前V符号极性反转,以满足V符号间相互极性反转要求

            yh(k-3)=yh(k);  % 添加B符号,与V符号同极性

            B(k-3)=yh(k);   % B脉冲位置记录

            V(k)=yh(k);     % V脉冲位置记录

            yh(k+1:length(yn))=-1*yh(k+1:length(yn));

                           % 并让后面的非零符号从V符号开始再交替变化

         end

       sign=yh(k);          % 记录前一个V符号的极性

     end

  else      num=0;                % 当前输入为“1”则连“0”计数器清零

  end

end                         % 编码完成

re=[xn',yn',yh',V',B'];           % 结果输出: xn AMI HDB3 V&B符号

figure(2);

subplot(3,1,1);stairs([0:length(code(1:))-1],code(1:));

axis([0 length(code(1:)) -2 2]);title('PCM编码信号输出')

subplot(3,1,2);stairs([0:length(yh(1:))-1],yh(1:));

axis([0 length(yh(1:)) -2 2]);title('HDB3码信号输出');

%循环码编码

yh1=abs(yh)-yh;

p=cyclpoly(7,4);

ym=encode(abs(yh),7,4,'cyclic',p);

subplot(3,1,3);stairs([0:length(ym(1:))-1],ym(1:));axis([0 length(ym(1:)) -2 2]);

title('循环码信号输出')

%PSK调制

N=length(ym);             %调制序列的长度 

fc=10;                   %载波频率

datat=0.01;               %时域采样间隔

fs=1/datat;               %频率分辨率

df=0.01;                 %频率缩放系数

t1=0:datat:N;             %设每个码元长度为1ms 时间矢量:0:N

m=ym;                  %产生调制序列

for i=1:length(m)

    if(m(i)==1)

        for j=1:1/datat;

            psk_p(j+(i-1)*(1/datat))=pi;        %1码的对应的相位为[pi](采用a方式)

            mm(j+(i-1)*(1/datat))=1;          %为了画码元时域波形需要

        end

    elseif(m(i)==0)

        for j=1:1/datat;

            psk_p(j+(i-1)*(1/datat))=0;        %0码的对应的相位为[0](采用a方式)

            mm(j+(i-1)*(1/datat))=0;          %为了画码元时域波形需要

        end

    end

end

if(m(i)==1)  nn=pi/2;                          

else   nn=-(pi/2);

end

psk_p=[psk_p,nn];                          %使p的长度与t相同,psk_p为根据不同码元产生不同的调制相位

c=cos(2*pi*fc*t1+psk_p);                    %2psk信号产生

[C,c,df1]=fftseq(c,datat,df);                   %2fsk信号的傅立叶变换

[MM,mm,df1]=fftseq(mm,datat,df);            %基带信号的傅立叶变换

f=[0:df1:df1*(length(mm)-1)]-fs/2;          %频率作图矢量

%瑞利衰落信道

fd=0;                                       %多普勒频移为0

 td=1000;

chan=rayleighchan(td,fd)                    %瑞丽落信道

psk1=filter(chan,c);                        %信号通过瑞丽衰落信道

figure(3);

subplot(3,1,1);plot(t1,mm(1:length(t1)));axis([0,5,-1.5,1.5]);

xlabel('时间 ms');title('未调信号');ylabel('幅值 :v');

subplot(3,1,2);plot(t1,c(1:length(t1)));axis([0,5,-1.5,1.5]);

xlabel('时间 ms');title('2PSK信号');ylabel('幅值 :v');

subplot(3,1,3);plot(t1,psk1(1:length(t1)));axis([0,5,-1.5,1.5]);

title('调制信号通过衰落信道后幅度特性图');

%PSK解调

carwav=2*cos(2*pi*fc.*t1);

[CF,carwav,df1]=fftseq(carwav,datat,df);

n_off=(fc-1)/df;

n0=floor((fc-2)/df1):floor((fc+2)/df1);

BP=zeros(1,length(f));

BP(min(n0):max(n0))=ones(1,length(n0));      %带通滤波器设计

BP(length(BP)-max(n0):length(BP)-min(n0))=ones(1,length(n0));

H=zeros(1,length(f));

H(1:n_off)=2*ones(1,n_off);                 % 低通滤波器设计 (矩形窗截取)

H(length(f)-n_off+1:length(f))=2*ones(1,n_off);

CC=C.*BP;                              %接收时经过一个带通滤波器

cc=ifft(CC);                              %反傅立叶变换

c_re=cc.*carwav;                         %乘以载波进行相干解调

cc1=c_re;  [c_reF,c_re,df1]=fftseq(c_re,datat,df); 

c_reF=c_reF.*H;                          %经过低通滤波器

c_ref=ifft(c_reF);

for i=1 : length(m)                         % 判决

    if(c_ref((i-1)*(1/datat)+(1/(2*datat)))<0)   % 判决规则:  >0  => 0

            m_de(i)=1;                   % 否则      <0  => 1

            for j=1:1/datat

                c_de(j+(i-1)*(1/datat))=1;   %为了画解调波形需要

            end

    else    m_de(i)=0;

            for j=1:1/datat

                c_de(j+(i-1)*(1/datat))=0;    %为了画解调波形需要

            end

    end

end

c_de=[c_de,c_re(i)];figure(4);

subplot(3,2,1);plot(t1,c(1:length(t1)));axis([0,5,-2,2]);    

xlabel('时间 ms');title('调制信号');ylabel('幅值 :v');

subplot(3,2,2);plot(t1,carwav(1:length(t1)));axis([0,5,-2,2]);

xlabel('时间 ms');title('载波恢复');ylabel('幅值 :v');

subplot(3,2,3);plot(t1,c_re(1:length(t1)));axis([0,5,-2,2]);

xlabel('时间 ms');title('载波相乘');ylabel('幅值 :v');

subplot(3,2,4);plot(t1,c_ref(1:length(t1)));axis([0,5,-2.5,2.5]);

xlabel('时间 ms');title('低通滤波后信号');ylabel('幅值 :v');

subplot(3,2,5);plot(t1,c_de(1:length(t1)));axis([0,5,-1.5,1.5]);

xlabel('时间 ms');title('解调信号');ylabel('幅值 :v');

%循环码解码和HDB3码解码

for m=1:100*length(yh)

if c_ref(m)<-0.2

        c_ref(m)=1;

elseif -0.2<=c_ref(m)<=0.2;

        c_ref(m)=0;

elseif c_ref(m)>0.2

        c_ref(m)=-1;

    end

end

subplot(3,2,6);

plot(abs(c_ref));

axis([0 100*length(yh) -2 2]);

title('经过抽样判决后信号波形')

deco1=zeros(1,length(yh));

for i=1:length(yh)

if (c_ref((i-1)*100+50))<-0.1

        deco1(i)=-1;

elseif -0.1<(c_ref((i-1)*100+50))<0.1

deco1(i)=0;(c_ref((i-1)*100+50))>=0.1

        deco1(i)=1;

elseif (c_ref((i-1)*100+50))>=0.1

        deco1(i)=1;

    end

end

deco1=abs(deco1);

%PCM译码

deco2=ipcm(deco1);

figure(6);

plot(t,deco2); title('输出信号');

二、相关函数:

%PCM编码程序

function code=pcm(S)                      %S为输入信号

z=sign(S);                                %判断S的正负

MaxS=max(abs(S));                        %求S的最大值 

S=abs(S/MaxS);                           %归一化

Q=2048*S;                               %量化

code=zeros(length(S),8);                    %代码存储矩阵(全零)

%段落码判断程序

for i=1:length(S)

if (Q(i)>=128)&(Q(i)<=2048)

        code(i,2)=1;            %在第五段与第八段之间,段位码第一位都为“1”

    end

if (Q(i)>32)&(Q(i)<128)||(Q(i)>=512)&(Q(i)<=2048)

        code(i,3)=1;            %在第三四七八段内,段位码第二位为“1”

    end

if (Q(i)>=16)&(Q(i)<32)||(Q(i)>=)&(Q(i)<128)||

(Q(i)>=256)&(Q(i)<512)||(Q(i)>=1024)&(Q(i)<=2048)

        code(i,4)=1;            %在二四六八段内,段位码第三位为“1”

    end

end 

%段内码判断程序

N=zeros(length(S));

for i=1:length(S)

N(i)=bin2dec(num2str(code(i,2:4)))+1;        %找到code位于第几段

end

a=[0,16,32,,128,256,512,1024];            %量化间隔

b=[1,1,2,4,8,16,32,];                     %除以16,得到每段的最小量化间隔

 for i=1:length(S)  

     q=ceil((Q(i)-a(N(i)))/b(N(i)));          %求出在段内的位置

     if q==0

         code(i,(5:8))=[0,0,0,0];            %如果输入为零则输出“0”

     else k=num2str(dec2bin(q-1,4));         %编码段内码为二进制

     code(i,5)=str2num(k(1));

     code(i,6)=str2num(k(2));

     code(i,7)=str2num(k(3));

     code(i,8)=str2num(k(4));

     end

if z(i)>0

        code(i,1)=1;

elseif z(i)<0

        code(i,1)=0;

    end                                  %符号位的判断

end

%PCM译码程序

function S=ipcm(code) 

l=size(code,1);                           %求出输入码组的个数

a=[0,16,32,,128,256,512,1024];           %段落起点值

b=[1,1,2,4,8,16,32,];                    %每段的最小量化间隔

c=[0,1.5:15.5];                           %段内码平均值

for i=1:l

    x=code(i,1);                         %取符号

    T=bin2dec(num2str(code(i,(2:4))))+1;    %判断段落位置

    Y=bin2dec(num2str(code(i,(5:8))));      %判断段内位置

    if Y==0

        k(i)=a(T)/2048;                  %段内码为零时

    else 

        k(i)=(a(T)+b(T)*c(Y))/2048;       %还原出量化后的电平值

    end

    if x==0                             %判断符号位

       S(i)=-k(i);

    else 

        S(i)=k(i);

    end

end

%时间序列m的FFT函数

function [M,m,df]=fftseq(m,ts,df)

%生成M,它是时间序列m的FFT,对序列填充零,以满足所要求的频率分辨率df

%ts是采样间隔,输出df是最终的频率分辨率,输出m是输入m的补过零的版本

fs=1/ts;

if nargin==2   %函数变量个数为2,表示[M,m,df]=fft(m,ts)

    n1=0;

else          %否则函数变量个数为3,表示[M,m,df]=fftseq(m ,ts,df)

    n1=fs/df;

end

n2=length(m);                         %求序列长度

n=2^(max(nextpow2(n1),nextpow2(n2)));  %将n1或n2值按2的幂次度量,取大者

M=fft(m,n);                           %得到FFT

m=[m,zeros(1,n-n2)];                   %时间序列补零

df=fs/n;                              %得到最终的频率分辨率下载本文

显示全文
专题