数字通信—QPSK格雷码与非格雷码比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字通信—QPSK格雷码与⾮格雷码⽐较
1 仿真结果
参数设置:
信噪⽐:0~10dB
码元个数:1000000
调制⽅式:QPSK
格雷码和⾮格雷码的星座图:
仿真结果:
对于 QPSK 有格雷码和⾮格雷码两种编码⽅式,这⾥只需要改变从 bit 流映射成调制符号的⽅式就可以了。

对于这两种编码⽅式其实其误码率性能是⼀样的,因为对于 QPSK 来说每⼀个象限只有⼀种调制符号,所以⼀旦错到别的象限就是错了⼀种符号。

但是他们的误⽐特率是不⼀样的,从下⾯的仿真结果中也可以看出来,格雷码的效果是优于⾮格雷码的,这是因为格雷码相邻的符号间只有⼀个 bit 是不⼀样的,这样错到相邻的象限也只会造成 1bit 的错误。

2 仿真代码
%% QPSK
clear;
clc;
M = 4; %QPSK的阶数
SNR = (0:1:10); %信噪⽐范围
nsymbol = 1000000; %符号个数
data_source = randsrc(nsymbol,2,[0 1]);
%% 坐标点映射(采⽤⾮格雷映射)
[a1,b1] = find(data_source(:,1) == 0 & data_source(:,2) == 0); %00的索引
data_send_1(a1) = -1-1j;
[a2,b2] = find(data_source(:,1) == 0 & data_source(:,2) == 1); %01的索引
data_send_1(a2) = -1+1j;
[a3,b3] = find(data_source(:,1) == 1 & data_source(:,2) == 0); %10的索引
data_send_1(a3) = 1+1j;
[a4,b4] = find(data_source(:,1) == 1 & data_source(:,2) == 1); %11的索引
data_send_1(a4) = 1-1j;
%% 坐标点映射(采⽤格雷映射)
[c1,d1] = find(data_source(:,1) == 0 & data_source(:,2) == 0); %00的索引
data_send_2(c1) = -1-1j;
[c2,d2] = find(data_source(:,1) == 0 & data_source(:,2) == 1); %01的索引
data_send_2(c2) = -1+1j;
[c3,d3] = find(data_source(:,1) == 1 & data_source(:,2) == 1); %11的索引
data_send_2(c3) = 1+1j;
[c4,d4] = find(data_source(:,1) == 1 & data_source(:,2) == 0); %10的索引
data_send_2(c4) = 1-1j;
%%
%symbol=[-1-1j, -1+1j, 1-1j, 1+1j]; %QPSK的符号坐标点
Es = norm(data_send_1).^2 / nsymbol; %⼀个符号的能量(QPSK每个符号的能量都是相等的)
Eb = Es/(log2(M)); %⼀个⽐特的能量
snr = 10.^(SNR/10); %信噪⽐dB转化成数值
N0 =Eb./snr; %求出在该⽐特能量下对应的噪声功率
sigma=sqrt(N0/2); %要分成实部和虚部,所以功率要除上2
for Eb_NO=1:length(sigma)
n1=sigma(Eb_NO)*randn(1,nsymbol);
n2=sigma(Eb_NO)*randn(1,nsymbol);
receive_1=data_send_1+n1+n2*1i; %加噪声
receive_2=data_send_2+n1+n2*1i; %加噪声
resum=0;
total=0;
%===========================
%接收符号判决
%===========================
m1 = find(real(receive_1)>=0 & imag(receive_1)>0);
n1 = find(real(receive_2)>=0 & imag(receive_2)>0);
redata_1(m1,1) = 1;
redata_1(m1,2) = 0;
redata_2(n1,1) = 1;
redata_2(n1,2) = 1;
m2 = find(real(receive_1)<=0 & imag(receive_1)>0);
n2 = find(real(receive_2)<=0 & imag(receive_2)>0);
redata_1(m2,1) = 0;
redata_1(m2,2) = 1;
redata_2(n2,1) = 0;
redata_2(n2,2) = 1;
m3 = find(real(receive_1)<0 & imag(receive_1)<=0);
n3 = find(real(receive_2)<0 & imag(receive_2)<=0);
redata_1(m3,1) = 0;
redata_1(m3,2) = 0;
redata_2(n3,1) = 0;
redata_2(n3,2) = 0;
m4 = find(real(receive_1)>0 & imag(receive_1)<=0);
n4 = find(real(receive_2)>0 & imag(receive_2)<=0);
remessage(1,m4)=1-1i;
redata_1(m4,1) = 1;
redata_1(m4,2) = 1;
redata_2(n4,1) = 1;
redata_2(n4,2) = 0;
total_symbol_1 = length(find(data_source(:,1)~=redata_1(:,1) ...
| data_source(:,2)~=redata_1(:,2))); %找出不⼀样的符号
total_symbol_2 = length(find(data_source(:,1)~=redata_2(:,1) ...
| data_source(:,2)~=redata_2(:,2))); %找出不⼀样的符号
total_bit_1 = length(find((data_source-redata_1)~=0));
total_bit_2 = length(find((data_source-redata_2)~=0));
[total_1,ratio1] = biterr(data_source,redata_1);
[total_2,ratio2] = biterr(data_source,redata_2);
Pb_1(Eb_NO) = total_bit_1/(nsymbol*2);
Pb_2(Eb_NO) = total_bit_2/(nsymbol*2);
Pe_1(Eb_NO) = total_symbol_1/nsymbol;
Pe_2(Eb_NO) = total_symbol_2/nsymbol;
end
% scatterplot(receive_1)
% title('接收信号的星座图')
figure(1);
semilogy(SNR,Pb_1,'k-X',SNR,Pb_2,'k-s',SNR,Pe_1,'r-o',SNR,Pe_2,'r-*')
legend('⾮格雷码QPSK仿真误⽐特率','格雷码QPSK仿真误⽐特率','⾮格雷码QPSK仿真误码率',... '格雷码QPSK仿真误码率')
title('QPSK格雷编码与⾮格雷编码性能性能⽐较')
xlabel('信噪⽐/dB');ylabel('误⽐特率/误码率')
grid on。

相关文档
最新文档