📄 dpsk_8_plot.m
字号:
tic
clear;
SNRindB1=0:1:15; % ready for plotting practical error bit/symbol rario
SNRindB2=0:0.1:15; % ready for plotting theoretical error bit/symbol rario
M=8; % 8 DPSK
k=log2(M);
N=10000; % N is the number of octal random integer
N_bit=N*k; % N_bit is the the total numbers binary bit
for SNRindB=1:length(SNRindB1)
data_bin=rand(k,N)>0.5; % generating 3*N 0-1 array
sym_oct=data_bin(1,:)*4+data_bin(2,:)*2+data_bin(3,:)*1; % N octal random integers
% Gray mapping
idx=find(sym_oct==0);
rad_init(idx)=0/M*2*pi;
idx=find(sym_oct==1);
rad_init(idx)=1/M*2*pi;
idx=find(sym_oct==2);
rad_init(idx)=3/M*2*pi;
idx=find(sym_oct==3);
rad_init(idx)=2/M*2*pi;
idx=find(sym_oct==4);
rad_init(idx)=7/M*2*pi;
idx=find(sym_oct==5);
rad_init(idx)=6/M*2*pi;
idx=find(sym_oct==6);
rad_init(idx)=4/M*2*pi;
idx=find(sym_oct==7);
rad_init(idx)=5/M*2*pi;
% Differential encoding
dif_rad(1)=rad_init(1); % initiating the first differential angle
for j=2:N
dif_rad(j)=mod((rad_init(j)+dif_rad(j-1)),2*pi);
end
% I and Q
data_I=cos(dif_rad);
data_Q=sin(dif_rad);
data=data_I+i*data_Q;
% generating noise
snr_in_dec=10.^((SNRindB-1)/10);
sigma=sqrt(1/(2*k*snr_in_dec)); % culculation fomula of sigma
% [noise_I noise_Q]=gngauss(N,sigma);
% noise_I_Q=[noise_I;noise_Q]; % noise is 2*N gauss random number array by sigma
% noise=noise_I+i*noise_Q;
% data_add_noise=data+noise;
data_add_noise=gngauss(N,data,sigma)
% data_differential + noise_gauss
% Next, we begin decision
decs_data=zeros(1,N); % decs_data is for containing octal data
decs_bin=zeros(3,N); % decs_bin is for containing binary data
decs_rad=angle(data_add_noise); % culculating the differential phase
culcu_rad(1)=decs_rad(1);
for j=2:N
culcu_abs_rad(j)=mod((decs_rad(j)-decs_rad(j-1)),2*pi);
end % in this time, the cul_rad is the absolute phase angle added noise
index1=find(culcu_abs_rad<pi/8); % 0 decision. Be careful!!! There are many skills I don't know before.
index2=find(culcu_abs_rad>15*pi/8);
decs_bin(:,index1)=repmat([0 0 0]',1,length(index1));
decs_bin(:,index2)=repmat([0 0 0]',1,length(index2));
index1=find(culcu_abs_rad>pi/8); % 1 decision
index2=find(culcu_abs_rad(index1)<3*pi/8);
decs_bin(:,index1(index2))=repmat([0 0 1]',1,length(index2));
index1=find(culcu_abs_rad>3*pi/8); % 3 decision
index2=find(culcu_abs_rad(index1)<5*pi/8);
decs_bin(:,index1(index2))=repmat([0 1 1]',1,length(index2));
index1=find(culcu_abs_rad>5*pi/8); % 2 decision
index2=find(culcu_abs_rad(index1)<7*pi/8);
decs_bin(:,index1(index2))=repmat([0 1 0]',1,length(index2));
index1=find(culcu_abs_rad>7*pi/8); % 6 decision
index2=find(culcu_abs_rad(index1)<9*pi/8);
decs_bin(:,index1(index2))=repmat([1 1 0]',1,length(index2));
index1=find(culcu_abs_rad>9*pi/8); % 7 decision
index2=find(culcu_abs_rad(index1)<11*pi/8);
decs_bin(:,index1(index2))=repmat([1 1 1]',1,length(index2));
index1=find(culcu_abs_rad>11*pi/8); % 5 decision
index2=find(culcu_abs_rad(index1)<13*pi/8);
decs_bin(:,index1(index2))=repmat([1 0 1]',1,length(index2));
index1=find(culcu_abs_rad>13*pi/8); % 4 decision
index2=find(culcu_abs_rad(index1)<15*pi/8);
decs_bin(:,index1(index2))=repmat([1 0 0]',1,length(index2));
% END binary decision above
decs_data=decs_bin(1,:)*4+decs_bin(2,:)*2+decs_bin(3,:)*1; % N octal random integers which had been decided
num_of_err_bit=length(find(xor(data_bin,decs_bin))); % culculating the total number of error bit
num_of_err_symbol=length(find(sym_oct-decs_data)); % culculating the total number of error symnol
pb(SNRindB)=num_of_err_bit/N_bit;
ps(SNRindB)=num_of_err_symbol/N;
end
semilogy(SNRindB1,pb,'k*');
hold on;
semilogy(SNRindB1,ps,'b');
pb_from_ps=ps/3;
semilogy(SNRindB1,pb_from_ps,'r'); % pb_from_ps is probability of error bit by directly culculating pb
grid on;
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -