16PSK和16QAM仿真
- 格式:pdf
- 大小:473.63 KB
- 文档页数:14
16QAM和16PSK信号的MATLAB仿真及性能对比
于丹,李亚儒
一.16QAM信号
M进制正交幅度调制信号(MPSK)是由两个正交载波的多电平振幅键控信号叠加而成的,它与MPSK信号的不同之处在于两个支路的多电平幅度序列是相互独立的。
发送机原理图:
接收机原理图:
16QAM信号的仿真过程:
1.产生一个随机的二进制的比特流。
利用randint函数产生代表原始信号的二进制比特序列,此处比特流的长度设为100000,并画出前50个比特的信号图:
2.将二进制比特流转换成对应的十六进制信号
MATLAB 中的16QAM调制器要求输入的信号为0-15这16个值,因此需要将原始的二进制比特流每4个比特转换为相应的16个值,这一步中用到的函数主要包括reshape和bi2de。
3.用16QAM调制器对信号进行调制并画出信号的星座图
利用modem.qammod函数生成16QAM调制器,并对上一步生成的信号进行调制。
4.在16QAM信号中加入高斯白噪声
信号通过awgn信道之后相当于在信号上加入了高斯白噪声,这一步假设Eb/No=15db。
5.画出通过信道之后接收信号的星座图
利用scatterplot函数画出信号的星座图。
6.生成信号眼图
利用eyediagram函数画出经过信道之后接收信号的眼图。
7.16QAM信号的解调
利用demodulate和modem.qamdemod函数生成解调器,对接收到的信号进行解调,并将16进制信号转化成二进制比特流信息。
8.计算误码率
将最终得到的比特流信息和原始发送的比特流信息进行对比,最终计算出误码率。
相应的MATLAB程序代码如下
M=16;
k=log2(M);
n=100000; %比特序列长度
samp=1; %过采样率
x=randint(n,1); %生成随机二进制比特流
stem(x(1:50),'filled'); %画出相应的二进制比特流信号title('二进制随机比特流');
xlabel('比特序列');ylabel('信号幅度');
x4=reshape(x,k,length(x)/k); %将原始的二进制比特序列每4个一组分组,并排列成k行length(x)/k列的矩阵
xsym=bi2de(x4,'left-msb'); %将矩阵转化为相应的16进制信号序列figure;
stem(xsym(1:50)); %画出相应的16进制信号序列title('16进制随机信号');
xlabel('信号序列');ylabel('信号幅度');
y=modulate(modem.qammod(M),xsym); %用16QAM调制器对信号进行调制scatterplot(y); %画出16QAM信号的星座图
text(real(y)+0.1,imag(y),dec2bin(xsym));
axis([-5 5 -5 5]);
EbNo=15; %假设Eb/No=15db;
snr=EbNo+10*log10(k)-10*log10(nsamp); %信噪比
yn=awgn(y,snr,'measured'); %加入高斯白噪声
h=scatterplot(yn,nsamp,0,'b.'); %经过信道后接收到的含白噪声的信号星座图hold on;
scatterplot(y,1,0,'k+',h); %加入不含白噪声的信号星座图title('接收信号星座图');
legend('含噪声接收信号','不含噪声信号');
axis([-5 5 -5 5]);
hold off;
eyediagram(yn,2); %眼图
yd=demodulate(modem.qamdemod(M),yn); %此时解调出来的是16进制信号z=de2bi(yd,'left-msb'); %转化为对应的二进制比特流z=reshape(z.',numel(z),1);
[number_of_errors,bit_error_rate] = biterr(x,z) %计算误码率
程序运行结果如下:
number_of_errors =
bit_error_rate =
图1-1
图1-2
图1-3
图1-4
图1-5
二.16PSK信号
多进制相位键控MPSK是利用载波的相位变化来传递信息的调制方式。 发送机原理图:
16PSK接收机原理图:
16PSK信号的仿真:
16PSK信号的仿真过程与16QAM类似,基本流程是相同的,如下所述:
1.产生一个随机的二进制的比特流。
2.将二进制比特流转换成对应的十六进制信号。
3.用16PSK调制器对信号进行调制并画出信号的星座图。
4.在16PSK信号中加入高斯白噪声。
5.画出通过信道之后接收信号的星座图。
6.生成信号眼图。
7.16PSK信号的解调。
8.计算误码率。
仿真过程中所使用的为16PSK调制器和16PSK解调器,并且为了更好的与16QAM信号的调制解调进行对比,在用MATLAB代码实现仿真的时候最好是利用16QAM仿真过程中生成的二进制比特流。这样,使用相同的信号源进行仿真得出的结果更具有对比性。
相应的MATLAB程序代码如下:
stem(x(1:50),'filled'); %随机二进制比特流直接采用16QAM中生成的比特流title('二进制随机比特流');
xlabel('比特序列');ylabel('信号幅度');
x4=reshape(x,k,length(x)/k); %将原始的二进制比特序列每4个一组分组,并排列成k行length(x)/k列的矩阵
xsym=bi2de(x4.’,'left-msb'); %将矩阵转化为相应的16进制信号序列figure;
stem(xsym(1:50)); %画出相应的16进制信号序列title('16进制随机信号');
xlabel('信号序列');ylabel('信号幅度');
y=modulate(modem. pskmod(M),xsym); %用16PSK调制器对信号进行调制scatterplot(y); %画出16PSK信号的星座图
text(real(y)+0.1,imag(y),dec2bin(xsym));
axis([-5 5 -5 5]);
EbNo=15; %假设Eb/No=15db;
snr=EbNo+10*log10(k)-10*log10(nsamp); %信噪比
yn=awgn(y,snr,'measured'); %加入高斯白噪声
h=scatterplot(yn,nsamp,0,'b.'); %经过信道后接收到的含白噪声的信号星座图hold on;
scatterplot(y,1,0,'k+',h); %加入不含白噪声的信号星座图title('接收信号星座图');
legend('含噪声接收信号','不含噪声信号');
axis([-5 5 -5 5]);
hold off;