文章和代码曾经归档至【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 列即可。