MPSK通信系统的设计与性能研究-QPSK

举报
timerring 发表于 2023/03/28 09:27:50 2023/03/28
【摘要】 文章和代码已经归档至【Github仓库:communication-system-simulation】或者公众号【AIShareLab】回复 通信系统仿真 也可获取。 一、QPSK背景略 二、原理概述 2.1 PSK调制发送端发送的是一连串离散而随机的二进制比特流,使用PSK载波相位调制的方法,这样发送端发送的消息便包含在了相位中,此种调制方法可以十分有效地节约带宽。um(t)=AgT(t...

文章和代码已经归档至【Github仓库:communication-system-simulation】或者公众号【AIShareLab】回复 通信系统仿真 也可获取。

一、QPSK背景

二、原理概述

2.1 PSK调制

发送端发送的是一连串离散而随机的二进制比特流,使用PSK载波相位调制的方法,这样发送端发送的消息便包含在了相位中,此种调制方法可以十分有效地节约带宽。

u m ( t ) = A g T ( t ) cos ( 2 π f c t + 2 π m M ) , m = 0 , 1 , , M 1 u_{m}(t)=A g_{T}(t) \cos (2 \pi f_{c} t+\frac{2 \pi m}{M}), m=0,1, \ldots, M-1

其中, g T ( t ) g_{T}(t) 是发送滤波器的脉冲形状, 传输信号的频谱特性由它决定。A则是信号 的幅度。在 psk 调制中, 所有的 psk 信号对于所有的 m \mathrm{m} 都具有相同的能量。能量为:

ε m = + u m 2 ( t ) d t = ε s \varepsilon_{m}=\int_{-\infty}^{+\infty} u_{m}^{2}(t) d t=\varepsilon_{s}

$ \varepsilon_{s}$ 代表每个传输符号的能量。
在本次实验中, 为了方便分析, 我们令 A = 1 \mathrm{A}=1 , g T ( t ) = 2 ε s T , 0 t T g_{T}(t)=\sqrt{\frac{2 \varepsilon_{s}}{T}}, 0 \leq t \leq T , 那么, 相应的 p s k \mathrm{psk} 调制信号的波形为

u m ( t ) = 2 ε s T cos ( 2 π f c t + 2 π m M ) = 2 ε s T ( A m c cos 2 π f c t A m s cos 2 π f c t ) , m = 0 , 1 , , M 1 , 0 t T \begin{array}{c} u_{m}(t)=\sqrt{\frac{2 \varepsilon_{s}}{T}} \cos (2 \pi f_{c} t+\frac{2 \pi m}{M})=\sqrt{\frac{2 \varepsilon_{s}}{T}}(A_{m c} \cos 2 \pi f_{c} t-A_{m s} \cos 2 \pi f_{c} t), \\ m=0,1, \ldots, M-1,0 \leq t \leq T \end{array}

我们规定:

{ A m c = cos 2 π m M A m s = sin 2 π m M , m = 0 , 1 , , M 1. \{\begin{array}{l} A_{m c}=\cos \frac{2 \pi m}{M} \\ A_{m s}=\sin \frac{2 \pi m}{M} \end{array}, m=0,1, \ldots, M-1.

经过上述分析, 我们不难得出, 这样一个相位调制信号可以看作两个正交载波, 因此, 数字相位调制信号可以在几何上可用二维向量的形式来表示, 即

s m = ( ε s cos 2 π m M , ε s sin 2 π m M ) \vec{s}_{m}=(\sqrt{\varepsilon_{s}} \cos \frac{2 \pi m}{M}, \sqrt{\varepsilon_{s}} \sin \frac{2 \pi m}{M})

正交基函数为:

{ ψ 1 ( t ) = g T ( t ) cos 2 π f c t ψ 2 ( t ) = g T ( t ) sin 2 π f c t . \{\begin{array}{l} \psi_{1}(t)=g_{T}(t) \cos 2 \pi f_{c} t \\ \psi_{2}(t)=-g_{T}(t) \sin 2 \pi f_{c} t \end{array}.

2.2 信号传输

调制信号在 AWGN 信道传输的时候, 会有噪声混杂进来, 此时输出信号变为:

r ( t ) = u m ( t ) + n c ( t ) cos ( 2 π f c t ) n s ( t ) sin ( 2 π f c t ) r(t)=u_{m}(t)+n_{c}(t) \cos (2 \pi f_{c} t)-n_{s}(t) \sin (2 \pi f_{c} t)

其中, n_{c}(t) 和 n_{s}(t) 分别是加性噪声的同相分量和正交分量, 之后, 我们将输出信号和 给出的基函数作相关, 则两个相关器的输出为:

r = s m + n = ( ε s cos 2 π m M + n c , ε s sin 2 π m M + n s ) r=s_{m}+n=(\sqrt{\varepsilon_{s}} \cos \frac{2 \pi m}{M}+n_{c}, \sqrt{\varepsilon_{s}} \sin \frac{2 \pi m}{M}+n_{s})

需要注意的是 n c ( t ) n_{c}(t) n s ( t ) n_{s}(t) 这两个正交噪声的分量是零均值, 互不相关的高斯随机过程。

2.3 解调方式

(1)最小欧式距离准则判决

最小欧式距离准则判决:求出接收到的信号向量与M个传输向量的欧式距离,选取对应的最小欧式距离的向量,该向量对应的符号即为判决输出符号。此种方法需要掌握距离度量的概念并熟练运用,下面给出关于距离度量具体的理论分析:

在接收消息尚不确定 (即还没有接收到矢量 r \vec{r} ) 的情况下, 要使得先验概率为最大, 最好的判决方法就是选择具有最高先验概率 P ( s m ) P(\vec{s}_{m}) 的信号; 接受到矢量 r \vec{r} 后, 其方法与 前者类似, 前者是寻找先验概率的最大值, 此时是寻找后验概率的最大值, 换言之, 选 择使 P ( s m r ) P(\vec{s}_{m} \mid \vec{r}) 最大的 s m \vec{s}_{m} ,这个判决准则称为最大后验概率 (MAP) 准则。

根据贝叶斯公式, 后验概率可表示为:

P ( s m r ) = f ( r s m ) P ( s m ) f ( r ) P(\vec{s}_{m} \mid \vec{r})=\frac{f(\vec{r} \mid \vec{s}_{m}) P(\vec{s}_{m})}{f(\vec{r})}

当 M 个信号先验概率相等, 由于 f ( r ) f(\vec{r}) P ( s m ) P(\vec{s}_{m}) 均为确定的值 ( P ( s m ) = 1 M ) (P(\vec{s}_{m})=\frac{1}{M}) 。则寻找 P ( s m r ) P(\vec{s}_{m} \mid \vec{r}) 的最大值就等价于寻找 f ( r s m ) f(\vec{r} \mid \vec{s}_{m}) 的最大值。此时 MAP 准则简化为 M L \mathrm{ML} 准则。

我们不妨对接收到的矢量 r \vec{r} 进行简要的分析, r = s m + n , s m \vec{r}=\vec{s}_{m}+\vec{n}, \vec{s}_{m} 是信号矢量, n \vec{n} 是 AWGN 信道中的噪声矢量, 噪声矢量的分量 n k n_{k} 服从分布 N ( 0 , N o 2 ) N(0, \frac{N_{o}}{2}) , 则 r k r_{k} 服从分布 N ( s m k , N o 2 ) N(s_{m k}, \frac{N_{o}}{2})
因此

f ( r s m ) = k = 1 N 1 π N 0 e ( r k s m k ) 2 N 0 = 1 ( π N 0 ) N 2 e r s m 2 N 0 , m = 1 , 2 , , M \begin{aligned} f(\vec{r} \mid \vec{s}_{m}) & =\prod_{k=1}^{N} \frac{1}{\sqrt{\pi N_{0}}} \mathrm{e}^{-\frac{(r_{k}-s_{m k})^{2}}{N_{0}}} \\ & =\frac{1}{(\pi N_{0})^{\frac{N}{2}}} e^{\frac{|\vec{r}-\vec{s}_{m}|^{2}}{N_{0}}}, m=1,2, \ldots, M \end{aligned}

右端取对数有:

ln f ( r s m ) = N 2 ln ( π N 0 ) 1 N 0 k = 1 N ( r k s m k ) 2 \ln f(\vec{r} \mid \vec{s}_{m})=-\frac{N}{2} \ln (\pi N_{0})-\frac{1}{N_{0}} \sum_{k=1}^{N}(r_{k}-s_{m k})^{2}

上式若要取得最大值, 显而易见 k = 1 N ( r k s m k ) 2 \sum_{k=1}^{N}(r_{k}-s_{m k})^{2} 需要取最小值。这也是符合我们直观印象的, 信号空间里两个信号点的欧氏距离越小, 说明它们越接近。

因此,定义距离度量 D ( r s m ) D(\vec{r} \mid \vec{s}_{m}) 如下:

D ( r s m ) = k = 1 N ( r k s m k ) 2 , m = 1 , 2 , , M D(\vec{r} \mid \vec{s}_{m})=\sum_{k=1}^{N}(r_{k}-s_{m k})^{2}, m=1,2, \ldots, M

(2) 最佳检测器

最佳检测器将收到的信号向量 r \mathrm{r} 投射到 M 个可能的传输信号向量 { s m } \{s_{m}\} 之一上去, 并 选取对应与最大投影的向量。将上述定义的距离度量展开:

D ( r s m ) = r 2 2 r s m + s m 2 , m = 1 , 2 , , M D(\vec{r} \mid \vec{s}_{m})=|\vec{r}|^{2}-2 \vec{r} \cdot \vec{s}_{m}+|\vec{s}_{m}|^{2}, m=1,2, \ldots, M

其中, r 2 |\vec{r}|^{2} 项对所有的判决度量是等价的的, 我们忽略这一项, 则得到相关度量:

C ( r s m ) = 2 r s m s m 2 , m = 1 , 2 , , M C(\vec{r} \mid \vec{s}_{m})=2 \vec{r} \cdot \vec{s}_{m}-|\vec{s}_{m}|^{2}, m=1,2, \ldots, M

可以看出, 距离度量越小, 则相关度量越大。即相关度量与距离度量是完全等价的。

2.4 错误概率

理论错误概率:

 8PSK:  erfc ( 3 × 1 0 S N R 10 × sin ( π 8 ) ) ;  QPSK:  erfc ( 1 0 S N R 10 ) × ( 1 0.25 × erfc 1 0 S N R 10 ) \begin{array}{l} \text { 8PSK: } \operatorname{erfc}(\sqrt{3 \times 10^{\frac{S N R}{10}}} \times \sin (\frac{\pi}{8})) ; \\ \text { QPSK: } \operatorname{erfc}(\sqrt{10^{\frac{S N R}{10}}}) \times(1-0.25 \times \operatorname{erfc} \sqrt{10^{\frac{S N R}{10}}}) \end{array}

实际错误概率:

误码率: 错误码元/传输总码元

误比特率: 错误比特/传输总比特

三、系统框图

8PSK:

四、子函数设计

4.1 随机比特序列的产生

1.设计原理:

使用函数rand随机产生0到1之间的一串数,且按照0.5的判决门限标准化为0和1。

2.代码实现

function[a1]=bit(N)%N为想生成的随机序列的长度
y=rand(1,N);%生成一行N列在0~1之间的随机数
a1=zeros(1,N);
for i=1:N
    if y(i)>=0.5
        a1(i)=1;
    else
        a1(i)=0;%0.5为门限对信号进行判决
    end
end
end

4.2 比特序列进行格雷编码转换成四进制符号序列

1.设计原理

利用函数f(xy)=|3x-y|可将相应的比特序列xy用格雷码映射成对应的四进制符号。8psk中也可以用类似的函数将比特序列xyz用格雷码映射成对应的八进制符号。

2.代码实现

%四进制格雷码转换
function[a1,a2]= GrayEncode(N)
%a1是二进制随机比特序列,a2是四进制符号序列
a1=bit(2*N);%2L长度的随机比特序列
a2=zeros(1,N);% a2用来存放长度为L的码元序列
for i=1:2:2*N-1
    a2((i+1)/2)=abs(a1(i)*3-a1(i+1));%将比特序列用格雷码映射转换成四进制数
end   
end

%八进制格雷码转换
function[a1,a2]=GrayEncode8(N)
%a1是二进制随机比特序列,a2是八进制符号序列
a1=bit(3*N);%3L长度的随机比特序列
a2=zeros(1,N);%a2用来存放长度为L的码元序列
for i=1:3:3*N-2
   a2((i+2)/3)=abs(a1(i)*7-abs(a1(i+1)*3-a1(i+2)));
%将二进制比特序列进行格雷编码码转换成八进制序列
end 
end

4.3 映射函数

1.设计原理

利用原比特序列求出码元能量,之后根据

s m = ( ε s cos 2 π m M , ε s sin 2 π m M ) \vec{s}_{m}=(\sqrt{\varepsilon_{s}} \cos \frac{2 \pi m}{M}, \sqrt{\varepsilon_{s}} \sin \frac{2 \pi m}{M})

用for循环遍历,对横纵坐标分别进行映射即可。

2.代码实现

%QPSK坐标映射
function [y2]=ShineUpon(x,bit)
%x是编码后的四进制序列,bit是原来生成的二进制随机序列
N=length(x);
Es=bit*bit'/N;
y2=zeros(2,N);%y2的第一行用来存储横坐标,第二行用来存储纵坐标
for i=1:N%实现坐标映射
    y2(1,i)=sqrt(Es)*cos(pi/2*x(i));
    y2(2,i)=sqrt(Es)*sin(pi/2*x(i));
end
end 
%8PSK坐标映射
function [y3]=ShineUpon8(x1,bit)
%x1是编码后的八进制序列,bit是原来生成的二进制随机序列
N=length(x1);
Es=bit*bit'/N;
y3=zeros(2,N);%y3的第一行用来存储横坐标,第二行用来存储纵坐标
for i=1:N%坐标映射
    y3(1,i)=sqrt(Es)*cos(pi/4*x1(i)+pi/8);
    y3(2,i)=sqrt(Es)*sin(pi/4*x1(i)+pi/8);
end
end

4.4 噪声生成函数

1.设计原理

不再赘述。

2.代码实现

function [n]=NoiseOutput(N,sigma) 
%产生高斯随机噪声的子函数,sigma为标准差,N为噪声序列的长度
    nc=zeros(1,N);    
    ns=zeros(1,N); 
 for i=1:N
 u=rand;
 z=sigma*sqrt(2*log(1/(1-u)));
 u=rand;
 nc(i)=z*cos(2*pi*u);
 ns(i)=z*sin(2*pi*u);
 end
n=zeros(2,N); 
    n(1,:)=nc; 
    n(2,:)=ns; %输出两路相互正交的高斯信号
end

4.5 信道输出函数

1.设计原理

即将映射后的信号的横纵坐标分别叠加输出的两路正交噪声。

2.代码实现

function[y]=ChannelOutput(y1,n)
y=zeros(2,length(y1));
y(1,:)=y1(1,:)+n(1,:);
y(2,:)=y1(2,:)+n(2,:);
end

4.6 判决函数

1.设计原理

通过不同的判决方法对加噪信号进行判决:

最大投影准则求加噪信号在各发送信号的投影值求最大值。将最大值对应的发送信号作为此接收信号的发送信号。

最小欧式距离求各加噪信号和各发送信号之间的距离求最小值。将最小值对应的发送信号作为此接收信号的发送信号。

记录判决后的发送信号对应的点(0到M-1),按照格雷码编码规则,不同的点对应不同的比特组合,最后将各个点的比特组合连接成判决之后的比特流。

2.代码实现

%QPSK最小距离判决函数
function [y4]=MinDistance(y,Es)
%Es是每码元的能量,y是AWGN信道输出函数,a是判决之后得到的序列
N=length(y);
y4=zeros(1,N);
b=zeros(4,N);
c=zeros(1,N);
for i=1:N %最小距离判决
    b(1,i)=(y(1,i)-sqrt(Es)*cos(0))^2+(y(2,i)-sqrt(Es)*sin(0))^2;
    b(2,i)=(y(1,i)-sqrt(Es)*cos(pi/2))^2+(y(2,i)-sqrt(Es)*sin(pi/2))^2;
    b(3,i)=(y(1,i)-sqrt(Es)*cos(pi))^2+(y(2,i)-sqrt(Es)*sin(pi))^2;
    b(4,i)=(y(1,i)-sqrt(Es)*cos(3*pi/2))^2+(y(2,i)-sqrt(Es)*sin(3*pi/2))^2;
c(i)=min([b(1,i),b(2,i),b(3,i),b(4,i)]);
%找出最小距离度量
    switch c(i)%判决并恢复原序列
        case{b(1,i)}
            y4(i)=0;
        case{b(2,i)}
            y4(i)=1;
        case{b(3,i)}
            y4(i)=2;
        case{b(4,i)}
            y4(i)=3;
    end
end
end

%8PSK最小距离判决函数
function [y4]=MinDistance8(y,Es)
%Es是每码元的能量,y是AWGN信道输出函数,a是判决之后得到的序列
N=length(y);
y4=zeros(1,N);
b=zeros(8,N);
c=zeros(1,N);
for i=1:N %最小距离判决
    b(1,i)=(y(1,i)-sqrt(Es)*cos(pi/8))^2+(y(2,i)-sqrt(Es)*sin(pi/8))^2;
    b(2,i)=(y(1,i)-sqrt(Es)*cos(pi/8+pi/4))^2+(y(2,i)-sqrt(Es)*sin(pi/8+pi/4))^2;
    b(3,i)=(y(1,i)-sqrt(Es)*cos(pi/8+pi/2))^2+(y(2,i)-sqrt(Es)*sin(pi/8+pi/2))^2;
    b(4,i)=(y(1,i)-sqrt(Es)*cos(pi/8+3*pi/4))^2+(y(2,i)-sqrt(Es)*sin(pi/8+3*pi/4))^2;
    b(5,i)=(y(1,i)-sqrt(Es)*cos(pi/8+pi))^2+(y(2,i)-sqrt(Es)*sin(pi/8+pi))^2;
    b(6,i)=(y(1,i)-sqrt(Es)*cos(pi/8+5*pi/4))^2+(y(2,i)-sqrt(Es)*sin(pi/8+5*pi/4))^2;
    b(7,i)=(y(1,i)-sqrt(Es)*cos(pi/8+6*pi/4))^2+(y(2,i)-sqrt(Es)*sin(pi/8+6*pi/4))^2;
    b(8,i)=(y(1,i)-sqrt(Es)*cos(pi/8+7*pi/4))^2+(y(2,i)-sqrt(Es)*sin(pi/8+7*pi/4))^2;
    c(i)=min([b(1,i),b(2,i),b(3,i),b(4,i),b(5,i),b(6,i),b(7,i),b(8,i)]);%找出最小距离度量
    switch c(i)% 判决并恢复原序列
        case{b(1,i)}
            y4(i)=0;
        case{b(2,i)}
            y4(i)=1;
        case{b(3,i)}
            y4(i)=2;
        case{b(4,i)}
            y4(i)=3;
        case{b(5,i)}
            y4(i)=4;
        case{b(6,i)}
            y4(i)=5; 
        case{b(7,i)}
            y4(i)=6;
        case{b(8,i)}
            y4(i)=7;
    end
end
end

%QPSK最大投影判决函数
function [y4]=MaxProjection(y,Es)
%Es是每码元的能量,y是AWGN信道输出函数,a是判决之后得到的序列
N=length(y);
y4=zeros(1,N);
b=zeros(4,N);
c=zeros(1,N);
for i=1:N %最大投影判决
    b(1,i)=y(1,i)*sqrt(Es)*cos(0)+y(2,i)*sqrt(Es)*sin(0);
    b(2,i)=y(1,i)*sqrt(Es)*cos(pi/2)+y(2,i)*sqrt(Es)*sin(pi/2);
    b(3,i)=y(1,i)*sqrt(Es)*cos(pi)+y(2,i)*sqrt(Es)*sin(pi);
    b(4,i)=y(1,i)*sqrt(Es)*cos(3*pi/2)+y(2,i)*sqrt(Es)*sin(3*pi/2);
c(i)=max([b(1,i),b(2,i),b(3,i),b(4,i)]);
%找出最大投影度量
    switch c(i)%判决并恢复原序列
        case{b(1,i)}
            y4(i)=0;
        case{b(2,i)}
            y4(i)=1;
        case{b(3,i)}
            y4(i)=2;
        case{b(4,i)}
            y4(i)=3;
    end
end
end

4.7星座图绘制函数

1.设计原理

通过码元个数N为基准循环相应的次数,并通过四进制码元序列的值将星座图中的点归类,QPSK信号中应该有4种星座点,因此归为4类。归类完毕后,使用scatter函数绘制星座图。

2.代码实现

function Constellaion(y1,y2)
%y1为四进制码元序列,y2为有噪信道输出的信号 
figure 
for i=1:length(y1)     
    switch y1(i)         
        case {0}%0信号的星座点
            plot(y2(1,i),y2(2,i),'B.');hold on;grid on;
            axis([-2 2 -2 2]);
            line([2,-2],[0,0],'linewidth',1,'color','black');
            line([0,0],[2,-2],'linewidth',1,'color','black');
        case {1}%1信号的星座点
            plot(y2(1,i),y2(2,i),'Y.');hold on;grid on;
            axis([-2 2 -2 2]);
            line([2,-2],[0,0],'linewidth',1,'color','black');
            line([0,0],[2,-2],'linewidth',1,'color','black');
        case {2}%2信号的星座点
            plot(y2(1,i),y2(2,i),'R.');hold on;grid on;
            axis([-2 2 -2 2]);
            line([2,-2],[0,0],'linewidth',1,'color','black');
            line([0,0],[2,-2],'linewidth',1,'color','black');
        case {3}%3信号的星座点
            plot(y2(1,i),y2(2,i),'G.');hold on;grid on;
            axis([-2 2 -2 2]);
            line([2,-2],[0,0],'linewidth',1,'color','black');
            line([0,0],[2,-2],'linewidth',1,'color','black');

    end  
end
hold off;
end

4.8误码率及误比特率计算函数

1.设计原理

计算误码率使用矩阵转置相乘法,特点是代码简单,但是缺少直观;计算误比特率采用for循环中嵌套switch语句得到,特点是代码量繁杂,但是比较直观。

2.代码实现

%误码率计算函数
function [Pe]=SER(y1,y2)
%y1为本来输出的符号序列,y2为判决输出的符号序列,Pe是计算出来的误码率
N=length(y2);%N是判决输出符号的长度
y3=(y1~=y2);%y1(i)不等于y2(i)则为真,此时y3(i)等于1 
y3=double(y3);
error_num=y3*y3';%y3和它的转置相乘,就可计算出总的误符号数
Pe=error_num/N;%Pe:误码率
end

%误比特率计算函数
function [Pb]=BER(y1,y2)%y1为本来输出的符号序列,y2为判决输出的符号序列,Pe是计算出来的误比特率
N=length(y2);
k=zeros(1,2*N);t=zeros(1,2*N);
for i=1:N
switch y2(i)%根据多进制信号的结果恢复出原来的比特序列
    case 0
        k(2*i-1)=0;k(2*i)=0;
    case 1
        k(2*i-1)=0;k(2*i)=1;
    case 2
        k(2*i-1)=1;k(2*i)=1;
    case 3
        k(2*i-1)=1;k(2*i)=0;
end
end
for i=1:N
switch y1(i)
    case 0
        t(2*i-1)=0;t(2*i)=0;
    case 1
        t(2*i-1)=0;t(2*i)=1;
    case 2
        t(2*i-1)=1;t(2*i)=1;
    case 3
        t(2*i-1)=1;t(2*i)=0;
end
end
b=0;
for i=1:2*N
    if k(i)~=t(i)
        b=b+1;
    end
end
Pb=b/(2*N);%输出误比特率

五、主函数代码

5.1 星座图绘制主函数

1.编程思路

采用顺序结构依次调用GrayEncode(比特序列生成与格雷编码函数),ShineUpon(坐标映射函数),再调用ChannelOutput函数叠加噪声,最后用Constellaion函数绘制出星座图即可。

2.流程图


图5.1 星座图绘制主函数流程图

3.代码实现

clc;
close all;clear;
N=1000;%传输码元个数
sigma2=0.5;
sigma=sqrt(sigma2);
[bit,source]=GrayEncode(N);%bit为长度为2N的二进制随机比特序列,source为长度为N的四进制码元序列
Es=bit*bit'/N;%码元符号能量
symbol=ShineUpon(source,bit);%四进制码元序列映射成坐标
noise=NoiseOutput(N,sigma2);%两路正交噪声信号的生成
channel_out=ChannelOutput(symbol,noise);%噪声叠加
Constellaion(source,channel_out);%星座图绘制

5.2 QPSK误比特率分析主函数

1.编程思路

前半部分和星座图绘制的思路大体一致,即噪声叠加子函数以及其之前的函数都依次按照顺序结构调用,后半部分运用选择结构,若flag=1,调用MaxProjection(最大投影判决)函数,否则调用MinDistance(最小距离判决)函数。当然,整个主函数被嵌套进了一个for循环中,为了计算在多个不同信噪比下的误比特率,搭配semilogy函数画出我们希望的误比特率曲线来。

2.流程图

图5.2 qpsk误比特率分析主函数流程图

3.代码实现

clc;close all;clear;
N=100000;传输码元个数
flag=1;%判决方式:1. 最大投影法 0. 最小距离法;
Pe=zeros(1,101);
theoretic_Pe=zeros(1,101);
SNR=0:0.1:10;
for i=1:101
    [bit,source]=GrayEncode(N);%产生二进制比特序列和四进制码元序列
    Eb=bit*bit'/(2*N);
    c=ShineUpon(source,bit);%星座点映射
    r=10^(SNR(i)/10);  
    sigma2=Eb/(2*r);%噪声方差  
    sigma=sqrt(sigma2);
    noise=NoiseOutput(N,sigma);%产生两路正交的高斯噪声
    cn=ChannelOutput(c,noise);%噪声叠加 
    if flag==1
    decision1=MaxProjection(cn,Eb*2);%最大投影判决
    Pe(i)=BER(source,decision1);%最大投影的误比特率 
    else
    decision2=MinDistance(cn,Eb*2);%最小距离判决结果
    Pe(i)=BER(source,decision2);%最小距离的误比特率 
    end 
    %理论误比特率
    theoretic_Pe(i)=0.5*erfc(sqrt(r));
end  
figure
semilogy(SNR,Pe,'-r*');%仿真误码率曲线
hold on;  
semilogy(SNR,theoretic_Pe,'-b.');%理论误比特率曲线
legend('qpsk仿真误比特率曲线','qpsk理论误比特率曲线');
xlabel('Es/N0');ylabel('BER');grid on;
hold off;

5.3 QPSK与8PSK误码率对比主函数

1.编程思路

将主函数嵌套进一个for循环中,为了计算在多个不同信噪比下的误比特率,搭配semilogy函数画出我们希望的误比特率曲线来。对于主函数而言,仅仅是按照顺序结构依次次调用我们编写好的主函数即可,这里不再赘述。(这里涉及到了8PSK的误码率分析,所以调用了函数MinDistance8,用于以最小距离度量判决8PSK信号)

2.流程图

图5.3 qpsk与8psk误码率对比主函数流程图

3.代码实现

clc;  
close all;clear;
N=10000;
SNR=0:0.1:10;
Pe4=zeros(1,101);
Pe8=zeros(1,101);
theoreticPe4=zeros(1,101);
theoreticPe8=zeros(1,101);
for i=1:101
    r=10^(SNR(i)/10);    
    [bit4,source4]=GrayEncode(N);%产生长度为2N的二进制比特序列和长度为N的四进制码元序列
    Eb4=bit4*bit4'/(2*N);
    sigma2a=Eb4/(2*r);%噪声方差 
    y4=ShineUpon(source4,bit4);%星座点映射

    [bit8,source8]=GrayEncode8(N);%产生长度为3N的二进制比特序列和长度为N的八进制码元序列 
    Eb8=bit8*bit8'/(3*N);

    sigma2b=Eb8/(2*r);%噪声方差
    y8=ShineUpon8(source8,bit8);%星座点映射

noise4=NoiseOutput(N,sqrt(sigma2a));
%产生两路正交的高斯噪声
noise8=NoiseOutput(N,sqrt(sigma2b));
    r4=ChannelOutput(y4,noise4);%噪声叠加 
    r8=ChannelOutput(y8,noise8);%噪声叠加 
    decision4=MinDistance(r4,Eb4*2);%QPSK最小距离判决
    decision8= (r8,Eb8*3);%8PSK最小距离判决
Pe4(i)=SER(source4,decision4);
%QPSK仿真误码率 
Pe8(i)=SER(source8,decision8);
%8PSK仿真误码率 
theoreticPe4(i)=erfc(sqrt(r));
%QPSK理论误码率
    theoreticPe8(i)=erfc(sqrt(3*r)*sin(pi/8));
%8PSK理论误码率
end  
figure
semilogy(SNR,Pe4,'-rx');%QPSK仿真误码率曲线
hold on;  
semilogy(SNR,theoreticPe4,'-gv');%QPSK理论误码率曲线
hold on;  
semilogy(SNR,Pe8,'-b.');%8PSK仿真误码率曲线
hold on
semilogy(SNR,theoreticPe8,'-kd');%8PSK理论误码率曲线
legend('QPSK仿真误码率','QPSK理论误码率','8PSK仿真误码率','8PSK理论误码率');
xlabel('Es/N0(dB)');ylabel('SER'); 
hold off;

六、性能分析与实验结果

6.1 未加信道纠错编码的QPSK调制通信系统

1.最大投影点准则进行判决

a.画出噪声方差 σ 2 \sigma^{2} 分别为0,0.1,0.5,1时在检测器输入端1000个接收到的信号加噪声的样本(星座图);

图6.1 QPSK星座图(L=1000, σ 2 \sigma^{2} =0)

图6.2 QPSK星座图(L=1000, σ 2 \sigma^{2} =0.1)

图6.3 QPSK星座图(L=1000, σ 2 \sigma^{2} =0.5)

图6.4 QPSK星座图(L=1000, σ 2 \sigma^{2} =1)

结果分析:

对比图5.1,5.2,5.3,5.4中散点的离散程度,可以得出,随着噪声方差的增大,加噪信号星座图离散程度更大;若高斯噪声减小,则加噪信号星座图离散程度更小。这符合高斯噪声的特点。

b. 在AWGN信道下,分别画出数据点为1000,10000,100000时的Monte Carlo仿真误比特率曲线和理论误比特率曲线,比较差别,分析数据点的数量对仿真结果的影响(横坐标时snr=Eb/N0 dB,格雷码映射)

图6.5 QPSK仿真误码率和误符号率,理论误码率(1000点)

图6.6 QPSK仿真误码率和误符号率,理论误码率(10000点)

图6.7 QPSK最大投影准者仿真误码率和误符号率,理论误码率(100000点)

对比图5.5,5.6,5.7中最大投影准则判决条件下,各理论误比特率,仿真误比特率的图像,可以得出:随着数据点变多,曲线更加平滑,更加贴合理论值。另外,相同的码元传输数量下理论误码率和仿真误码率大致相同,且信噪比越小,两者越一致。

2.将检测器的距离改为最小距离法

在2.3节的分析中,我们已经证明了两种方法必然是等价的。因为这两种判决方法基于的都是ML准则。下面,我们用最小距离法做出数据点为100000时的仿真误比特率曲线和理论误比特率曲线,并与使用最大投影点法做比较,来更加直观地体会到两者的等价性。

在这里插入图片描述

图6. 8 相关度量法(上)与最小欧氏距离法(下)比较

可理论证明QPSK的误比特率与BPSK的一样。

6.2 QPSK与8PSK性能比较

在AWGN信道下,未加信道纠错码的8PSK调制通信系统检测器的判决准则选为最小距离法(星座图上符号间的距离),格雷码映射,比较数据点为100000时8PSK与QPSK的Monte Carlo仿真误符号率曲线,理论误符号率曲线,比较差别(横坐标是SNR=Eb/N0)。(一张图上呈现4条曲线)

图6. 9 QPSK与8PSK性能比较

QPSK的误码率明显小于8PSK的误码率,这是因为QPSK发送信号只有四种可能,而8PSK有八种可能,反映在星座图上,QPSK相邻两点的距离更大,抗干扰能力更强。

不过,更高阶的PSK系统能带来更高的带宽利用率。

七、问题回顾与总结

1.对二进制序列进行格雷编码的问题

刚开始思路是先编写一个生成格雷码表的子函数,然后用原序列对码表逐行相减,检测全零行,用检测到的行数减去1就得到对应M进制的格雷编码。但是最后在实践的过程中,发现这种方法思路还是过于繁杂,缺少直观,编写难度比较大,容易出错;而且不知何故,用这种方法编成的系统最后误码率的曲线与理论值偏差很大;还可在QPSK系统中,利用函数可将相应的比特序列xy用格雷码映射成对应的四进制符号;在8PSK中也有一个类似的映射函数(见4.2中“八进制格雷码转换”)。这里不再赘述。

2.在编写计算误码率的函数SER中,对方法进行简化的问题

其实谈到计算误码率,原本的第一反应是利用for循环遍历不相等的码元并相加,除以传输码元的总数即可得到,但是这种方法代码量巨大,十分不节省空间。回想到之前见到一种比较奇特的方法,即矩阵转置相乘法(见4.8节“误码率计算函数”)。这种方法相对for循环而言缺少直观,但是在实际运行中的速度要快于for循环。

3.关于用Legend函数添加图例的问题

在刚绘制完误码率曲线,使用Legend为绘图添加图例的时候,图例中所有的线形和颜色都是一样的。查找文档得知,在建立相关的变量时,使用zeros函数为变量设置大小,参数设置错误,建立的变量不是1维N列矩阵,而是N维N列的方阵,导致添加的图例的时候是每个点添加一个图例。改正zeros参数,使建立的矩阵为1维N列即可。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。