通信系统课程设计报告.docx
《通信系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《通信系统课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
![通信系统课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-3/20/4b0b81bd-34e1-470f-822c-07e6063cdc2f/4b0b81bd-34e1-470f-822c-07e6063cdc2f1.gif)
通信系统课程设计报告
引言…………………………………………………………2
一、相关知识介绍…………………………………………2
(1)QAM调制解调原理……………………………………………3
(2)QAM的解调和判决……………………………………………4
二、设计内容及要求………………………………………5
(1)设计内容……………………………………………...........5
(2)技术要求……………………………………………….......5
(3)设计步骤及要求…………………………………………......5
三、程序流程图及设计方案……………………….…..….5
(1)程序流程图……………………………………………....….5
(2)设计方案……………………………………………………5
四、仿真结果及分析…………………………………...….7
(1)信号接收图……………………………………...……….….8
(2)误码率曲线图………………………………………………..8
五、课程设计总结………………………………………….8
六、参考文献……………………………………………….9
附录…………………………………………………………10
引言
本次课程设的代码编写和仿真均基于Matlab仿真软件。
Matlab是矩阵实验室(MatrixLaboratory)的简称,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。
介绍了高斯信道下的16QAM误码率分析的设计方案,并着重介绍了各部分的设计思路及仿真。
整个设计配以误码率和信噪比的性能曲线图和信号接受图加以辅助说明。
设计共有三大组成部分:
一是代码的编写及设计思路,本部分详细讲解了本次设计的理论实现,是关键部分;二是仿真结果及分析,这部分是为了分析设计是否合理,便于理;最后是对本次课程设计的总结。
一、相关知识介绍
QAM是一种矢量调制,将输入比特先映射(一般采用格雷码)到一个复平面(星座)上,形成复数调制符号,然后将符号的I、Q分量(对应复平面的实部和虚部,也就是水平和垂直方向)采用幅度调制,分别对应调制在相互正交(时域正交)的两个载波(coswt和sinwt)上。
这样与幅度调制(AM)相比,其频谱利用率将提高1倍。
QAM是幅度、相位联合调制的技术,它同时利用了载波的幅度和相位来传递信息比特,因此在最小距离相同的条件下可实现更高的频带利用率,目前QAM最高已达到1024-QAM(1024个样点)。
样点数目越多,其传输效率越高,例如具有16个样点的16-QAM信号,每个样点表示一种矢量状态,16-QAM有16态,每4位二进制数规定了16态中的一态,16-QAM中规定了16种载波和相位的组合,16-QAM的每个符号和周期传送4比特。
QAM调制器的原理是发送数据在比特/符号编码器(也就是串–并转换器)内被分成两路,各为原来两路信号的1/2,然后分别与一对正交调制分量相乘,求和后输出。
接收端完成相反过程,正交解调出两个相反码流,均衡器补偿由信道引起的失真,判决器识别复数信号并映射回原来的二进制信号。
如图4-2所示的是16-QAM的调制原理图。
作为调制信号的输入二进制数据流经过串–并变换后变成四路并行数据流。
这四路数据两两结合,分别进入两个电平转换器,转换成两路4电平数据。
例如,00转换成-3,01转换成-1,10转换成1,11转换成3。
这两路4电平数据g1(t)和g2(t)分别对载波cos2πfct和sin2πfct进行调制,然后相加,即可得到16-QAM信号。
(1)QAM调制解调原理
QAM(QuadratureAmplitudeModulation)就是用两个调制信号对频率相同、相位正交的两个载波进行调幅,然后将已调信号加在一起进行传输或发射。
在NTSC制和PAL制中形成色度信号时,用的就是正交调幅方式将两个色差信号调制到色度副载波上。
QAM也可用于数字调制。
数字QAM有4QAM、8QAM、16QAM、32QAM等调制方式。
其中,16QAM和32QAM广泛用于数字有线电视系统。
下面以16QAM为例介绍其原理。
正交幅度调制(QAM)信号采用了两个正交载波
,每一个载波都被一个独立的信息比特序列所调制。
发送信号波形如下图所示
式中{
}和{
}是电平集合,这些电平是通过将k比特序列映射为信号振幅而获得的。
例如一个16位正交幅度调制信号的星座图如下图所示,该星座是通过用M=4PAM信号对每个正交载波进行振
幅调制得到的。
利用PAM分别调制两个正交载波可得到矩形信号星座。
QAM可以看成是振幅调制和相位调制的结合。
因此发送的QAM信号波形可表示为
如果
那么QAM方法就可以达到以符号速率
同时发送
个二进制数据。
下图给出了QAM调制器的框图。
(2)QAM的解调和判决
假设在信号传输中存在载波相位偏移和加性高斯噪声。
因此r(t)可以表示为
其中
是载波相位偏移,且
将接收信号与下述两个相移函数进行相关
如图2.2.1所示,相关器的输出抽样后输入判决器。
使用下图中所示的锁相环估算接收信号的载波相位偏移
,相移
和
对该相位偏移进行补偿。
假设图中所示的时钟与接收信号同步,以使相关器的输出在适当的时刻及时被抽样。
在这些条件下两个相关器的输出分别为
其中
噪声分量是均值为0,方差为
的互不相关的高斯随机变量。
最佳判决器计算距离量度
二、设计内容及要求
(1)设计内容
利用Matlab函数或者模块产生随机数据,经过16QAM数字调制,送入高斯白噪声信道;在接收端使用16QAM解调数据后,与信源数据进行误码率统计;分析误码率与信噪比的关系。
(2)技术要求
信源为二进制随机数据;
高斯白噪声中设置信噪比范围:
-5~10dB;
得到误码率和信噪比的性能曲线图(本设计用Eb/N0取代信噪比)。
(3)设计步骤及要求
①拟定程序设计流程图,编写各部分代码,并用matlab仿真;
②检验设计是否合理;
③拟写设计报告。
三、程序流程图及设计方案
(1)程序流程图
(2)设计方案
1、产生二进制随机数据源
在MATLAB中表示信号的常规格式是向量或者矩阵。
本示例中利用randint函数来产生一个表示二进制数据序列连续值的列向量。
其中二进制数据序列的长度(即为列向量中的行数)设置为30,000。
%%定义参数
M=16;
k=log2(M);
%%产生信源
x=randint(30000,1);
2、16QAM调制
modem.qammod函数实现M-QAM调制,本示例中M为16。
由于该函数默认的输入是十进制数据,而产生的信源为二进制,故须修改默认函数参数为输入数据类型是二进制。
%%调制,设置输入为二进制数据
y=modulate(modem.qammod('M',16,'InputType','Bit'),x);
3、信道加高斯白噪声
对已调制信号可采用awgn函数添加加性高斯白噪声。
其中比特能量与噪声功率谱密度的比值,Eb/N0,设置为-5--10dB。
将上述Eb/N0值转换为相应的信噪比(SNR),需要考虑每一符号包含的比特数k(16-QAM中为4)以及过采样率因子nsamp(本本次设计中为1)。
其中因子k是用来将Eb/N0转换为等价的Es/N0(符号能量与噪声功率谱密度的比值)。
%%设置Eb/N0为-5--10dB。
EbNo=-5:
1:
10;
%%for循环计算snr值和误码率(见5、误码率计算)
forn=1:
length(EbNo)
%%EbNo值转换为相应的snr(信噪比)
snr(n)=EbNo(n)+10*log10(k);
%%加高斯白噪声
ynoisy=awgn(y,snr(n),'measured');
4、16QAM解调
modem.qamdemod函数实现M-QAM解调。
由于该函数默认的输出也是十进制数据,而之后要计算误码率时要求是二进制,故须修改默认函数参数为输出数据类型是二进制。
%%解调,设置输出二进制数据
z=demodulate(modem.qamdemod('M',16,'OutputType','Bit'),ynoisy);
5、计算误码率
对原始二进制向量和上述步骤解调得到二进制向量利用biterr函数即可得到误比特数和误码率。
%%计算仿真误码率
[nErrors(n),BITBER(n)]=biterr(x,z);
%%计算理论误码率
theo_err_prb(n)=(1/k)*3/2*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10))));
%%结束for循环
End
6、绘制误码率曲线图和信号接收图
对误码率与输入Eb/N0的关系可以利用semilogy绘制一条曲线图。
对发射和接收信号利用scatterplot函数可显示信号星座图的样子及噪声对信号造成的失真程度。
在该图中,横轴代表了信号的同相分量而纵轴代表了正交分量。
下面的代码还利用了MATLAB中的title、legend以及axis函数来绘制特定的图像。
%%画仿真和理论误码率与Eb/N0的关系曲线图
semilogy(EbNo,BITBER,'r*',EbNo,theo_err_prb,'b-');
title('误比特率性能');
xlabel('Eb/N0(dB)');
ylabel('误比特率');
legend('仿真比特误码率','理论比特误码率');
%%画出加噪后信号接收图
h=scatterplot(ynoisy(1:
1*5e3),1,0,'g.');
holdon;
%%将刚调制后星座点和加噪后接收信号画在一个图表上
scatterplot(y(1:
1*5e3),1,0,'r*',h);
title('ReceivedSignal');
legend('ReceivedSignal','SignalConstellation');
axis([-55-55]);
holdoff;
四、仿真结果及分析
(1)信号接收图
红色*为调制后标准的星座点,绿色散点为加噪后信号点。
(2)误码率曲线图
红色*为仿真的误码率,蓝色线条表示理论误码率。
注意图示横坐标为Eb/N0,不是snr(信噪比)。
本曲线图较为接近地反映了误码率与EbN0的关系,故本设计方案合理。
五、课程设计总结
课程设计是培养学生综合运用所学知识发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程,本次课程设计从开始到验收检查花费了大概一周时间,查阅了很多相关资料和书籍,结合课本知识,在老师的指导下,获得圆满成功。
回顾起此次课程设计,我感慨颇多,从拿到题目到完成设计,学到了很多很多的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
在设计的过程中遇到不少问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我把前面所学过的知识又重新温故了一遍,而且理解更加深刻。
我做的是高斯信道下的16QAM误码率分析,虽然原理很简单,由于对Matlab的生疏,起步较难。
第一天拿到题目后,我熟悉了一下Matlab软件的操作,发现很生疏,于是用了一个晚上的时间来提高操作水平,经过不懈努力,终于正式开始进行设计。
接下来我根据老师提供的资料以及我所找的相关资料开始将分部分地设计,这就需要在Matlab软件上查找相应函数,然而并不是找到就几个函数那么简单,这要求把英文的函数进行理解,花了很久的时间,比如在查找16QAM调制函数时,我在help里面查找modem找到16QAM的调至和解调函数,利用翻译把函数阅读一遍,发现modem.qammod和modem.qamdemod这两个函数默认的输入和输出都是十进制,而信源和最终计算误码率都用的是二进制,如果不能理解和加以更改默认参数的话必将导致仿真失败,这个过程让我明白:
细节决定成败!
在整个仿真设计过程中还遇到过其他问题,但同时我总结出,只要能认真阅函数定义和参数设置就能用正确的函数进行设计。
在此次课程设计过程中,我收获知识,提高能力的同时,也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
六、参考文献
1、《MATLAB仿真技术与应用》张葛祥李娜主编
2、《MATLAB通信仿真及应用实例详解》邓华主编
3、《MATLAB程序设计与实例应用》张铮主编
附录
代码:
M=16;
k=log2(M);
x=randint(30000,1);
y=modulate(modem.qammod('M',16,'InputType','Bit'),x);
EbNo=-5:
1:
10;
forn=1:
length(EbNo)
snr(n)=EbNo(n)+10*log10(k);
ynoisy=awgn(y,snr(n),'measured');
z=demodulate(modem.qamdemod('M',16,'OutputType','Bit'),ynoisy);
[nErrors(n),BITBER(n)]=biterr(x,z);
theo_err_prb(n)=(1/k)*3/2*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10))));
end
disp(nErrors);
disp(BITBER);
semilogy(EbNo,BITBER,'r*',EbNo,theo_err_prb,'b-');
title('误比特率性能');
xlabel('Eb/N0(dB)');
ylabel('误比特率');
legend('仿真比特误码率','理论比特误码率');
h=scatterplot(ynoisy(1:
1*5e3),1,0,'g.');
holdon;
scatterplot(y(1:
1*5e3),1,0,'r*',h);
title('ReceivedSignal');
legend('接收信号','星座点');
axis([-55-55]);
holdoff;