% m序列发生器, mgen.m
function [out,T] = mgen( g,state,N)
%输入 g: m序列生成多项式(反馈系数) (10进制输入)
% 8进制反馈系数(10进制):
%级数n=3时,反馈系数=13(11)
%级数n=4时,反馈系数=23(19)
%级数n=5时,反馈系数=45,67,75(37,55,61)
%级数n=6时,反馈系数=103,147,155(67,103,109)
%……
% state: 寄存器初始状态 (10进制输入)
% N: 输出序列长度
% test g =19; state=3; N=1000;
gen=dec2bin(g)-48; %0的ascii码为48;dec2bin的返回值为一个字符串;-48得到数组矩阵
M=length(gen)-1;%寄存器个数
curState=dec2bin(state,M)-48;%状态数组长度与寄存器个数一致
T=2^M-1;%序列周期
for k=1:T
m_t(k)=curState(M);
a=rem(sum(gen(1:end-1).*curState),2);%寄存器首位的新输入 matlab中多项式系数是从高位到低位二寄存器反馈系数是从低到高
curState=[a curState(1:M-1)];
end
temp=int32(N/T)+1;%输出扩频码周期个数(四舍五入为整数),为了避免四舍五入要加1保证足够的扩频码
temp1=ones(1,temp);
out_temp=kron(temp1,m_t);%直积,temp矩阵的每个元素都要乘以矩阵m_t
out(1:N)=2*out_temp(1:N)-1;%只取所需的N个点 1--1.0 -- -1
t=0:N-1;
plot(t,zixiangguan2(out(1:N))/N);
end