完整的m序列序列生成函数和调用

上午写了m序列的产生方法(点这里),下午我又把调用方法简单化了一下,把所有的代码贴上来,供大家参考。

mseq.m

生成m序列的主文件,调用的时候直接用生成系数的二进制或者八进制都行。

function [seq]=mseq(coef)
%==========================================================================
% 此函数用来生成最大长度m序列
% coef为特征多项式向量
%==========================================================================
if 1 == length(coef) % 此时直接输入的是8进制的反馈系数,需要准换成2进制
    coef = prepro(coef);
end

if sum(coef>1) % 如果转换出错,或者输入的时候虽然是个数组,但不是二进制的
    error('WRONG! the parameter of function mseq is invalid!');        
end

m=length(coef);
len=2^m-1; % 得到序列的长度     
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);
    registers(2:length(registers)) = registers(1:length(registers)-1);
    registers(1)=backQ;
end
end

prepro.m

mseq函数输入的预处理函数。

function ret = prepro(coef)
%==========================================================================
% 仅用于mseq.m
% 对输入的八进制数进行预处理,得到可以符合规则的反馈系数
%==========================================================================
bin = oct2bin(coef);
while 0 == bin(1)    
    bin = bin(2:length(bin));
end
ret = bin(2:length(bin));
end

oct2bin.m

把八进制数转换成二进制。这里的八进制数是用十进制表示的,如果超过八,则会报错(是因为我使用的表只有八行)。二进制直接放在一个数组中。

function bin = oct2bin(coef)
%==========================================================================
% 把8进制数(用十进制表示的)变成2进制数,并且存放在数组中
%==========================================================================
tmpData = [0 0 1; 0 1 0; 0 1 1; 1 0 0; 1 0 1; 1 1 0; 1 1 1; 0 0 0];
bin = [];
while coef ~= 0
    tmp = mod(coef,10);
    if  0 == tmp
        tmp = 8;
    end
    bin = [tmpData(tmp,:) bin];
    coef = floor(coef/10);
end
end

调用示例

完整的m序列序列生成函数和调用_第1张图片

你可能感兴趣的:(通信)