基于matlab的64QAM通信系统的仿真
一、实验目的和意义
从信号平面自用率方面看,单独使用幅度或相位携带信息时,不能最充分地利用信号平面。而M-QAM调制则正是解决这一问题的一种调制方式,采用幅度相位相结合的调制方式,可以使同样大的信息平面内有更多的信息点。
从抗干扰方面看,在星座图上,采用M-QAM调制的信息的各点的距离要大于采用其它调制的,由星座图上点的特性可知,距离越大,抗干扰能力越强,所以在抗干扰能力方面,QAM调制也优于其它几种调制方式。
由上可知,在现代数字通信系统中,幅度与相位相结合的多进制调制有着重要的意义,并且运用也日益广泛。
二、实验原理
QAM是幅度和相位联合调制的技术,它同时利用了载波的幅度和相位来传递信息比特,不同的幅度和相位代表不同的编码符号。因此,在最小距离相同的条件下,QAM星座图中可以容纳更多的星座点即可实现更高的频带利用率。本设计中所采用的64QAM为64进制的幅度相位相结合调制。其星座图如图1所示。
图1 64QAM矩形星座图
三、实验设计要求:
- NRZ信号序列生成;
- 根据矩形星座图对消息序列进行MQAM星座映射,取M=64进制(或以上);
- MQAM调制;
- 加噪声;
- 解调QAM;
- MQAM星座解映射及判决
- 计算误码率,并与理论误码率比较,作图表示出64QAM的信噪比与误码率的关系曲线。
图2 实验流程框图
四、详细实验步骤
1、首先进行系统的分析和设计,整个仿真实验分为如下几个部分:随机序列的产生,序列的串并转换及64QAM正交调制,星座图的绘制(包含原始信号和添加10dB和20dB噪声后的信号),加入不同噪声,进行64QAM解调、误码率的测量和误比特率的测量,最后绘图显示该仿真电路在不同信噪比下的误码率,并与理论计算的误码率比较。
2、仿真程序设计
1)NRZ信号源产生
2)64QAM星座映射调制
3)AWGN
4)星座图
5)MQAM解调、星座解映射和判决
6)经过以上步骤的设计,实现了64QAM调制解调的全过程仿真,最后设计在信号仿真过程中,误符号率和误比特率的测量和图示。
为了测量信噪比不同情况下的误码率,需要创建一个循环程序,让信噪比从0递增,在各信噪比条件下,进行信道高斯白噪声加入,将添加噪声后的信号和原调制信号对比,计算出该仿真系统的误符号率,再进行64QAM的解调和星座解映射和判决,将结果和原串行随机信号对比,计算出该仿真系统的误比特率。
(1)创建循环程序,进行不同信噪比的高斯白噪声信号添加
(2)误符号率计算
(3)误比特率计算
(4)理论误符号率计算
(5)根据以上计算结果,用Matlab画图程序作出仿真误符号率、理论误符号率、仿真误比特率及理论误比特率的图形,可以直观看到在不同信噪比的干扰信号下,该仿真系统的误码率。
最后,我们来看看仿真过程中的图片:
图3 64QAM信号星座图
图4 10dB信噪比时信号星座图
图5 20dB信噪比时信号星座图
图6 该仿真系统在不同信噪比下的误码率曲线
部分Matlab代码如下:
clc;
close all;
clear all;
echo off; %关闭运行中的命令显示
global num;
k=log2(64);
%%% 产生0,1随机序列
num=1200000;
inbits = randi([0,1],1,num);
tx_bits= inbits;
% % QAM64星座映射
tx_64QAM=Mapping_64QAM(tx_bits); %对120万比特进行格雷映射和调制,得到已调复信号
mod_out=tx_64QAM;
% %% 画出星座图
figure
plot(real(mod_out), imag(mod_out), 'r.');
title('原始信号星座图'); %显示原图
figure
SNR_test=awgn(mod_out,10);%
plot(real(SNR_test), imag(SNR_test), 'b.');
title('10dB信噪比时信号星座图'); %
%hold on;
figure
SNR_test=awgn(mod_out,20);%
plot(real(SNR_test), imag(SNR_test), 'b.');
title('20dB信噪比时信号星座图'); %
grid on;
%%加上AWGN噪声信号----取不同SNR
upebn0=15;
errorsymbol = zeros(1,upebn0+1);
errorbit = zeros(1,upebn0+1);
for ebn0=0:1:upebn0
SNR = ebn0+10*log10(k); %ebn0与SNR的换算关系
noisySignal=awgn(mod_out,SNR,'measured');%
%计算误符号率
a=Cal_ser(noisySignal,mod_out);
errorsymbol(ebn0+1)=a*6/num;
rx_64QAM=noisySignal;
% % % QAM64星座解映射
[result]=Demapping_64QAM(rx_64QAM);
%%%计算误比特率
b=0;
for i=1:1:num
if result(i) ~= tx_bits(i)
b=b+1;
end
end
errorbit(ebn0+1)=b/num;
end;
%%
%计算理论误码率
BER=zeros(1,upebn0+1);
for ebn0=0:1:upebn0
m = 6*10^(ebn0/10);
BER(ebn0+1) = 2*erfc(sqrt(3*m/(2*63)))-(erfc(sqrt((3*m/(2*63))))).^2;
end
%%
%画出误码率曲线
ebn0=0:1:upebn0;
figure
semilogy(ebn0,errorsymbol,'-r*');hold on;
semilogy(ebn0,BER,'-b*');hold on;
semilogy(ebn0,errorbit,'s-r');hold on;
semilogy(ebn0,BER/6,'s-b');hold off;
legend('仿真误符号率曲线','理论误符号率曲线','仿真误比特率曲线','理论误比特率曲线');xlabel('ebn0(dB)');
title('64QAM误码率曲线');grid on;
set(gcf,'color','w');