D8PSK相干收发系统误码率非理想因素的影响

一、D8PSK通信系统的基本结构

D8PSK是差分八相移键控(differential 8-phase shift keying)的简称,是一种典型的多相移键控的调整方式,具有较强的抗干扰性能,相比BPSK(二相移键控)和QPSK(四相移键控)具有更高的信道利用率,常用于卫星通信及航空通信等场合。

D8PSK通信系统框图如下

 

 

二、关键步骤讲解

1.     格雷码与相位对应关系

八进制数

二进制数

相位

0

000

0

1

001

1π/4

3

011

2π/4

2

010

3π/4

6

110

4π/4

4

100

5π/4

5

101

6π/4

7

111

7π/4

 

2.     差分相位与绝对相位的关系

 

3.     成形滤波器的作用

在数据编码进行映射和投影之后,两路正交数据均为离散序列,频谱覆盖整个频域空间,经过成形滤波器之后,可以压缩频带,减少码间干扰。

4.     上采样的好处

可以压缩频谱,抑制谐波,提高信噪比。上采样M倍后使频谱压缩为原来的1/M,低通滤波可以去除右端周期频带。

5.     下采样的好处

可以拓宽频谱,降低数据速率,减小数据流量。下采样M倍后使频谱拓展为原来的M倍,提前低通滤波可以消除频率混叠。

三、相干解调时的误差分析

测试参数

载波频率 21.4MHz

符号速率 10.5KHz

码元速率 31.5KHz

相干解调

1.     信噪比影响

不管其他三个变量如何变化,随着信噪比的提高,误码率总是近似成指数级下降。

 中频采样率较低(欠采样)时

中频采样率较高(过采样)时

 接收机频偏较大时

 

 

 接收机相偏较大时

 

 

 

2.     ADC采样频率影响

在频偏较大的情况下,提高ADC采样率可以显著降低误码率,但一旦采样率达到10M sps,则采样率对降低误码率的贡献不再明显。

 

 

3.     频偏影响

在采样率较低时,减小频偏可以显著降低误码率

 

 

 当采样率足够时,减小频偏对降低误码率左右不大

 

 

 

4.     相偏影响

整体而言,相偏对误码率影响较小

 

 

 

 

 

 

 5.小结

A 无论在何种情况下,提高信噪比对减小误码率都是有作用的

B 提高采样率对于抑制频偏作用明显,但到一定程度之后,就不再有贡献

C 对于载波中频欠采样的情况,降低发射-接收间的频偏仍然可以将误码率减小到理想水平

D D8PSK这种调制方式对相偏不敏感

四、Matlab程序

%%
% my_d8psk.m
% 根据给定参数分析d8psk误码率
function err_rate = my_d8psk(Fc_t,fre_sigle_t,Ns_t,fs_mf_t,snr_r,fr_err_r,phi_err_r)
%% 参数说明
% err_rate -- 误码率,比值
% Fc_t -- 载波频率,单位Hz
% fre_sigle_t -- 符号速率,单位Hz
% Ns_t -- 符号个数
% fs_mf_t -- 中频采样频率,单位Hz
% snr_r -- 传输信道叠加信噪比,单位dB
% fr_err_r -- 接收机频偏,单位ppm
% phi_err_r -- 接收机相偏,单位ppm
%% 基本参数
Fc = Fc_t;                  
fre_sigle = fre_sigle_t;    
fre_bits  = 3*fre_sigle;    %码元速率,单位Hz

N_s = Ns_t;    
N_b = 3 * N_s;  %码元个数

fs_mf = fs_mf_t;	%中频采样频率,发射机DAC和接收机ADC相同
%% 差分码元生成
% 1.原始编码
data = randi([0 7],1,N_s);  %产生一行八进制随机数

abs_ang = zeros(1,N_s);     %绝对相位
diff_ang = zeros(1,N_s);    %相对相位

