美文网首页技术浪潮@IT·互联网
基于matlab下的m序列波形产生

基于matlab下的m序列波形产生

作者: 荻确如此 | 来源:发表于2017-07-12 18:06 被阅读385次

    在通信系统中的随机噪声会使模拟信号产生失真,是数字信号产生误码,并且他还是限制信道容量的一个重要因素。因此,人们经常希望消除或减少通信系统中的随机噪声。

    但是,有时候人们会希望获得随机噪声。比如,在实验室对通信设备或系统性能进行测试,可能要故意加入一定的噪声。又比如在战争通信中,实现高保密的通信,也希望利用随机噪声来迷惑敌方。

    那么就来了一个名字“伪随机序列”,他具有类似于随机噪声的某些统计特性,同时又能够重复产生。所以运用广泛,今天来讲讲m序列。

    m序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。

    m序列的产生

    从上图可以看出,先设置初始状态,之后根据框图的原型来进行移位,进行mod2运算。这样最后移位15次后又回到初始状态(1,0,0,0)。所以除了全零状态,一共可以用15种。

    一般来说,一个n级线性反馈移存器可能产生的最长周期等于2^n-1

    线性反馈移位寄存器原理方框图

    接下来是matlab代码

    close all; clear all; clc;
    fb=200000;
    upsample_NUM=20;  %每个符号的采样点数目
    BIT_NUM=520;
    load RC_LPF.mat;
    

    close all为关闭所有窗口,clear all为清除所有变量,clc清除命令

    这里加载了一个LPF文件。

    下面的公式可以作为依据直接产生m序列:

    image.png
    %产生m序列
    %m序列本原多项式:x^3+x+1, x^4+x+1, x^5+x^2+1,x^6+x+1, x^7+x^3+1
    % g3=[0 1 1];
    % g4=[0 0 1 1];
    % g5=[0 0 1 0 1];
    % g6=[0 0 0 0 1 1];
    % g7=[0 0 0 1 0 0 1];
    g8=[0 0 0 1 1 1 0 1];
    

    这里的要求是2的8次方的m序列,所以m的本原多项式可以得出。g8为特征多项式表示的数组模式,就相当于反馈系数cof,注意一开头的都是0;

    %下面产生m=8的序列
    m=length(g8);
    N=2^m-1;
    register=[zeros(1,m-1) 1];  %移位寄存器的初始状态
    new_register=zeros(1,m);
    m_seq_out8=zeros(1,N+1);
    m_seq_out8(1)=register(m);
    for i=2:N
        new_register(1)=mod(sum(g8.*register),2); %移存器与反馈系数进行模2加,更新移存器第1个数
        for j=2:m
            new_register(j)=register(j-1); %更新移存器其他数
        end
        register=new_register;
        m_seq_out8(i)=register(m);  %输出
    end
    m_seq_out9=2*m_seq_out8-1;  %双极性变换
    seq_byte=zeros(1,32);  %32字节,每个字节8bit,m序列被存放在该32字节中
    

    产生m=8的序列,当然N=2^m-1,这是最长周期,设置移位寄存器的初始状态,m-1列的0,最后是1,应该是[00000001],即a7为1,其他为0.。

    接下来的循环语句就是更新移存器,定义了新的变量new_register保存新的数据,最后返还给register。最后m序列数据都被存在32个字节中。

    for i=1:32
        for j=1:8
            seq_byte(i)=seq_byte(i)*2;
            if m_seq_out8((i-1)*8+j)==1
                seq_byte(i)=seq_byte(i)+1;
            end
        end
    end
    
    data1=zeros(1,20*length(m_seq_out9));  %将采样率扩展20倍,每个bit对应20个样值
    for i=1:length(m_seq_out9)
        for j=1:20
            data1(20*(i-1)+j)=m_seq_out9(i);
        end
    end
    data2=[data1,data1,data1,data1];
    data3=convn(data2,LPF1);  %LPF1为低通滤波器,对应抽样率为(20*200KSPS=4 MSPS)
    i=1:length(data3);
    figure;
    plot(i,data3);
    

    接下来的语法嵌套for循环,最后将data和LPF进行卷积,也就是说在频域进行相乘,这时候会出现“吉布斯”效应,就是低通滤波器产生的峰值谷值会比一跌个8.5%左右,所以产生了这样的波形。

    仿真波形

    这样就产生了想要的波形~

    把需要的语法熟悉,matlab和c语言语法很相似。任何模型都是需要算法作为基础的,好好学习,加油

    相关文章

      网友评论

        本文标题:基于matlab下的m序列波形产生

        本文链接:https://www.haomeiwen.com/subject/tgovhxtx.html