伪随机序列——m序列及MATLAB仿真

文章目录

  • 前言
  • 一、m 序列
    • 1、m 序列的产生
    • 2、m 序列的性质
      • ①、均衡性
      • ②、游程分布
      • ③、移位相加特性
      • ④、自相关函数
      • ⑤、功率谱密度
      • ⑥、伪噪声特性
  • 二、M 序列
    • 1、m 序列的产生
    • 2、m 序列的性质
  • 三、MATLAB 中 m 序列
    • 1、m 序列生成函数的 MATLAB 代码
    • 2、MATLAB 仿真


前言

在通信系统中的随机噪声会使模拟信号产生失真和使数字信号出现误码,并且,它还是限制信道容量的一个重要因素。因此人们经常希望消除或减小通信系统中的随机噪声。

另外,有时人们会希望获得随机噪声。例如,在实验室中对通信设备或系统性能进行测试时,可能要故意加人一定的随机噪声。

伪随机噪声具有类似于随机噪声的某些统计特性,同时又能够重复产生。由于它具有随机噪声的优点,又避免了随机噪声的缺点,因此获得了日益广泛的实际应用。目前广泛应用的伪随机噪声都是由周期性数字序列经过滤波等处理后得出的。在后面我们将这种周期性数字序列称为伪随机序列。它有时又称为伪随机信号和伪随机码。


一、m 序列

1、m 序列的产生

m 序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。现在,我们先给出一个 m 序列的例子。在下图中示出一个 4 级线性反馈移存器。
在这里插入图片描述

m 序列的产生

设其初始状态为 ( a 3 , a 2 , a 1 , a 0 ) = ( 1 , 0 , 0 , 0 ) (a_3,a_2,a_1,a_0)=(1,0,0,0) (a3,a2,a1,a0)=(1,0,0,0),则在移位一次时,由 a 3 a_3 a3 a 2 a_2 a2 模 2 相加产生新的输入 a 4 = 1 ⊕ 0 = 1 a_4=1\oplus0=1 a4=10=1,新的状态变为 ( a 4 , a 3 , a 2 , a 1 ) = ( 1 , 1 , 0 , 0 ) (a_4,a_3,a_2,a_1)=(1,1,0,0) (a4,a3,a2,a1)=(1,1,0,0)。这样移位15 次后又回到初始状态 ( 1 , 0 , 0 , 0 ) (1,0,0,0) (1,0,0,0)。不难看出若初始状态为全 “0” 即 (0,0,0,0) 则移位后得到的仍为全 “0” 状态。这就意味着在这种反馈移存器中应该避免出现全 “0” 状态,否则移存器的状态将不会改变。因为 4 级移存器共有 2 4 = 16 2^4=16 24=16 种可能的状态。除全 “0” 状态外,只剩 15 种状态可用。这就是说,由任何 4 级反馈移存器产生的序列的周期最长为15.

我们常常希望用尽可能少的级数产生尽可能长的序列。由上例可见,一般来说,一个 n 级线性反馈移存器可能产生的最长周期等于 ( 2 n − 1 ) (2^n-1) (2n1)。我们将这种最长的序列称为最长线性反馈移存器序列(maximal length linear feedback shift register sequence),简称 m 序列。

2、m 序列的性质

①、均衡性

在 m 序列的一个周期中,“1” 和 “0” 的数目基本相等。准确地说,“1” 的个数比 “0” 的个数多一个。

②、游程分布

我们把一个序列中取值相同的那些相继的(连在一起的)元素合称为一个 “游程(run)”。在一个游程中元素的个数称为游程长度。例如,在上图中给出的 m 序列可以重写为:
在这里插入图片描述
在其一个周期(m 个元素)中,共有 8 个游程,其中长度为 4 的游程有一个,即 “1 1 1 1”,长度为 3 的游程有一个,即 “0 0 0”,长度为 2 的游程有两个,即 “1 1” 和 “0 0”,长度为 1 的游程有 4 个即两个 “1” 和两个 “0”

