clearall;n=input('请输入移位寄存器的级数n,n是大于等于2的整数,且n不能为4的倍数,为4的倍数不保证结果正确:');%五级移位%N=2^n-1;%周期为N%x=gfprimfd(n,'all');%产生级数为n的本原多项式%[row,column]=size(x);if(n==2)%n为2是不能用下面求y的公式,作为特例直接写入%y=[1,1];endif(n2)y=x(1:row,2:column);%本来是nXn矩阵,第一列都是1,不要了,现在是nX(n-1)矩阵%endm=zeros(row,N);%求出所有m序列%forr=1:row%从1到第row行%register7=[zeros(1,n-1),1];%寄存器7,表示移位寄存器的初态除了最后一位,其余全0%m(r,1)=register7(n);%m(r,1)是的第r行第一列的取值%fori=2:1:N%从2到N,连续取值%register8(1)=mod(sum(y(r,:).*register7),2);%移位寄存器的向量与反馈系数的向量点乘后,新向量的所有数模二加,得到一个数作为寄存器8的第一位%forj=2:1:n%从2到N,连续取值%register8(j)=register7(j-1);%确定后n-1位%endregister7=register8;%保存移位寄存器现在的值到register1%m(r,i)=register7(n);%输出的书,从第2位开始%end%现在得到了第r行的m序列%end%现在得到了第1到第r行的m序列%if(n2)%列出m1最大行数,超过会报错%fprintf('m序列的行数小于等于%1.0f',row)%显示之后要输入m1的要求%endif(n==2)%列出m1最大行数,超过会报错%fprintf('m序列的行数小于等于1')%显示之后要输入m1的要求%endfprintf('\n')%换行%pass=1;%判断m1序列是否有优选对,若有,pass在下面循环中置0%while(pass==1)%若m1没有优选对,则循环%nom1=input('请从矩阵y中选出你所要m1序列本愿多项式的行数:');%输入一个数赋给nom1,numberofm1,即m1的行数%m1=m(nom1,:);%得到了你指定的m1序列%rm=zeros(1,2^n-1);%两个m序列的互相关性,用来判断m优选对%s=zeros(1,2^n-1);%m优选对中移位后相同数的个数%d=zeros(1,2^n-1);%m优选对中移位后相同数的个数%register2=zeros(1,2^n-1);%寄存器2,用以验证m序列优选对时移位%cmatch=0;%countermatch优选对匹配的数量%match=zeros(1,N);%匹配优选对所在的行数%matchs=zeros(1,N);%matchsequence匹配优选对的序列%fork=1:row%对m序列每一行循环%m2=m(k,:);%把m序列的第k行赋给m2%register1=m2;%寄存器1,用以验证m序列优选对时移位%fori=1:2^n-1A=mod((m1+register1),2);%移位加N次%forj=1:2^n-1%逐位判断m1与m2是否相同,判断N次%ifA(j)==0%若第j位位相同%s(i)=s(i)+1;%相同数加1,之后清零%endd(i)=N-s(i);%不同数减一,因为是s(i)的因变量,不用清0%endrm(i)=s(i)-d(i);%rm是互相关函数,因为是s(i)和d(i)的因变量,不用清0%s(i)=0;%必须清0,不然k的循环序列就会叠加%register2(1)=register1(N);%以下三行为循环右移%register1(2:N)=register1(1:N-1);register1(1)=register2(1);endmaxrm=max(abs(rm));%maxrm为互相关值的最大绝对值,因为是rm的因变量,所以不用清0%if(mod(n,2)==1)%对2除n求余,判断n的奇偶性%if(maxrm==2^((n+1)/2)+1)%奇数判断互相关最大绝对值是否满足书上条件4—37%cmatch=cmatch+1;%匹配(即互为优选对)个数加1%match(1,cmatch)=k;%匹配行数写入match序列中%matchs(cmatch,:)=m2;%匹配序列写入matchs矩阵中%endendif(mod(n,2)==0)%同上%if(maxrm==2^((n+2)/2)+1)%偶数判断互相关最大绝对值是否满足书上条件4—37%cmatch=cmatch+1;match(1,cmatch)=k;matchs(cmatch,:)=m2;endendendif(cmatch~=0)%若m1有优选对,cmatch不等于0%pass=0;%pass置0,while不在循环%endif(cmatch==0)%若m1没有优选对,cmatch等于0%fprintf('m1没有优选对,请重新选择m1行数')%输出括号中的数%fprintf('\n')%换行%endendfprintf('下列数字表示与m1互为优选对的m序列的行数')%输出括号中的数%match(1:cmatch)%因为后面没加分号,执行程序时会显示match序列的第1到第camtch列%choice=input('是否依次显示m1的优选对y/n:','s');%按括号中文字内容从键盘输入一个置%if(choice=='y')%输入y执行,输入其他任何数不执行%matchs%matchs,matchsequence,表示m1的所有优选对%endnom2=input('请从矩阵y中选出你所要m2序列的行数:');%同中文%m2=m(nom2,:);%得到m2,用优选对m1,m2,生成下面的gold序列,并选出平衡gold序列%gold=zeros(N+2,N);%一共N+2个gold序列,每个周期为N,设(N+2)*2的矩阵%register3=m2;%给寄存器3赋值m2,下面循环右移要用%register4=zeros(1,N);%给寄存器4设置成1xN的矩阵,下面循环右移要用%fori=1:N%循环N次%gold(i,:)=mod((m1+register3),2);%两m序列逐位模二加%register4(1)=register3(N);%下面三行为循环右移%register3(2:N)=register3(1:N-1);register3(1)=register4(1);end;gold(N+1,:)=m1;%m序列包含生成它的2个m序列%gold(N+2,:)=m2;c1=zeros(1,N+2);%代表1的个数counter1%c0=zeros(1,N+2);%代表0的个数counter2%cbg=0;%代表平衡gold序列的个数counterbalencegold%bg=zeros(1,N);%代表平衡gold序列%fori=1:N+2%开始找,要找N+2行%forj=1:N%弄出来一个全1的向量,长度为N,命名为judge函数judge(1,j)=0;ends2=mod((gold(i,:)+judge),2);%s2是一个gold序列与全1序列模二加得到的序列%fork=1:N%看有多少个1%ifs2(k)==1c1(i)=c1(i)+1;endendfork=1:N%有多少个0%ifs2(k)==0c0(i)=c0(i)+1;endendifc1(i)-c0(i)==1%1的个数比0多1,找到一个平衡序列%cbg=cbg+1;%平衡gold序列个数加1,可以看是不是约50%或75%是平衡的%bg(cbg,:)=gold(i,:);%这个个平衡序列复制到bg中%endendfprintf('已生成%1.0f个平衡gold序列',cbg)fprintf('\n')