m序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。一般来说,一个n级线性反馈移存器可能产生的最长周期等于。
m序列是一种典型的伪随机序列。在通信领域有着广泛的应用,如扩频通信、卫星通信的码分多址(CDMA),数字数据中的加密、加扰、同步、误码率测量等领域。
m序列产生原理如图一所示,反馈系数表如图二所示,
下面为 m序列matlab产生函数,以4级m序列产生为例,周期为15,反馈系数为23,其反馈系数多项式为,则函数的输入参数为[0 1 1 1]。
function mseq = m_generate(fbconnection)
n=length(fbconnection);
N=2^n-1;
register=[1 zeros(1,n-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
% primpoly(n,'all'); %可以查看所有反馈系数
Gold序列是由两个码长相等、码时钟速率相同的m序列优选对通过模2相加而构成的。通过对m序列循环移位产生不同Gold序列。
在对m序列和Gold序列进行相关性能分析时,首先,要进行极性转换,转换为双极性码;其次,需要进行循环相关计算,而matlab自带的xcorr函数是通过补0操作进行计算,需要进行调整或者自己写函数实现。
%**************************************************
%m序列,Gold序列的自相关函数、互相关函数
%Gold序列是由两个m序列优选对模二加产生
%**************************************************
clc
clear all
%**************************************************
%寄存器参数
%**************************************************
T=1e-3; %码片宽度
% f1=[1 0 0 0 0 0 0 1 0 0 1]; %特征多项式x^10+x^3+1对应的系数
% f2=[1 0 1 0 0 0 0 1 1 0 1]; %特征多项式x^10+x^8+x^3+x^2+1对应的系数
% r=10; %寄存器位数
f1=[1 0 0 0 0 0 0 1 0 0 1]; %生成m序列的抽头系数1
f2=[1 0 1 0 0 0 0 1 1 0 1]; %生成m序列的抽头系数2
r = length(f1)-1;
n=2^r-1; %m序列长度
M1=zeros(1,n);
M2=zeros(1,n);
M1(1)=1; %初始状态10000000000
M2(1)=1;
%***************************************************
%产生m序列
%***************************************************
for i=r+1:n %递推公式得到m序列
M1(i)=mod(sum(M1(i-r:i-1).*f1(1:r)),2);
M2(i)=mod(sum(M2(i-r:i-1).*f2(1:r)),2);
end
mseq1 = m_generate([0 0 0 0 0 0 1 0 0 1]);
% M1 = mseq1;
mseq2 = m_generate([0 1 0 0 0 0 1 1 0 1]);
% M2 = mseq2;
% ***************************************************
% 产生Gold序列
% ***************************************************
G1=mod(M1+M2,2); %0比特相位差
s = randi([1 n],1);
% s=102; %s在0-n之间
G2=mod(M1+[M2(s+1:n) M2(1:s)],2); %s比特相位差
%***************************************************
%双极性序列
%***************************************************
M1=2*M1-1; %双极性m序列
M2=2*M2-1; %双极性m序列
G1=2*G1-1; %双极性m序列
G2=2*G2-1; %双极性m序列
%***************************************************
%自相关函数
%***************************************************
N=2*n-1;
t=(-n+1:n-1)*T;
Rm1=zeros(1,N); %M1的自相关函数
Rm2=zeros(1,N); %M2的自相关函数
Rg1=zeros(1,N); %G1的自相关函数
Rg2=zeros(1,N); %G2的自相关函数
for j=0:n-1
Rm1(n+j)= sum(M1.*[M1(j+1:n) M1(1:j)])/n;
Rm2(n+j)= sum(M2.*[M2(j+1:n) M2(1:j)])/n;
Rg1(n+j)= sum(G1.*[G1(j+1:n) G1(1:j)])/n;
Rg2(n+j)= sum(G2.*[G2(j+1:n) G2(1:j)])/n;
end
Rm1(1:n-1)= Rm1(N:-1:n+1);
Rm2(1:n-1)= Rm2(N:-1:n+1);
Rg1(1:n-1)= Rg1(N:-1:n+1);
Rg2(1:n-1)= Rg2(N:-1:n+1);
figure(1)
subplot(221);
plot(t,Rm1);
title('M1自相关函数');
subplot(222);
plot(t,Rm2);
title('M2自相关函数');
subplot(223);
plot(t,Rg1);
title('G1自相关函数');
subplot(224);
plot(t,Rg2);
title('G2自相关函数');
%********************************************************
%互相关函数
%********************************************************
Rm1m2=zeros(1,N);
Rm1g2=zeros(1,N);
Rm2g1=zeros(1,N);
Rg1g2=zeros(1,N);
for j=0:n-1
Rm1m2(n+j)= sum(M1.*[M2(j+1:n) M2(1:j)])/n;
Rm1g2(n+j)= sum(M1.*[G2(j+1:n) G2(1:j)])/n;
Rm2g1(n+j)= sum(M2.*[G1(j+1:n) G1(1:j)])/n;
Rg1g2(n+j)= sum(G1.*[G2(j+1:n) G2(1:j)])/n;
end
Rm1m2(1:n-1)= Rm1m2(N:-1:n+1);
Rm1g2(1:n-1)= Rm1g2(N:-1:n+1);
Rm2g1(1:n-1)= Rm2g1(N:-1:n+1);
Rg1g2(1:n-1)= Rg1g2(N:-1:n+1);
figure(2)
subplot(221);
plot(t,Rm1m2);
title('M1、M2互相关函数');
subplot(222);
plot(t,Rm1g2);
title('M1、G2互相关函数');
subplot(223);
plot(t,Rm2g1);
title('M2、G1互相关函数');
subplot(224);
plot(t,Rg1g2);
title('G1、G2互相关函数');
文章来源:https://www.toymoban.com/news/detail-511174.html
源代码均来自CSDN优秀博主,自己为了方便学习进行整理整合!文章来源地址https://www.toymoban.com/news/detail-511174.html
到了这里,关于FPGA学习(2)m序列和gold序列的产生的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!