目录
1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
在现代通信系统中,扩频技术被广泛应用于数字通信链路中。扩频技术通过将要传输的信息序列与一个宽带的伪随机码序列进行卷积,将原始信号转换成一个具有更大带宽的扩频信号。在接收端,通过对扩频信号进行解扩,恢复出原始信号。扩频技术具有良好的抗多径干扰和抗噪声干扰能力,因此被广泛应用于无线通信系统中。
LDPC编码是一种近年来被广泛研究和应用的编码技术。LDPC码是一种分布式的码,通过在一个大的稀疏矩阵中分配校验位和信息位,实现了低复杂度的译码算法。LDPC码具有良好的性能和低复杂度的解码算法,因此在数字通信系统中得到了广泛的应用。
2.1、基于扩频解扩的通信链路
基于扩频解扩的通信链路包括发射端和接收端两个部分。发射端将要传输的信息序列与一个伪随机码序列进行卷积,生成扩频信号。接收端将接收到的扩频信号进行解扩,恢复出原始信号。在此基础上,我们可以采用LDPC编码技术对原始信号进行编码和解码,从而提高通信系统的误码率性能。
发射端
发射端包括信源、扩频模块和调制模块。信源生成一个信息序列,扩频模块将信息序列与一个伪随机码序列进行卷积,生成扩频信号。调制模块将扩频信号进行调制,生成调制信号。
(1)信息序列
假设信息序列为 $x_i, i=1,2,...,N$,其中 $N$ 为信息序列长度。信息序列可以表示为一个列向量 $x=\begin{bmatrix} x_1 & x_2 & \cdots & x_N \end{bmatrix}^T$。
(2)伪随机码序列
伪随机码序列是一个具有较长长度和良好随机性质的序列,通常用于扩频信号的生成。假设伪随机码序列为 $c_i, i=1,2,...,M$,其中 $M$ 为伪随机码序列长度。伪随机码序列可以表示为一个列向量 $c=\begin{bmatrix} c_1 & c_2 & \cdots & c_M \end{bmatrix}^T$。
(3)扩频信号
将信息序列 $x$ 与伪随机码序列 $c$ 进行卷积,生成扩频信号 $s$。扩频信号可以表示为一个列向量 $s=\begin{bmatrix} s_1 & s_2 & \cdots & s_L \end{bmatrix}^T$,其中 $L=N+M-1$。
扩频信号的生成过程可以表示为:
$$
s=\mathbf{c}*\mathbf{x}
$$
其中 $*$ 表示卷积操作。
(4)调制信号
将扩频信号 $s$ 进行调制,生成调制信号。调制方式可以选择QPSK、16QAM或64QAM。调制信号可以表示为一个列向量 $y=\begin{bmatrix} y_1 & y_2 & \cdots & y_K \end{bmatrix}^T$,其中 $K$ 为调制信号长度。
在本文中,选择QPSK、16QAM和64QAM三种调制方式进行比较。QPSK调制将每两个连续的二进制比特映射到一个复平面上的点,共有四个点,因此称为四相移键控调制。16QAM调制将每四个连续的二进制比特映射到一个复平面上的点,共有16个点。64QAM调制将每六个连续的二进制比特映射到一个复平面上的点,共有64个点。
QPSK调制的映射方式可以表示为:
$$
\begin{aligned}
y_k&=a_k+jb_k \
&=\sqrt{\frac{E_s}{2}}(2x_{2k-1}-1+j(2x_{2k}-1))
\end{aligned}
$$
其中 $E_s$ 为每个符号的能量,$a_k$ 和 $b_k$ 分别表示实部和虚部,$j$ 表示虚数单位,$x_{2k-1}$ 和 $x_{2k}$ 分别表示第 $2k-1$ 个和第 $2k$ 个二进制比特。
16QAM调制的映射方式可以表示为:
$$
\begin{aligned}
y_k&=a_k+jb_k \
&=\sqrt{\frac{E_s}{10}}((2x_{4k-3}-1)(2^{3/2}-1)+j(2x_{4k-2}-1)(2^{3/2}-1)\
&\quad+(2x_{4k-1}-1)(2^{3/2}-1)+j(2x_{4k}-1)(2^{3/2}-1))
\end{aligned}
$$
其中 $E_s$ 为每个符号的能量,$a_k$ 和 $b_k$ 分别表示实部和虚部,$j$ 表示虚数单位,$x_{4k-3}$、$x_{4k-2}$、$x_{4k-1}$ 和 $x_{4k}$ 分别表示第 $4k-3$ 个、第 $4k-2$ 个、第 $4k-1$ 个和第 $4k$ 个二进制比特。
64QAM调制的映射方式可以表示为:
$$
\begin{aligned}
y_k&=a_k+jb_k \
&=\sqrt{\frac{E_s}{42}}((2x_{6k-5}-1)(2^{5/2}-1)+j(2x_{6k-4}-1)(2^{5/2}-1)\
&\quad+(2x_{6k-3}-1)(2^{5/2}-1)+j(2x_{6k-2}-1)(2^{5/2}-1)\
&\quad+(2x_{6k-1}-1)(2^{5/2}-1)+j(2x_{6k}-1)(2^{5/2}-1))
\end{aligned}
$$
其中 $E_s$ 为每个符号的能量,$a_k$ 和 $b_k$ 分别表示实部和虚部,$j$ 表示虚数单位,$x_{6k-5}$、$x_{6k-4}$、$x_{6k-3}$、$x_{6k-2}$、$x_{6k-1}$ 和 $x_{6k}$ 分别表示第 $6k-5$ 个、第 $6k-4$ 个、第 $6k-3$ 个、第 $6k-2$ 个、第 $6k-1$ 个和第 $6k$ 个二进制比特。
2.2接收端
接收端包括解调模块、解扩模块和LDPC译码模块。解调模块将接收到的调制信号进行解调,恢复出扩频信号。解扩模块将接收到的扩频信号进行解扩,恢复出原始信息序列。LDPC译码模块对解扩后的信息序列进行译码,恢复出原始信息序列。
(1)解调信号
将接收到的调制信号进行解调,恢复出扩频信号。解调方式与调制方式相对应,可以选择QPSK、16QAM或64QAM。解调信号可以表示为一个列向量 $r=\begin{bmatrix} r_1 & r_2 & \cdots & r_K \end{bmatrix}^T$,其中 $K$ 为解调信号长度。
解调信号的恢复过程可以表示为:
$$
r=\mathrm{Demod}(y)
$$
其中 $\mathrm{Demod}$ 表示解调操作。
(2)解扩信号
将接收到的扩频信号进行解扩,恢复出原始信息序列。解扩过程与扩频过程相反,可以表示为:
$$
x=\mathbf{c}^{-1}*\mathbf{r}
$$
其中 $\mathbf{c}^{-1}$ 表示伪随机码序列的逆序列,$*$ 表示卷积操作。
(3)LDPC译码
LDPC译码是指对接收到的信息序列进行解码,恢复出原始信息序列。LDPC码是一种分布式的码,可以通过在一个大的稀疏矩阵中分配校验位和信息位,实现低复杂度的译码算法。LDPC码的译码过程可以表示为:
$$
\hat{\mathbf{x}}=\mathrm{Decode}(\mathbf{y},\mathbf{H})
$$
其中 $\mathbf{y}$ 表示接收到的信息序列,$\mathbf{H}$ 表示LDPC码的校验矩阵,$\mathrm{Decode}$ 表示LDPC码的译码算法,$\hat{\mathbf{x}}$ 表示解码后的信息序列。
2.3、实现步骤
基于扩频解扩和LDPC编码的通信链路的实现步骤如下:
生成信息序列 $\mathbf{x}$,长度为 $N$。
生成伪随机码序列 $\mathbf{c}$,长度为 $M$。
对信息序列 $\mathbf{x}$ 和伪随机码序列 $\mathbf{c}$ 进行卷积,生成扩频信号 $\mathbf{s}$,长度为 $L=N+M-1$。
对扩频信号 $\mathbf{s}$ 进行调制,生成调制信号 $\mathbf{y}$,长度为 $K$。
将调制信号 $\mathbf{y}$ 通过信道进行传输,接收到接收信号 $\mathbf{r}$。
对接收信号 $\mathbf{r}$ 进行解调,恢复出扩频信号 $\mathbf{\tilde{s}}$。
对解调后的扩频信号 $\mathbf{\tilde{s}}$ 进行解扩,恢复出信息序列 $\mathbf{\tilde{x}}$,长度为 $N$。
对恢复出的信息序列 $\mathbf{\tilde{x}}$ 进行LDPC编码,生成编码后的信息序列 $\mathbf{c}(\mathbf{\tilde{x}})$,长度为 $L'$。
将编码后的信息序列 $\mathbf{c}(\mathbf{\tilde{x}})$ 通过信道进行传输,接收到接收信号 $\mathbf{y}'$。
对接收信号 $\mathbf{y}'$ 进行LDPC译码,恢复出原始信息序列 $\hat{\mathbf{x}}$,长度为 $N$。
3.MATLAB核心程序
....................................................................
max_iter = 40;
[H,G] = getG(M,N);
for i=1:length(SNR)
Bit_err(i) = 0;
Num_err = 0;
Numbers = 0; %误码率累加器
sigma = sqrt(1./(2*10^(SNR(i)/10)*R));
while Num_err <= TJL(2*i)
Num_err
fprintf('Eb/N0 = %f\n', SNR(i));
%产生需要发送的随机数
Trans_data = round(rand(1,N-M));
ldpc_code = mod(Trans_data*G,2);
%DSSS
pseudoNumber = round(rand(1,fp)');
[dsss,converted,PN2] = func_dsss(ldpc_code,pseudoNumber,fp);
Trans_BPSK = QAM64_modulation(dsss);
%通过高斯信道
Rec_BPSK = awgn(Trans_BPSK,SNR(i),'measured');
ReData = QAM64_demodulation(Rec_BPSK);
%DSSS
dsss2 = func_dsss2(ReData,pseudoNumber,fp);
z_hat = func_Dec(dsss2,sigma,H,max_iter);
x_hat = round(z_hat(size(G,2)+1-size(G,1):size(G,2)));
[nberr,rat]= biterr(x_hat',Trans_data);
Num_err = Num_err+nberr;
Numbers = Numbers+1;
end
Bit_err(i)=Num_err/(N*Numbers);
end
0X_003m
4.完整算法代码文件
V