% 2.差分映射 格雷码
for n=1 : 1 : N_s
    if data(1,n) == 0           % 000
        diff_ang(1,n) = 0;
    elseif data(1,n) == 1       % 001
        diff_ang(1,n) = pi/4;
    elseif data(1,n) == 3       % 011
        diff_ang(1,n) = 2*pi/4;
    elseif data(1,n) == 2       % 010
        diff_ang(1,n) = 3*pi/4;
    elseif data(1,n) == 6       % 110
        diff_ang(1,n) = 4*pi/4;
    elseif data(1,n) == 7       % 111
        diff_ang(1,n) = 5*pi/4;
    elseif data(1,n) == 5       % 101
        diff_ang(1,n) = 6*pi/4;
    elseif data(1,n) == 4       % 100
        diff_ang(1,n) = 7*pi/4;        
    end
end

% 3.绝对相位
abs_ang(1,1) = diff_ang(1,1);
for n=2 : 1 : N_s
    abs_ang(1,n) = mod((abs_ang(1,n-1) + diff_ang(1,n)),2*pi); % phi(k) - phi(k-1) = delta_phi
    % abs_ang(1,n) = (abs_ang(1,n-1) + diff_ang(1,n)); % phi(k) - phi(k-1) = delta_phi
end

%% 基带信号
% 1.生成i-q正交数据
I = cos(abs_ang);
Q = sin(abs_ang);

% % 星座图
% scatter(I,Q);axis equal;
% grid on

% 3.插值
I10 =upsample(I,10);
Q10 =upsample(Q,10);

% 3.脉冲成形 
beta=0.6;   %r=0时是矩形
span=length(I10);
sps=10;
h = rcosdesign(beta,span,sps);

% 4.滤波
I10_f=conv(I10,h,'same');
Q10_f=conv(Q10,h,'same');
%% 插值
I100 =upsample(I10_f,10);
Q100 =upsample(Q10_f,10);
% 滤波
h_t1 =fir1(127,1/10);
I_f =conv(I100,h_t1,'same');
Q_f =conv(Q100,h_t1,'same');

%% 调制
% 1.生成载波
t = 0:1/fs_mf:(length(I_f)-1)/fs_mf;   % 采样深度N_s
ref_cos = cos(2*pi*Fc .*t);
ref_sin = -sin(2*pi*Fc .*t);
% 2.合成
s = ref_cos .* I_f + ref_sin .* Q_f;

%% 信道模拟 - 加噪声 频偏
snr_t = snr_r;       % dB
s_in = awgn(s,snr_t,'measured');
%% 接收
fr_err = fr_err_r*1e-6;   % 频率偏差
phi_err = phi_err_r*1e-6;  % 相位偏差
Fc_r = Fc * (1+fr_err);
phi_r = phi_err*2*pi;
%% 解调
% 1.本振信号
lo_cos = 2*cos(2*pi*Fc_r .* t + phi_r);
lo_sin = -2*sin(2*pi*Fc_r .* t + phi_r);

% 2.相乘
A = s_in .* lo_cos;
B = -s_in .* lo_sin;

% 3.匹配滤波
A_f=conv(A,h,'same');
B_f=conv(B,h,'same');

%% 抽取 - 先滤波
% 1.低通滤波
h_r1 =fir1(127,1/10);
A_f1 =conv(A_f,h_r1,'same');
B_f1 =conv(B_f,h_r1,'same');

% 2.抽取10倍
A10 = downsample(A_f1,10);
B10 = downsample(B_f1,10);

% 3.低通滤波
h_r1 =fir1(127,1/10);
A100_f =conv(A10,h_r1,'same');
B100_f =conv(B10,h_r1,'same');

% 3.抽取100倍
A = downsample(A100_f,10);
B = downsample(B100_f,10);

% %星座图
% figure
% scatter(A,B);axis equal;
% grid on

%% 角度换算
% 结算角度到[0,2*pi]
r_abs_ang = [];
for n=1 : 1 : N_s
    r_abs_ang(1,n) = atan2(A(1,n),B(1,n)) + pi; % atan2 值域为 [-pi,pi]
end

