m序列
定义
m序列是一种重要的伪随机序列(PN序列),它是由线性反馈移位寄存器产生的周期最长的序列,其规律性强,有很好的自相关性和较好的互相关特性。
周期由什么决定?
既然m序列是周期最长的序列(对于某一级数而言),那么如何寻找这种序列呢?实际上这与抽头的设计有关,抽头简单理解就是每一个线性反馈移位寄存器的反馈函数的线性系数,当这个线性系数恰好是对应级数本原多项式的时候,周期是最长的。(群论中的知识)
Matlab实现
抽头生成
m序列对应的抽头实际上是本原多项式的系数,假设我们生成7级的m序列:
matlab">primpoly(n,'all'); %n是级数
需要注意生成出来的是10进制、带多项式末尾1的数字,而抽头中不需要末尾1,并且需要翻转,注释在下节。
这里举一个例子,比如要生成6阶m序列,首先调用primpoly(6,'all')
如果选择 D 6 + D 1 + 1 D^6+D^1+1 D6+D1+1,调用dec2bin(67)
,得到1000011
,手动去除末尾1,并翻转,得到100001
,这样我们传入下一节mseq
函数的参数就是100001
。
m序列生成
matlab">function mseq = mseq(fbconnection)%fbconnection就是抽头% 这里是按照从左到右寄存器序号递增的顺序,所以右边对应高阶,左边对应低阶n=length(fbconnection);N=2^n-1;register=[zeros(1,n-1) 1]; %移位寄存器的初始状态mseq(1)=register(n); %m序列的第一个输出码元for i=2:Nnewregister(1)=mod(sum(fbconnection.*register),2);%输入由反馈函数得到for j=2:nnewregister(j)=register(j-1);%移位endregister=newregister;%移位寄存器状态更新mseq(i)=register(n);%输出end
end
参考链接
[1] https://www.zhihu.com/question/591327469/answer/2987694053
[2] https://www.cnblogs.com/xytang-mini-juan/p/17153103.html