一般说来,在 m 序列中,长度为 1 的游程占游程总数的 1/2;长度为 2 的游程占游程总数的 1/4;长度为 3 的游程占1/8。严格讲,长度为 k k k 的游程数目占游程总数的 2 − k 2^{-k} 2k,其中 1 ≤ k ≤ ( n − 1 ) 1\le k\le (n-1) 1k(n1)。而且在长度为 k k k 的游程中(其中 1 ≤ k ≤ ( n − 2 ) 1\le k\le (n-2) 1k(n2))。连 “1” 的游程和连 “0” 的游程各占一半。

③、移位相加特性

一个 m m m 序列 M p M_p Mp 与其经过任意次延迟移位产生的另一个不同序列 M r M_r Mr 模 2 相加得到的仍是 M p M_p Mp 的某次延迟移位序列 M s M_s Ms 即:
M p ⊕ M r = M s M_p \oplus M_r=M_s MpMr=Ms

④、自相关函数

下图为 m 序列的自相关函数。图中的圆点表示 j j j 取整数时的 ρ ( j ) \rho(j) ρ(j) 取值,而折线是 R ( τ ) R(\tau) R(τ) 的连续曲线。可以看出,两者是重合的。由图还可以看出当周期 T 0 T_0 T0 非常长和码元宽度 T 0 / m T_0/m T0/m 极小时 R ( τ ) R(\tau) R(τ) 近似于冲激函数 δ ( t ) \delta(t) δ(t) 的形状。
在这里插入图片描述

m 序列的自相关函数

由上述可知,m 序列的自相关函数只有两种取值:0 和 (1/m)。有时我们把这类自相关函数只有两种取值的序列称为双值自相关序列。

⑤、功率谱密度

对 m 序列的自相关函数做傅里叶变换可以得到其功率谱密度。
在这里插入图片描述

m 序列的功率谱密度

⑥、伪噪声特性

由于 m 序列的均衡性、游程分布和自相关特性与随机序列的基本性质极相似所以通常将 m 序列称为伪噪声(PN)序列,或称为伪随机序列。

二、M 序列

非线性反馈移存器产生的周期最长的序列称为 M 序列。它和上述 m 序列不同,后者是由线性反馈移存器产生的周期最长的序列。

m 序列产生器的分析可知,一个 n 级 m 序列产生器只可能有 ( 2 n − 1 ) (2^n-1) (2n1) 种不同的状态。但是 n 级移存器最多可有 2 n 2^n 2n 种状态,在 m 序列中不能出现的是全 “0” 状态。在线性反馈条件下,全 “0” 状态出现后,产生器的状态将不会再改变;但是在非线性反馈条件下,却不一定如此。因此,非线性反馈移存器的最长周期可达 2 n 2^n 2n,我们称这种周期长达 2 n 2^n 2n 的序列为 M 序列。

1、m 序列的产生

参考上面 m 序列的产生 图,它是一个 n=4 级的 m 序列产生器。图中给出了它的 15 种状态。若使它增加一个 “000”状态,就可变成 M 序列产生器了。因为移存器中后级状态必须是由其前级状态移入而得,故此 “0000” 状态必须处于初始状态 “1000” 之前和 “0001” 状态之后。这就是说,我们需要将其递推方程修改为非线性方程,使 “0001” 状态代入新的递推方程后,产生状态 “0000”(而不是“1000”),并且在 “0000” 状态代入后产生状态 “1000”(而不是保持“0000”不变)。

2、m 序列的性质

M 序列与 m 序列类似,也在一定程度上具有噪声特性。它满足 m 序列的前两个:

  • 在 M 序列的一个周期中,出现 “0” 与 “1” 的数目相等
  • 在 n 级 M 序列的一个周期中,游程共有 2 n − 1 2^{n-1} 2n1 个,其中长度为 k k k 的游程占 1 / 2 k 1/2^k 1/2k 1 < k ≤ n − 2 1<k≤n-2 1<kn2;长为 n n n 的游程有两个,没有长为 ( n − 1 ) (n-1) (n1) 的游程。在同长的游程中,“0” 游程和 “1” 游程各占 1/2。

在这里插入图片描述

4 级 M 序列产生器

M 序列与 m 序列相比,最主要的优点是数量大,即同样级数 n 的移存器能够产生的平移不等价 M 序列总数比 m 序列的大得多,且随 n 的增大迅速增加。在下表中给出了级数 n 与可能产生的两种序列数目的比较。
在这里插入图片描述