%% 差分译码
r_diff_ang = [];
r_diff_ang(1,1) = r_abs_ang(1,1);

for n=2 : 1 : N_s
    r_diff_ang(1,n) = mod((r_abs_ang(1,n) - r_abs_ang(1,n-1)),2*pi);
end

%% 判决 - 最大似然估计
rt1 = [];
r_code = 0;

for m=1:1:length(r_diff_ang)
%     theta = r_diff_ang(1,m);
%     rho = sqrt(A(1,m)^2+B(1,m)^2);
%     polarplot(theta,rho,'ko');hold on;      % 极坐标绘点

    % 0
    if (r_diff_ang(1,m) < pi/8) || (r_diff_ang(1,m) > 15*pi/8)
    	r_code = 0;
    % pi/4
    elseif (r_diff_ang(1,m) > pi/8) && (r_diff_ang(1,m) <= 3*pi/8)
    	r_code = 1;
    % 2*pi/4
	elseif (r_diff_ang(1,m) > 3*pi/8) && (r_diff_ang(1,m) <= 5*pi/8)
    	r_code = 3;
    % 3*pi/4
    elseif (r_diff_ang(1,m) > 5*pi/8) && (r_diff_ang(1,m) <= 7*pi/8)
    	r_code = 2;
    % 4*pi/4
    elseif (r_diff_ang(1,m) > 7*pi/8) && (r_diff_ang(1,m) <= 9*pi/8)
    	r_code = 6;
    % 5*pi/4
    elseif (r_diff_ang(1,m) > 9*pi/8) && (r_diff_ang(1,m) <= 11*pi/8)
    	r_code = 7;
    % 6*pi/4
    elseif (r_diff_ang(1,m) > 11*pi/8) && (r_diff_ang(1,m) <= 13*pi/8)
    	r_code = 5;
    % 7*pi/4
    elseif (r_diff_ang(1,m) > 13*pi/8) && (r_diff_ang(1,m) <= 15*pi/8)
    	r_code = 4;
    end
    
    rt1(1,m) = r_code;
end

% % %% 解算后极坐标绘图
% % ax = gca;
% % ax.ThetaDir = 'counterclockwise';   % 逆时针
% % ax.ThetaAxisUnits = 'radians';      % 单位 弧度
% % ax.ThetaMinorGrid = 'off';          % 角度次网格隐藏
% % ax.RGrid = 'off';                   % 半径网格隐藏
% % % 角度分度值表
% % ax.ThetaTick = [pi/8 3*pi/8 5*pi/8 7*pi/8 9*pi/8 11*pi/8 13*pi/8 15*pi/8];
%% 误码率计算
err = 0;
for m=1:1:length(r_diff_ang)
    if(rt1(1,m) ~= data(1,m))
        err = err + 1;
    end
end

% 码率为符号速率 3倍
err_rate = err/N_s;

% str = sprintf('符号误码率为 %f%%\n',err_rate*100);
% disp(str);

end

  综合分析误码率

%%
% my_d8psk_sim.m
% 分析相关因素对d8psk误码率的影响
clc;
close all;
clear all;
%% 常量
Fc_t = 21.4e6;          %载波频率21.4 MHz
fre_sigle_t = 10.5e3;   %符号速率10.5KHz
Ns_t = 300;             %符号个数

% 绘图点数
NN = 50;

%% 控制变量
fs_mf0 = 1e6;          %采样频率,MHz
snr0 = 3;              %经过信号后的信噪比,dB
fr_err0 = 10;          %接收机频偏,ppm
phi_err0 = 10;         %接收机相偏,ppm

fs_mf_t = fs_mf0;
snr_r = snr0;
fr_err_r = fr_err0;
phi_err_r = phi_err0;

%% SNR 影响分析
snr_min = 0;
snr_max = 100;
snr_arry = snr_min : (snr_max-snr_min) / (NN-1) :snr_max;

err_rate = zeros(1,NN);

for n = 1:1:NN
    snr_r = snr_arry(1,n);
    err_rate(1,n) = my_d8psk(Fc_t,fre_sigle_t,Ns_t,fs_mf_t,snr_r,fr_err_r,phi_err_r)*100;
