FPGA学习(2)m序列和gold序列的产生

文章介绍了m序列的生成原理和在通信中的应用,提供了一个4级m序列的MATLAB生成函数。接着,文章详细展示了如何使用MATLAB计算m序列和Gold序列的自相关及互相关函数,包括双极性转换和循环相关计算。最后,通过代码实现了Gold序列的生成并分析了相关性能。
摘要由CSDN通过智能技术生成

       m序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。一般来说,一个n级线性反馈移存器可能产生的最长周期等于2^{n-1}

        m序列是一种典型的伪随机序列。在通信领域有着广泛的应用,如扩频通信、卫星通信的码分多址(CDMA),数字数据中的加密、加扰、同步、误码率测量等领域。

        m序列产生原理如图一所示,反馈系数表如图二所示,

 

         下面为 m序列matlab产生函数,以4级m序列产生为例,周期为15,反馈系数为23,其反馈系数多项式为G=x^{4}+x^{2}+x+1,则函数的输入参数为[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互相关函数');

 

源代码均来自CSDN优秀博主,自己为了方便学习进行整理整合!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值