matlab生成m序列(数字图像水印相关)
m序列
定义
m序列是一种重要的伪随机序列(PN序列),它是由线性反馈移位寄存器产生的周期最长的序列,其规律性强,有很好的自相关性和较好的互相关特性。
周期由什么决定?
既然m序列是周期最长的序列(对于某一级数而言),那么如何寻找这种序列呢?实际上这与抽头的设计有关,抽头简单理解就是每一个线性反馈移位寄存器的反馈函数的线性系数,当这个线性系数恰好是对应级数本原多项式的时候,周期是最长的。(群论中的知识)
Matlab实现
抽头生成
m序列对应的抽头实际上是本原多项式的系数,假设我们生成7级的m序列:
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序列生成
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:N
newregister(1)=mod(sum(fbconnection.*register),2);%输入由反馈函数得到
for j=2:n
newregister(j)=register(j-1);%移位
end
register=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
原文地址:https://blog.csdn.net/qq_45607390/article/details/143659371
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!