end

figure;
plot(snr_arry,err_rate,'-d');

txt1 = sprintf('中频采样率:%03.2f MHz\n接收机频偏:%02.2f ppm\n接收机相移:%02.2f ppm',fs_mf_t/1e6,fr_err_r,phi_err_r);
text(0.15*max(snr_arry),0.75*max(err_rate),txt1);

title('信道SNR对于误码率影响');
xlabel('SNR/dB');
ylabel('误码率/%');

snr_r = snr0;

%% 中频采样率影响分析
fs_mf_min = 1e6;
fs_mf_max = 100e6;
fs_mf_arry = fs_mf_min : (fs_mf_max-fs_mf_min) / (NN-1) :fs_mf_max;

err_rate = zeros(1,NN);

for n = 1:1:NN
    fs_mf_t = fs_mf_arry(1,n);
    err_rate(1,n) = my_d8psk(Fc_t,fre_sigle_t,Ns_t,fs_mf_t,snr_r,fr_err_r,phi_err_r)*100;
end

figure;
plot(fs_mf_arry,err_rate,'-d');

txt1 = sprintf('接收信噪比: %03.02fdB\n接收机频偏:%02.2f ppm\n接收机相移:%02.2f ppm',snr_r,fr_err_r,phi_err_r);
text(0.15*max(fs_mf_arry),0.75*max(err_rate),txt1);

title('接收机采样速率对误码率的影响');
xlabel('采样率/sps');
ylabel('误码率/%');

fs_mf_t = fs_mf0;

%% 接收频偏分析
fr_err_min = -50;
fr_err_max = 50;
fr_err_arry = fr_err_min : (fr_err_max-fr_err_min) / (NN-1) :fr_err_max;

err_rate = zeros(1,NN);

for n = 1:1:NN
    fr_err_r = fr_err_arry(1,n);
    err_rate(1,n) = my_d8psk(Fc_t,fre_sigle_t,Ns_t,fs_mf_t,snr_r,fr_err_r,phi_err_r)*100;
end

figure;
plot(fr_err_arry,err_rate,'-d');

txt1 = sprintf('中频采样率:%03.2f MHz\n接收信噪比: %03.02fdB\n接收机相移:%02.2f ppm',fs_mf_t/1e6,snr_r,phi_err_r);
text(-30,0.75*max(err_rate),txt1);

title('接收机频偏对误码率的影响');
xlabel('频率误差/ppm');
ylabel('误码率/%');

fr_err_r = fr_err0;

%% 接收相偏分析
phi_err_min = -50;
phi_err_max = 50;
phi_err_arry = phi_err_min : (phi_err_max-phi_err_min) / (NN-1) :phi_err_max;

err_rate = zeros(1,NN);

for n = 1:1:NN
    phi_err_r = phi_err_arry(1,n);
    err_rate(1,n) = my_d8psk(Fc_t,fre_sigle_t,Ns_t,fs_mf_t,snr_r,fr_err_r,phi_err_r)*100;
end

figure;
plot(phi_err_arry,err_rate,'-d');

txt1 = sprintf('中频采样率:%03.2f MHz\n接收信噪比: %03.02fdB\n接收机频偏:%02.2f ppm\n',fs_mf_t/1e6,snr_r,fr_err_r);
text(-30,0.75*max(err_rate),txt1);

title('接收机相偏对误码率的影响');
xlabel('相位误差/ppm');
ylabel('误码率/%');

phi_err_r = phi_err0;

  

 

五、参考资料

https://zhuanlan.zhihu.com/p/47258287 贼详细的8PSK调制与解调详细过程

《数字通信-基础与应用》 第二版【美】Bernard Sklar 电子工业出版社

《现代通信系统(MATLAB版)》 第三版 【美】John G.Proakis等 电子工业出版社

posted @ 2019-11-21 20:41  夏天雨后的吉他有点风  阅读(1366)  评论(0编辑  收藏  举报