在通信系统中的随机噪声会使模拟信号产生失真,是数字信号产生误码,并且他还是限制信道容量的一个重要因素。因此,人们经常希望消除或减少通信系统中的随机噪声。
但是,有时候人们会希望获得随机噪声。比如,在实验室对通信设备或系统性能进行测试,可能要故意加入一定的噪声。又比如在战争通信中,实现高保密的通信,也希望利用随机噪声来迷惑敌方。
那么就来了一个名字“伪随机序列”,他具有类似于随机噪声的某些统计特性,同时又能够重复产生。所以运用广泛,今天来讲讲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序列:
%产生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语言语法很相似。任何模型都是需要算法作为基础的,好好学习,加油