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

news2024/11/24 14:26:12

文章目录

  • 前言
  • 一、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,欢迎交流!


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15 _ 二分查找(上):如何用最省内存的方式实现快速查找功能?

今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。 老规矩,我们还是来看一道思考题。 假设我们…

【Android】Android Framework系列---CarPower深度睡眠STR

Android Framework系列—CarPower深度睡眠 之前博客的说说CarPower的开机启动流程 这里分析一下&#xff0c;Android CarPower实现深度睡眠的流程。 首先&#xff0c;什么是深度睡眠(Deep Sleep)? Android进入Deep Sleep后&#xff0c;关闭屏幕、关闭CPU的电源&#xff0c;保…

【Head First 设计模式】-- 观察者模式

背景 客户有一个WeatherData对象&#xff0c;负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求&#xff0c;让我们利用WeatherData对象取得数据&#xff0c;并更新三个布告板&#xff1a;目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口&#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;且不能同时指向多个对象…

C#使用随机数模拟英雄联盟S13瑞士轮比赛

瑞士轮赛制的由来 瑞士制&#xff1a;又称积分循环制&#xff0c;最早出现于1895年在瑞士苏黎世举办的国际象棋比赛中&#xff0c;故而得名。其基本原则是避免种子选手一开始就交锋、拼掉&#xff0c;是比较科学合理、用得最多的一种赛制&#xff1b;英语名称为Swiss System。…

微信内H5页面唤醒App

首先&#xff0c;简述一下这个需求的背景&#xff0c;产品希望能够让用户在微信内&#xff0c;打开一个h5页面&#xff0c;然后就能唤醒公司中维护的app&#xff0c;这个是为了能够更好的引流。 唤醒app的三种方案 IOS系统-Universal Link&#xff08;通用链接&#xff09; …

invoke方法传参String数组问题——wrong number of arguments

invoke方法传参String数组问题——wrong number of arguments 问题描述一、案例准备二、错误反射调用实例三、正确反射调用实例 问题描述 今天笔者在使用invoke方法的时候&#xff0c;发现报了一个这样一个错&#xff1a;“wrong number of arguments”&#xff0c;在网上冲浪…

【Python】-- python的基本图像处理(图像显示、保存、颜色变换、缩放与旋转等)

目录 一、图像文件的读写 操作步骤&#xff1a; 显示图像文件的三个常用属性&#xff1a; 例&#xff1a; 二、图像文件的处理 常用的图像处理方法 1、图像的显示 2、图像的保存 3、图像的拷贝与粘贴 4、图像的缩放与旋转 5、图像的颜色变换 6、图像的过滤与增强 7、序…

【MySQL】用户管理权限控制

文章目录 前言一. 用户管理1. 创建用户2. 删除用户3. 修改用户密码 二. 权限控制1. 用户授权2. 查看权限3. 回收权限 结束语 前言 MySQL的数据其实也以文件形式保存&#xff0c;而登录信息同样保存在文件中 MySQL的数据在Linux下默认路径是/var/lib/mysql 登录MySQL同样也可以…

全网超细,Pytest自动化测试框架入门到精通-实战整理,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Pytest和Unitt…

交叉编译程序:以 freetype 为例

1 程序运行的一些基础知识 1.1 编译程序时去哪找头文件&#xff1f; 系统目录&#xff1a;就是交叉编译工具链里的某个 include 目录&#xff1b;也可以自己指定&#xff1a;编译时用 “ -I dir ” 选项指定。 1.2 链接时去哪找库文件&#xff1f; 系统目录&#…

二叉树OJ练习题(C语言版)

目录 一、相同的树 二、单值二叉树 三、对称二叉树 四、树的遍历 前序遍历 中序遍历 后序遍历 五、另一颗树的子树 六、二叉树的遍历 七、翻转二叉树 八、平衡二叉树 一、相同的树 链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; bool isSameTree(…

前端框架Vue学习 ——(一)快速入门

文章目录 Vue 介绍Vue快速入门 Vue 介绍 Vue 是一套前端框架&#xff0c;免除原生 JavaScript 中的 DOM 操作&#xff0c;简化书写。基于 MVVM (Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。官网: https://v2.cn.vuejs.or…

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…

【Linux系统化学习】开发工具——gdb(调试器)

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 个人仓库&#xff1a;Gitee 目录 前言&#xff1a; gdb版本检查和安装 Debug和Release gdb的使用 其他指令 前言&#xff1a; 前几篇文章分别介绍了在Linux下的代码编辑器、编译器。…

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

2021年电工杯数学建模B题光伏建筑一体化板块指数发展趋势分析及预测求解全过程论文及程序

2021年电工杯数学建模 B题 光伏建筑一体化板块指数发展趋势分析及预测 原题再现&#xff1a; 国家《第十四个五年规划和 2035 年远景目标纲要》中提出&#xff0c;将 2030 年实现“碳达峰”与 2060 年实现“碳中和”作为我国应对全球气候变暖的一个重要远景目标。光伏建筑一体…

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到LongLora版LLaMA、Mistral

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…

1.Netty概述

原生NIO存在的问题(Netty要解决的问题) 虽然JAVA NIO 和 JAVA AIO框架提供了多路复用IO/异步IO的支持&#xff0c;但是并没有提供给上层“信息格式”的良好封装。JAVA NIO 的 API 使用麻烦,需要熟练掌握 ByteBuffer、Channel、Selector等 , 所以用这些API实现一款真正的网络应…

题解:轮转数组及复杂度分析

文章目录 &#x1f349;前言&#x1f349;题目&#x1f34c;解法一&#x1f34c;解法二&#xff1a;以空间换时间&#x1f95d;补充&#xff1a;memmove &#x1f34c;解法三&#xff08;选看&#xff09; &#x1f349;前言 本文侧重对于复杂度的分析&#xff0c;题解为辅。 …