三、MATLAB 中 m 序列

1、m 序列生成函数的 MATLAB 代码

mseq.m

function [mout] = mseq(n, taps, inidata, num)% ****************************************************************
% n         : m序列的阶数n
% taps      : 反馈寄存器的连接位置
% inidata   : 寄存器的初始值序列 
% num       : 输出的m序列的个数
% mout      : 输出的m序列,如果num>1,则每一行为一个m序列
% ****************************************************************mout = zeros(num,2^n-1);
fpos = zeros(n,1);fpos(taps) = 1;for ii=1:2^n-1mout(1,ii) = inidata(n);                        % 寄存器的输出值temp        = mod(inidata*fpos,2);              % 计算反馈数据 inidata(2:n) = inidata(1:n-1);                  % 寄存器移位一次inidata(1)     = temp;                          % 更新第1个寄存器的值 endif num > 1                                          %如果要输出多个m序列,生成其他m序列for ii=2:nummout(ii,:) = shift(mout(ii-1,:),1);end
end

2、MATLAB 仿真

function code = mseq(n, taps, init, len)

code = mseq(3,[1 3],[1 1 1],52);
disp(code);
  • 参数 n 代表 m 序列的阶数,即序列的长度为 2 n − 1 2^n-1 2n1。输入参数 n 必须是一个正整数。
  • 参数 taps 是一个一维向量,指定用于生成 m 序列的反馈多项式的系数。这些系数表示了多项式中的项是否参与反馈。例如,如果taps为[1 3],则反馈多项式为 1 + z 3 1 + z^3 1+z3,其中 z 表示序列的延迟操作。
  • 参数 init 是一个一维向量,指定 m 序列的初始状态。该向量的长度必须小于或等于 n。如果 init 的长度小于n,则在其前面填充零。
  • 参数 len 表示要生成的 m 序列的长度。

可以看到如下结果:
生成的 code 是一个 52 × 7 double 类型:

     1     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     11     0     0     1     1     1     00     1     0     0     1     1     11     0     1     0     0     1     11     1     0     1     0     0     11     1     1     0     1     0     00     1     1     1     0     1     00     0     1     1     1     0     1

我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/181284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白标软件:时间与金钱的双赢助手

白标的好处是你不需要从零开始构建一个应用程序。供应商提供软件解决方案&#xff0c;而你提供品牌&#xff0c;并将应用程序包装、市场推广和盈利。 白标软件帮助节省时间和金钱的六种方式&#xff1a; 1、不需要招募软件开发组织或专业人员 传统上&#xff0c;软件开发需要…

strongswan:configure: error: OpenSSL Crypto library not found

引子 在配置strongswan时&#xff0c;有时会遇到以下错误&#xff08;其实所有需要openssl的软件configure时都有可能遇到该问题&#xff09;&#xff1a; configure: error: OpenSSL Crypto library not found 解决方法 crypto是什么呢? 是OpenSSL 加密库(lib), 这个库需要op…

深度学习_4 数据训练之线性回归

训练数据 线性回归 基本原理 比如我们要买房&#xff0c;机器学习深度学习来预测房价。房价的影响因素有&#xff1a;卧室数量&#xff0c;卫生间数量&#xff0c;居住面积。此外&#xff0c;还需要加上偏差值来计算。我们要找到一个正确率高的计算方法来计算。 首先&#…

Solidity入门第一步之数据类型

各种类型介绍 数值类型(Value Type)&#xff1a;包括布尔型(bool)&#xff0c;整数型(int、uint、uint256)等等&#xff0c;这类变量赋值时候直接传递数值。引用类型(Reference Type)&#xff1a;包括数组和结构体&#xff0c;这类变量占空间大&#xff0c;赋值时候直接传递地…

Python---字符串中的count()方法

count()方法 主要功能&#xff1a;求子串在字符串中出现的次数 count 英 /kaʊnt/ v. &#xff08;按顺序&#xff09;数数&#xff1b;计数&#xff0c;点数目&#xff1b;把……算入&#xff0c;包括&#xff1b;重要&#xff1b;被允许&#xff0c;被接受&#xff1b;…

