伪随机序列——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-1
    
    mout(1,ii) = inidata(n);                        % 寄存器的输出值
    temp        = mod(inidata*fpos,2);              % 计算反馈数据 
    
    inidata(2:n) = inidata(1:n-1);                  % 寄存器移位一次
    inidata(1)     = temp;                          % 更新第1个寄存器的值 
    
end

if num > 1                                          %如果要输出多个m序列,生成其他m序列
    for ii=2:num
        mout(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     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1
     1     0     0     1     1     1     0
     0     1     0     0     1     1     1
     1     0     1     0     0     1     1
     1     1     0     1     0     0     1
     1     1     1     0     1     0     0
     0     1     1     1     0     1     0
     0     0     1     1     1     0     1

我的qq:2442391036,欢迎交流!


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Photoshop 2023 v24.7

Photoshop是一款强大的图像编辑软件&#xff0c;被广泛应用于图像处理、图形设计、数字绘画等领域。它提供了丰富的图像编辑功能&#xff0c;可以用于调整图像的色彩、亮度、对比度等&#xff0c;添加特效、滤镜&#xff0c;以及进行复杂的图像合成和修复。 以下是Adobe Photo…

基于动力学模型的机械臂滑膜控制

一、滑模控制设计思路 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/463230163&#xff08;思路理解&#xff09; https://blog.csdn.net/xiaohejiaoyiya/article/details/90271529&#xff08;干扰的处理&#xff09; 滑模控制的思路有两个关键&#xff0c;一个是设计…

一文通透各种注意力:从多头注意力MHA到分组查询注意力GQA、多查询注意力MQA

前言 通过本博客内之前的文章可知&#xff0c;自回归解码的标准做法是缓存序列中先前标记的键(K)和值(V) 对&#xff0c;从而加快注意力计算速度。然而&#xff0c;随着上下文窗口或批量大小的增加&#xff0c;多头注意力 (MHA)模型中与 KV 缓存大小相关的内存成本显着增长 对…

【多线程】Lambda表达式

package org.example;public class TestLambda {public static void main(String[] args) {Like likenew Like();like.lambda();}}//定义一个函数式接口 interface ILike{void lambda(); }//实现类 class Like implements ILike{Overridepublic void lambda() {System.out.prin…

Excel自学三部曲_Part3:Excel工作场景实战(四)

文章目录 四、高级函数与数据连接1. 多窗口操作2. VLOOKUP函数3. XLOOKUP函数4. CSV数据格式 四、高级函数与数据连接 1. 多窗口操作 如何将两张子表数据&#xff08;战区信息、城市信息&#xff09;连接到主表数据&#xff08;成交数据&#xff09;&#xff0c;增加主要数据的…

“一键批量拆分HTML文本,高效整理文件,提升工作效率“

您是否曾经被大量的HTML文本文件困扰&#xff0c;难以找到所需的特定信息&#xff1f;现在&#xff0c;我们向您推荐一款强大的工具&#xff0c;它能够一键拆分HTML文本&#xff0c;让您轻松实现文件整理&#xff0c;提高工作效率&#xff01; 首先&#xff0c;在首助编辑高手…

人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054

然后我们先来看BGD批量梯度下降,可以看到这里,其实这个公式来源于 梯度下降的公式对吧,其实就是对原始梯度下降公式求偏导以后的梯度下降公式,然后 使用所有样本进行梯度下降得来的,可以看到* 1/n 其实就是求了一个平均数对吧.所有样本的平均数. 然后我们看,我们这里* 1/n那么…

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一&#xff0c;使用HTTP接口开发和调用都很方便&#xff0c;也是被大量采用的方式&#xff0c;它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上&#xff0c;所以我们就需要有一定的安全措施来保证接口…

C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表的形式来实例化对象)

initializer_list 是 C11 中的一个特性&#xff0c;它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器&#xff0c;比如 std::vector、std::set、std::map 以及数组。 场景一&#xff1a;用初始化列表初始化容器 std::vector<int> arr {…

【深度学习】pytorch——Autograd

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…

scrapy+selenium框架模拟登录

目录 一、cookie和session实现登录原理 二、模拟登录方法-Requests模块Cookie实现登录 三、cookiesession实现登录并获取数据 四、selenium使用基本代码 五、scrapyselenium实现登录 一、cookie和session实现登录原理 cookie:1.网站持久保存在浏览器中的数据2.可以是长期…

Day20力扣打卡

打卡记录 数组中两个数的最大异或值&#xff08;位运算&#xff09; 链接 二进制位上从高位向低位进行模拟&#xff0c;看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…

【存档】vscode配置latex环境

原来在另一台电脑上找了个教程配了一遍&#xff0c;这次重新配的时候&#xff0c;那个教程作者更新过后&#xff0c;改成只有linux的脚本了&#xff0c;所以存档一下。真香警告, 2023年初的vscodelatex写作 - 知乎 (zhihu.com) 环境&#xff1a; win10/win11vscodelatex work…

【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)

目录 0. 前言 1. Cifar10数据集 2. AlexNet网络模型 2.1 AlexNet的网络结构 2.2 激活函数ReLu 2.3 Dropout方法 2.4 数据增强 3. 使用GPU加速进行批量训练 4. 网络模型构建 5. 训练过程 6. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我…

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

IDEA创建Springboot多模块项目

一、创建父模块 File --> New --> Project &#xff0c;选择 “ Spring Initalizr ” &#xff0c;点击 Next Next Next --> Finish 二、创建子模块 右键根目录&#xff0c;New --> Module 选择 “ Spring Initializr ”&#xff0c;点击Next 此处注意T…

设置IDEA快捷生成方法头,类头注释

1.File->settings->editor->live templates进入Live Template界面进行设置&#xff1a; 下一步&#xff1a; 下一步&#xff1a; /*** Title: $title$* author: sunyanzeng* date: $datatime$*/在需要添加文件头的地方打出“aa”&#xff0c;回车&#xff0c;会自…

go语言 | grpc原理介绍(三)

了解 gRPC 通信模式中的消息流 gRPC 支持四种通信模式&#xff0c;分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。 简单 RPC 在gRPC中&#xff0c;一个简单的RPC调用遵循请求-响应模型&#xff0c;通常涉及以下几个关键步骤和组件&#xff1a; 请求头&a…

Java自学第2课:Java语言基础知识要点

1 Java主类结构 任务&#xff1a;创建新项目名为item&#xff0c;包名为number&#xff0c;类名为first。 1.1 包声明 不指定包时&#xff0c;默认就是工程名&#xff0c;指定后&#xff0c;类文件可以分类了&#xff0c;是这意思吧。包就大概等于一个文件夹。而且在类文件中…

Educational Codeforces Round 2 D 计算几何

题目链接&#xff1a;Educational Codeforces Round 2 D 题目 给你两个圆。求它们相交处的面积。 输入 第一行包含三个整数 x1, y1, r1 (  - 109 ≤ x1, y1 ≤ 109, 1 ≤ r1 ≤ 109 ) - 第一个圆的圆心位置和半径。 第二行包含三个整数 x2, y2, r2 (  …