欢迎订阅FPGA/MATLAB/Simulink系列教程
目录
1.软件版本
vivado2019.2,matlab2022a
2.理论简介
2.1 PN序列概述
PN序列即伪随机序列,是一种由近似随机但实际有一定规律的周期性二进制序列组成的常用地址码。其具有类似于随机序列的基本特性,貌似随机但实际上是可通过特定的规则或算法生成和复现。
PN 序列具有近似于白噪声的自相关特性,即除了在零时延处自相关函数有一个尖锐的峰值外,在其他时延处的自相关值都接近于零。同时,PN 序列是周期序列,这是它与真正随机序列的重要区别之一。
2.2 通过m序列产生PN序列
m序列是最长线性反馈移位寄存器序列(Maximum - length Linear Feedback Shift Register Sequence)的简称。它是一种由线性反馈移位寄存器(LFSR)产生的伪随机序列。m 序列的周期2^n-1,其中n是移位寄存器的级数。其结构如下图所示:
2.3 不同长度PN序列的自相关性能
自相关函数在零时延处有一个主峰,表示序列与自身完全对齐时的相关性最大。由于长度较短,在非零时延处的自相关旁瓣相对较大,与主峰的比值相对较高。例如,一个周期为7的m序列,其自相关函数在非零时延处的旁瓣可能会比较明显,虽然旁瓣值小于主峰,但在一些对自相关性能要求苛刻的应用中可能会产生干扰。
在同步检测方面,短PN 序列的短周期有利于快速同步,因为接收端不需要等待太长时间就可以遍历一个完整的周期来寻找同步点。然而,其较大的自相关旁瓣可能会导致在噪声环境下产生误判。而长PN序列虽然周期长,同步时间长,但一旦同步成功,其良好的自相关性能可以提供非常高的同步精度。在抗干扰方面,长PN 序列可以有效地抵抗多径干扰、窄带干扰和同频干扰等多种干扰。
因此,在实际设计中,我们需要根据信道的情况,来设计最佳长度的PN序列。在本课程中,我们将通过MATLAB来分析不同长度PN序列的抗干扰性能。
3.通过MATLAB产生PN序列
首先定义一个基于m序列的伪随机序列子函数为:
function [y]=mseq(X)
m=length(X);
len=2^m-1;
temp=0;
y=zeros(1,len);
regs = [1 zeros(1, m-2) 1];
for i=1:len
y(i)=regs(m);
temp = mod(sum(X.*regs) , 2);
regs(2:length(regs)) = regs(1:length(regs)-1); % 移位
regs(1)=temp; % 异或
end
%补充一个数据,数据到2的幂次方
y=[y];
end
然后我们调用该子函数:
clc;
clear;
close all;
warning off;
rng('default');
[PN1]=mseq([0,0,0,1,1,0]);
figure;
stem(PN1)
ylim([0,1.2]);
运行后,得到如下的结果:
这个就是一个长度为63的PN序列,即:
1,0,0,0,0,1,1,0,0,0,1,0,1,0,0,1,1,1,1,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,0
4.不通长度PN序列的抗干扰性能分析
这里,我们采用AWGN信道作为分析PN性能信道模型。首先我们先编写如下的MATLAB程序:
clc;
clear;
close all;
warning off;
rng('default');
[PN1]=2*mseq([0,0,0,0,1,1])-1;
figure;
stem(PN1)
ylim([0,1.2]);
data1 = [randn(1,256),PN1,randn(1,512)];
PK1 = xcorr(data1,PN1);
PK2 = PK1.^2;
figure;
subplot(211);
plot(PK1)
title('peak');
subplot(212);
plot(PK2)
title('peak^2');
运行后,我们可以看到如下仿真结果:
第一个图PN序列的自相关运算后得到的相关峰,第二个是相关峰的平方。一般情况下,峰值通过平方运算后,可以进一步增加相关峰的性能。
下面我们来分析不同长度下PN序列的自相关性性能。
4.1 PN长度=31
先编写matlab程序:
% 清除命令行窗口内容
clc;
% 清除工作空间中的变量
clear;
% 关闭所有图形窗口
close all;
% 关闭警告信息
warning off;
% 设置随机数生成器的种子为默认值
rng('default');
% 生成一个 m 序列并转换为 +1 和 -1 的形式,可能用于后续处理
[PN1]=2*mseq([0,0,0,1,1])-1;
% 绘制 PN1 的离散序列图
figure;
stem(PN1)
% 设置 y 轴范围
ylim([0,1.2]);
% 组合随机数据、PN1 序列和更多随机数据形成新的数据序列
data1 = [randn(1,256),PN1,randn(1,512)];
% 给 data1 加入噪声,信噪比为 -5dB,'measured' 表示根据信号的功率来计算噪声功率
datan1= awgn(data1,-5,'measured');
% 计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 创建一个新的图形窗口并划分为 4x2 的子图布局,在第一个子图中绘制 PK1
figure;
subplot(421);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 -5dB
title('peak,SNR=-5');
% 在第二个子图中绘制 PK2
subplot(422);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 0dB
datan1= awgn(data1,0,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第三个子图中绘制 PK1
subplot(423);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 0dB
title('peak,SNR=0');
% 在第四个子图中绘制 PK2
subplot(424);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 5dB
datan1= awgn(data1,5,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第五个子图中绘制 PK1
subplot(425);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 5dB
title('peak,SNR=5');
% 在第六个子图中绘制 PK2
subplot(426);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 10dB
datan1= awgn(data1,10,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第七个子图中绘制 PK1
subplot(427);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 10dB
title('peak,SNR=10');
% 在第八个子图中绘制 PK2
subplot(428);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
运行后结果如下:
可以看到,PN长度为31时,SNR大于10后,出现了相关峰,但是其峰值较小,且峰值附近的噪声也较大。在实际应用中会导致错误检测。当SNR小于10时,基本没法检测到明显的相关峰。
4.2 PN长度=63
将上面的matlab程序改为:
% 清除命令行窗口内容
clc;
% 清除工作空间中的变量
clear;
% 关闭所有图形窗口
close all;
% 关闭警告信息
warning off;
% 设置随机数生成器的种子为默认值
rng('default');
% 生成一个 m 序列并转换为 +1 和 -1 的形式,可能用于后续处理
[PN1]=2*mseq([0,0,0,0,1,1])-1;
% 绘制 PN1 的离散序列图
figure;
stem(PN1)
% 设置 y 轴范围
ylim([0,1.2]);
% 组合随机数据、PN1 序列和更多随机数据形成新的数据序列
data1 = [randn(1,256),PN1,randn(1,512)];
% 给 data1 加入噪声,信噪比为 -5dB,'measured' 表示根据信号的功率来计算噪声功率
datan1= awgn(data1,-5,'measured');
% 计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 创建一个新的图形窗口并划分为 4x2 的子图布局,在第一个子图中绘制 PK1
figure;
subplot(421);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 -5dB
title('peak,SNR=-5');
% 在第二个子图中绘制 PK2
subplot(422);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 0dB
datan1= awgn(data1,0,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第三个子图中绘制 PK1
subplot(423);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 0dB
title('peak,SNR=0');
% 在第四个子图中绘制 PK2
subplot(424);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 5dB
datan1= awgn(data1,5,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第五个子图中绘制 PK1
subplot(425);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 5dB
title('peak,SNR=5');
% 在第六个子图中绘制 PK2
subplot(426);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 10dB
datan1= awgn(data1,10,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第七个子图中绘制 PK1
subplot(427);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 10dB
title('peak,SNR=10');
% 在第八个子图中绘制 PK2
subplot(428);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
运行后结果如下:
当PN长度为63时,SNR大于0,均可以获得较为明显的相关峰,而当SNR<=0时,相关峰无法精确识别。
4.3 PN长度=127
将上面的matlab程序改为:
% 清除命令行窗口内容
clc;
% 清除工作空间中的变量
clear;
% 关闭所有图形窗口
close all;
% 关闭警告信息
warning off;
% 设置随机数生成器的种子为默认值
rng('default');
% 生成一个 m 序列并转换为 +1 和 -1 的形式,可能用于后续处理
[PN1]=2*mseq([0,0,0,0,0,1,1])-1;
% 绘制 PN1 的离散序列图
figure;
stem(PN1)
% 设置 y 轴范围
ylim([0,1.2]);
% 组合随机数据、PN1 序列和更多随机数据形成新的数据序列
data1 = [randn(1,256),PN1,randn(1,512)];
% 给 data1 加入噪声,信噪比为 -5dB,'measured' 表示根据信号的功率来计算噪声功率
datan1= awgn(data1,-5,'measured');
% 计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 创建一个新的图形窗口并划分为 4x2 的子图布局,在第一个子图中绘制 PK1
figure;
subplot(421);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 -5dB
title('peak,SNR=-5');
% 在第二个子图中绘制 PK2
subplot(422);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 0dB
datan1= awgn(data1,0,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第三个子图中绘制 PK1
subplot(423);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 0dB
title('peak,SNR=0');
% 在第四个子图中绘制 PK2
subplot(424);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 5dB
datan1= awgn(data1,5,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第五个子图中绘制 PK1
subplot(425);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 5dB
title('peak,SNR=5');
% 在第六个子图中绘制 PK2
subplot(426);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 10dB
datan1= awgn(data1,10,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第七个子图中绘制 PK1
subplot(427);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 10dB
title('peak,SNR=10');
% 在第八个子图中绘制 PK2
subplot(428);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
运行后结果如下:
可以看到,PN长度为127时,在不同SNR下,均可以获得较为明显的相关峰。
4.4 PN长度=255
将上面的matlab程序改为:
% 清除命令行窗口内容
clc;
% 清除工作空间中的变量
clear;
% 关闭所有图形窗口
close all;
% 关闭警告信息
warning off;
% 设置随机数生成器的种子为默认值
rng('default');
% 生成一个 m 序列并转换为 +1 和 -1 的形式,可能用于后续处理
[PN1]=2*mseq([0,0,0,0,1,1,1,1])-1;
% 绘制 PN1 的离散序列图
figure;
stem(PN1)
% 设置 y 轴范围
ylim([0,1.2]);
% 组合随机数据、PN1 序列和更多随机数据形成新的数据序列
data1 = [randn(1,256),PN1,randn(1,512)];
% 给 data1 加入噪声,信噪比为 -5dB,'measured' 表示根据信号的功率来计算噪声功率
datan1= awgn(data1,-5,'measured');
% 计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 创建一个新的图形窗口并划分为 4x2 的子图布局,在第一个子图中绘制 PK1
figure;
subplot(421);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 -5dB
title('peak,SNR=-5');
% 在第二个子图中绘制 PK2
subplot(422);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 0dB
datan1= awgn(data1,0,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第三个子图中绘制 PK1
subplot(423);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 0dB
title('peak,SNR=0');
% 在第四个子图中绘制 PK2
subplot(424);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 5dB
datan1= awgn(data1,5,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第五个子图中绘制 PK1
subplot(425);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 5dB
title('peak,SNR=5');
% 在第六个子图中绘制 PK2
subplot(426);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
% 给 data1 加入噪声,信噪比为 10dB
datan1= awgn(data1,10,'measured');
% 重新计算 data1 与 PN1 的互相关
PK1 = xcorr(datan1,PN1);
% 对互相关结果进行平方运算
PK2 = PK1.^2;
% 在第七个子图中绘制 PK1
subplot(427);
plot(PK1)
% 为该子图添加标题,表明当前 SNR 为 10dB
title('peak,SNR=10');
% 在第八个子图中绘制 PK2
subplot(428);
plot(PK2)
% 为该子图添加标题,表明当前是 PK1 的平方
title('peak^2');
运行后结果如下:
可以看到,PN长度为255时,在不同SNR下,均可以获得较为明显的相关峰。
综上所述,在一般的通信系统中(满足SNR>0时正常通信),选择PN长度为63就可以满足需求。因此在本课题中,我们选择长度为63的PN序列。