[自学记录08*]LDR、HDR与ToneMapping

一、Dynamic Range—动态范围 Dynamic Range表示动态范围&#xff0c;检测DR&#xff0c;DR又分为LDR&#xff08;Low Dynamic Range&#xff09;和HDR&#xff08;High Dynamic Range&#xff09;。它们都是表示亮度值范围的一种方式&#xff0c;那么有什么区别呢。 1.LDR …

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…

Hive【Hive(八)自定义函数】

自定义函数用的最多的是单行函数&#xff0c;所以这里只介绍自定义单行函数。 Coding 导入依赖 <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.3</version></dependency>…

Flow-based models(NICE);流模型+NICE+代码实现

参考&#xff1a; 李宏毅春季机器学习NICE: Non-linear Independent Components Estimationhttps://github.com/gmum/nice_pytorch 文章目录 大致思想数学预备知识Jacobian矩阵行列式以及其几何意义Change of Variable Theorem Flow-based modelNICE理论代码 大致思想 Flow-B…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

【0基础学Java第七课】-- 类和对象01

7. 类和对象 7.1 面向对象的初步认知7.1.1 什么是面向对象7.1.2 面向对象与面向过程 7.2 类定义和使用7.2.1 简单认识类7.2.2 类的定义格式7.2.3 定义一个狗类7.2.4 定义一个学生类 7.3 类的实例化7.3.1 什么是实列化7.3.2 引用只能指向对象&#xff0c;且不能同时指向多个对象…

服务器基本命令

nohup python3 ./download-all-2023-11-01_12-08-11.py > T85_download.log & 标准输出重定向到文件 nohup bash test.sh > stdout.txt & 标准错误输出重定向到文件 nohup bash test.sh 2> stderr.txt & 重定向到不同文件 nohup bash test.sh > …

k8s之service五种负载均衡byte的区别

1&#xff0c;什么是Service&#xff1f; 1.1 Service的概念​ 在k8s中&#xff0c;service 是一个固定接入层&#xff0c;客户端可以通过访问 service 的 ip 和端口访问到 service 关联的后端pod&#xff0c;这个 service 工作依赖于在 kubernetes 集群之上部署的一个附件&a…

Servlet详解

一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…

LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答

原文&#xff1a;Knowledge Graphs & LLMs: Multi-Hop Question Answering 可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性&#xff0c;比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据&#xff0c;并将其提供给LLM&a…

Failed to launch task: 文件”Setup”不存在 Mac安装Adobe软件报错解决方案

在安装 Adobe 软件时&#xff0c;软件提示 Failed to launch task: 文件”Setup”不存在 &#xff0c;这个时候怎么处理呢&#xff1f; 解决方法如下&#xff1a; 1、安装 AnitCC 或 或 Creative Cloud 环境&#xff0c;保证软件所需要的环境 2、如果安装后也不起作用&#x…

Scala语言用Selenium库写一个爬虫模版

首先&#xff0c;我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码&#xff1a; libraryDependencies "org.openqa.selenium" % "selenium-ja…

基于人工大猩猩部队算法的无人机航迹规划-附代码

基于人工大猩猩部队算法的无人机航迹规划 文章目录 基于人工大猩猩部队算法的无人机航迹规划1.人工大猩猩部队搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用人工大猩猩部队算法…

SpringSecurity全家桶 (一) —— 简介

1. 概述 Spring Security 是一个框架&#xff0c;提供针对常见攻击的身份验证、授权和保护。 它为保护命令式和响应式应用程序提供了一流的支持&#xff0c;是保护基于 Spring 的应用程序的事实标准。 2. 了解 shiro&#xff1a; 在之前SSM框架盛行的时代&#xff0c;项目的…

轻信息服务展示预约小程序的内容是什么

预约几乎是适应所有经营商家的&#xff0c;可以提升客户服务/产品获取度、锁客及便捷性需求&#xff0c;同时也利于提升商家整体经营效率&#xff0c;无论获客还是留存线索都有很高帮助。 尤其对线下服务实体店来说&#xff0c;需要预约形式将客户引流到店&#xff0c;传统商家…