乐趣区

关于通信协议:MPSK通信系统的设计与性能研究QPSK

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

一、QPSK 背景

二、原理概述

2.1 PSK 调制

发送端发送的是一连串离散而随机的二进制比特流,应用 PSK 载波相位调制的办法,这样发送端发送的音讯便蕴含在了相位中,此种调制办法能够非常无效地节约带宽。

$$
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)$ 是发送滤波器的脉冲形态, 传输信号的频谱个性由它决定。A 则是信号 的幅度。在 psk 调制中, 所有的 psk 信号对于所有的 $\mathrm{m}$ 都具备雷同的能量。能量为:

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

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

$$
\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}
$$

咱们规定:

$$
\{\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.
$$

通过上述剖析, 咱们不难得出, 这样一个相位调制信号能够看作两个正交载波, 因而, 数字相位调制信号能够在几何上可用二维向量的模式来示意, 即

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

正交基函数为:

$$
\{\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 \pi f_{c} t)-n_{s}(t) \sin (2 \pi f_{c} t)
$$

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

$$
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_{s}(t)$ 这两个正交噪声的重量是零均值, 互不相干的高斯随机过程。

2.3 解调形式

(1)最小欧式间隔准则裁决

最小欧式间隔准则裁决:求出接管到的信号向量与 M 个传输向量的欧式间隔,选取对应的最小欧式间隔的向量,该向量对应的符号即为裁决输入符号。此种办法须要把握间隔度量的概念并纯熟使用,上面给出对于间隔度量具体的实践剖析:

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

依据贝叶斯公式, 后验概率可示意为:

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

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

咱们无妨对接管到的矢量 $\vec{r}$ 进行简要的剖析, $\vec{r}=\vec{s}_{m}+\vec{n}, \vec{s}_{m}$ 是信号矢量, $\vec{n}$ 是 AWGN 信道中的噪声矢量, 噪声矢量的重量 $n_{k}$ 遵从散布 $N(0, \frac{N_{o}}{2})$ , 则 $r_{k}$ 遵从散布 $N(s_{m k}, \frac{N_{o}}{2})$。
因而

$$
\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(\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}
$$

上式若要获得最大值, 不言而喻 $\sum_{k=1}^{N}(r_{k}-s_{m k})^{2}$ 须要取最小值。这也是合乎咱们直观印象的, 信号空间里两个信号点的欧氏间隔越小, 阐明它们越靠近。

因而,定义间隔度量 $D(\vec{r} \mid \vec{s}_{m})$ 如下:

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

(2) 最佳检测器

最佳检测器将收到的信号向量 $\mathrm{r}$ 投射到 M 个可能的传输信号向量 $\{s_{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
$$

其中, $|\vec{r}|^{2}$ 项对所有的裁决度量是等价的的, 咱们疏忽这一项, 则失去相干度量:

$$
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 谬误概率

实践谬误概率:

$$
\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. 设计原理

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

$$
\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. 画出噪声方差 $\sigma^{2}$ 别离为 0,0.1,0.5,1 时在检测器输出端 1000 个接管到的信号加噪声的样本(星座图 );

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

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

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

图 6.4 QPSK 星座图(L=1000,$\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 列即可。

退出移动版