【教程4>第5章>第3节】通过MATLAB分析不同长度PN序列的自相关性能

 欢迎订阅FPGA/MATLAB/Simulink系列教程

《★教程1:matlab入门100例》

《★教程2:fpga入门100例》

《★教程3:simulink入门60例》

《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》

目录

1.软件版本

2.理论简介

2.1 PN序列概述

2.2 通过m序列产生PN序列

2.3 不同长度PN序列的自相关性能

3.通过MATLAB产生PN序列

4.不通长度PN序列的抗干扰性能分析

4.1 PN长度=31

4.2 PN长度=63

4.3 PN长度=127

4.4 PN长度=255


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序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值