我是靠谱客的博主 朴素烤鸡,最近开发中收集的这篇文章主要介绍伪随机序列伪随机序列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Matlab comm.PNSequence伪随机序列的生成——学习记录

  • 伪随机序列
    • 一、LFSR线性反馈移位寄存器
      • 特点与结构
      • Generation Polynomial
      • Mask
    • 二、comm.PNSequence
      • 功能描述
      • 使用方法

伪随机序列

伪随机(Pseudo Random,PN)序列作者有所了解,但是一直没有深入的去看。在学习5G NR的过程中,看到了comm.PNSequence这个Matlab的System object™,故准备在了解这个”函数“的同时,深入学习伪随机序列的生成过程。

一、LFSR线性反馈移位寄存器

说到伪随机序列就不得不介绍生成它的基本电路结构——线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)。

特点与结构

LFSR是一种移位寄存器电路,中间步骤的两个或多个输出被线性组合并反馈到输入值,故被称为线性反馈移位寄存器。它具有如下特点:

  • 如果初始状态相同,则总是得到相同的输出序列(意味着输出序列是确定的,在无线通信中可以在收端生成和发端相同的序列)。
  • 输出序列趋向于随机序列(伪随机)。
  • 经过一定次数的迭代后,可以得到与初始状态值相同的状态。(最大间隔可以通过 (2n - 1) 计算,其中n是移位寄存器的个数)。

其结构如图1所示,其中D触发器充当寄存器,模2加的输出作为反馈:
图1 线性反馈移位寄存器LFSR的结构示意图

图1 线性反馈移位寄存器(LFSR)的结构示意图 [1]

就按上图的电路结构,假设初始的序列为 [0 0 0 1],下一个状态,第三项和第四项进行模2加得到结果为1,初始序列右移一位,将得到的模2加结果补到最左边,那么经过一次移位后将会得到新的状态 [1 0 0 0],同时得到伪随机序列的第一位输出值1。完整的寄存器状态变化如表1所示:

表1 初始序列为 [0 0 0 1] 时寄存器状态变化表

LFSR状态变化示意图

Generation Polynomial

在编程生成PN序列时,图1的LFSR电路会以多项式的形式存在。它被称为生成多项式。图2将帮助理解生成多项式和实际电路的对应关系。这里需要特别注意,[4 3 0]不是第三和第四项做异或(我一开始一直以为是这样的),注意多项式次数和D触发器的对应情况。
生成多项式和实际电路的对应关系

图2 生成多项式和实际电路的对应关系[1]

Mask

这个是我在看Matlab comm.PNSequence时看到的一个属性,姑且翻译成掩码。它也是一个多项式,用二进制向量表示,代表LFSR电路的输出结果是哪几个寄存器的值异或的结果。如图1,直接输出最右侧寄存器的值,Mask多项式就可以表示成 [0 0 0 1],如果输出结果不是最右侧寄存器直接输出,是和其它寄存器的值做异或后得出的,那么就可以通过不同的Mask去表征。比如:最右侧三个寄存器的值异或后得到输出,Mask就表示为 [0 1 1 1]。

二、comm.PNSequence

功能描述

comm.PNSequence通过使用线性反馈移位寄存器(LFSR)来生成一个二进制的伪随机序列。
此object所包含的属性(Property)如下:

  1. Polynomial——生成多项式。用于确定移位寄存器的反馈连接情况。此多项式的长度为N+1,N为移位寄存器输入的原始序列的长度。“z6+z+1” (default)
    有两种表示方法,以 “z8+z2+1” 为例可表示为 [1 0 0 0 0 0 1 0 1] 或者 [8 2 0]。
  2. InitialConditionSource——初始条件的来源。分为 “Property” 和 “Input port” 两种。“Property”(default)
    Input port包含内容如下:
    a)initcond——用于移位寄存器的初始寄存器条件。表示初始的序列。
    b)maskvec——掩码矢量。表示初始序列往那个方向移动。
    c)outputsize——输出序列的长度。长度要小于等于 2m-1。
    d)resetseq——复位PN序列生成器。
  3. InitialConditions——移位寄存器的初始状态。即初始序列。[0 0 0 0 0 1] (default) | binary scalar | binary vector
  4. MaskSource——用于指示移位寄存器移位方向的掩码来源。‘Property’ (default) | ‘Input port’
  5. Mask——指示移位寄存器移位方向的掩码,这个其实不能说是移位方向,是指最后输出序列的值的计算方法。0 (default) | integer scalar | binary vector
  6. VariableSizeOutput——是否启用可变大小的输出。false (default) | true
  7. MaximumOutputSize——最大输出大小。[10 1] (default) | vector of the form [m 1]
  8. SamplesPerFrame——输出的PN序列的长度。1 (default) | positive integer
  9. ResetInputPort——是否使寄存器复位输入。false (default) | true
  10. BitPackedOutput ——是否二进制打包输出。false (default) | true
  11. NumPackedBits——每个输出码字的位数。8 (default) | integer in the range [1, 32]
  12. SignedOutput——是否输出带符号的二进制数字。false (default) | true
  13. OutputDataType——输出的数据类型。‘double’ (default) | ‘logical’ | ‘Smallest unsigned integer’ | ‘Smallest integer’

使用方法

上面那么多的属性中,我觉得主要需要自己设置的其实就是黄色高亮的4个——“Polynomial”、“InitialConditions”、“Mask”、“SamplesPerFrame”。分别代表生成多项式,寄存器的初始状态,输出的计算多项式和输出的长度(状态迭代次数)。
例:

  1. 如果要用Matlab计算表1情况的PN序列,即将4个参数分别设置为:Polynomial为 [ 4 1 0 ],InitialConditions为 [ 0 0 0 1 ],Mask为 [ 0 0 0 1 ],SamplesPerFrame为 15。

——Matlab代码如下:

pnSequence = comm.PNSequence('Polynomial',[4 1 0], 'Mask',[0 0 0 1],...
    'SamplesPerFrame',15,'InitialConditions',[0 0 0 1]);
PN_OUT = pnSequence();

Matlab的输出结果如下图所示,可以看到PN_OUT的结果和表1完全一致:

Matlab的程序运行结果





参考资料:
[1] http://www.sharetechnote.com/html/Handbook_Communication_LFSR.html
[2] https://blog.csdn.net/Graduate2015/article/details/113133919

最后

以上就是朴素烤鸡为你收集整理的伪随机序列伪随机序列的全部内容,希望文章能够帮你解决伪随机序列伪随机序列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部