基于MATLAB的m序列产生函数及其调用方法
2017-10-03 09:32
681 查看
m序列的定义###
m序列是由n级线性移位寄存器产生的周期为P=2n−1的码序列,是最长线性移位寄存器序列的简称。关于m序列的基本生成原理网上介绍很多了,其主要步骤就是寄存器的移位和异或运算。即:特定位置寄存器(由反馈系数决定)的值取出来进行异或运算(也就是或者全部相加后模2的运算),寄存器中的值往输出端移位,最后一位输出,第一个寄存器放刚才异或运算中得到的值。
m序列生成函数的MATLAB代码
function [seq]=mseq(coef) %*************************************************** % 此函数用来生成m序列 % coef为反馈系数向量 % Author: FastestSnail % Date: 2017-10-03 %*************************************************** m=length(coef); len=2^m-1; % 得到最终生成的m序列的长度 backQ=0; % 对应寄存器运算后的值,放在第一个寄存器 seq=zeros(1,len); % 给生成的m序列预分配 registers = [1 zeros(1, m-2) 1]; % 给寄存器分配初始结果 for i=1:len seq(i)=registers(m); backQ = mod(sum(coef.*registers) , 2); %特定寄存器的值进行异或运算,即相加后模2 registers(2:length(registers)) = registers(1:length(registers)-1); % 移位 registers(1)=backQ; % 把异或的值放在第一个寄存器的位置 end end
该函数的调用方法
很多人得到函数不知道如何调用。首先需要得到一个不同位数m序列的反馈系数表。(网上有很多,我这里也是在网上截的图,感谢原作者。)
然后在表上查到你要生成的m序列的长度,比如说15,即周期P为15。从表上能看出,需要的寄存器级数为4,即有4个寄存器。然后反馈系数Ci为23。注意:这里是八进制,所以23对应的二进制位010 011,然后二进制中最高位的0不需要,所以序列位10011,这里有人就好奇了,为什么是5位,但是寄存器是4个?因为这里的Ci中的i是从0开始的,而且C0=1是确定的,所以,需要传到函数中的系数为[0 0 1 1]。
综上:调用方式是,首先把函数放在当前工作空间,然后输入
mseq([0 0 1 1])
返回的结果就是15位的m序列,如下:
最后再补充几点:
第一,关于寄存器的形状还有系数,我截了个图,(从百度文库上找的,感谢原作者,m序列原理)大家参考。
第二,八进制变二进制,可以打开windows下面的计算器,然后选择 查看->程序员,即可看到二进制,八进制,十进制和十六进制的转换。但是一般来说熟练了,十六进制与二进制、八进制与二进制的转换直接就能看出来。
第三,由于寄存器初始的值设置的不同(程序中默认为[1 0 0 …… 0 1],千万不能全部为0,一般来说有两个1就没问题),生成的m序列看似不一样,其实是一样的。只要通过循环移位,能够变成一样,就是正确的m序列。
相关文章推荐
- 浅析将matlab函数编译成dll供Cpp调用的方法
- 基于递归调用和链式结构的二叉树构建方法及其基本运算
- 【转】C++编程中用指针直接调用类成员函数问题及其解决方法
- matlab 调用opencv函数方法及matlab编译c++程序
- 有一分数序列:1/2,1/4,1/6,1/8......,用函数调用的方法,求此数列前20项的和
- Java端无需修改正确调用Matlab函数方法
- WPF调用Matlab函数的方法
- matlab函数编译成dll供Cpp调用的方法
- PHP中函数参数的调用及其灵活使用方法
- Java调用Matlab函数以及同时配置多版本JDK的方法
- Matlab产生可供VC调用的动态链接库的一种方法
- matlab函数编译dll,vs调用该dll的方法
- VC与Matlab混合编程——基于编译m函数为DLL的方法
- 在C#中调用Matlab函数出现的问题以及解决方法
- VC调用matlab中定义的.m文件中的函数的方法
- Matlab中fread函数的高级使用方法及其帮助文档中容易引起歧义的地方
- VC++编写DLL导出函数及其调用方法
- matlab函数编译成dll供Cpp调用的方法
- Python 调用Matlab的函数或者调用M文件方法
- [matlab]--调用不同路径下函数的方法(类似c++#include(xxx))