基于MATLAB的m序列产生与CDMA扩频与解扩实现
目录
一、什么是m序列?
1.1 概念与理解
m序列是由n级线性移位寄存器产生的周期为P=2^ n-1,码分多址(CDMA)主要采用两种长度的m序列:一种是周期为P=2^ 15-1的短PN序列,另一种是P=2^42-1的长PN序列。
用于随机信号源的伪随机序列发生器。还用于数据加扰与保密通信领域。
1.2 产生m序列的条件
一个线性移位反馈寄存器能否产生m序列的条件决定于它的反馈系数Ci,如下图所示:
将八进制转换为二进制代入即可。比如以m序列级数n=4为例,它的周期为15,反馈系数为23(八进制)转换为二进制是10011,所以C0=1,C1=0,C2=0,C3=1,C4=1。故取C1-C4为0011.
1.3 产生m序列
以4级m序列为例,该序列码发生器如下图所示,假设初始状态X1~X4为0001,又因为4级m序列的反馈系数为23,所以C1-C4为0011,故产生的时序表如下图所示:
如图可以看出从初始状态0到时钟14正好是周期15,到时钟15的时候成为了初始0的状态,所以得出相应的4级m序列为100010011010111,这就产生了4级m序列。其他级m序列生成也类似,只是在更高级的m序列在反馈系数选择不同,得到的m序列也不同。(随手画的有些丑)
1.4 用MATLAB实现m序列的产生
(1)编写mseq函数实现序列发生器的运行:
function[mseq]=mseq(fbconnection)
n=length(fbconnection);
N=2^n-1;
register=[zeros(1,n-1) 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
再调用该函数,输出即可:
mesq=mseq([0 0 1 1]); %从左往右C1 C2 C3等 mseq函数参数对应M序列的反馈系数变为二进制
plot(mesq)
axis([0 15,0 1.5]);
仿真图如图所示:
仿真结果与计算结果一致,生出了m序列。
二、二、CDMA扩频与解扩
2.1 直接序列码分多址介绍
将需要传送的具有一定带宽的信号,用另一个带宽远大于信号带宽的高速伪随机码进行调制,使原数据信号的带宽被扩展,即扩频。接收端使用完全相同的伪随机码,与接收的信号作相关处理,把宽带信号转换成原始的窄带信号即解扩,以实现信息通信。本次使用的伪随机码是m序列码。
在进行扩频解扩操作之前先写各模块的函数用来调用。
2.2 MATLAB实现扩频和解扩
(1)suiji.m (用来随机生成用户的信息信号)
function [x] = suiji(L)
x=rand(1,L);
x(find(x<0.5))=-1;
x(find(x>=0.5))=1;
end
(2)de_mod.m (用来进行用户信息信号的扩频)
%参数c为使用的伪随机码
%参数x为输入的信息信号
%参数y为得到的扩频后的信号
function y = ds_mod(c,x)
tmp = c*x;
y = tmp(:);
end
(3)de_demod.m (用来进行对扩频信号的解扩)
%参数c为使用的伪随机码
%参数y为扩频信息信号
%参数y为得到的解扩后的信号
function x = ds_demod(c,y)
tmp=reshape(y,length(c),length(y)/length(c));
tmp=tmp';
x=tmp*c;
x=x';
end
(4)main.m (用来进行实现扩频解扩操作)
clc;
clear all;
n=4; %用周期为15的m序列来进行扩频与解频
x_num=10; %传输信息码元数
X=suiji(x_num); %生成随机数
subplot(411)
plot(X);
title('原信息');
C=mseq([0 0 1 1]);
%从左往右C1 C2 C3等 mseq函数参数对应M序列的反馈系数23变为二进制 初始值X1X2X3X4分别为0001
subplot(412)
Y=ds_mod(C(:),X); %扩频
plot(Y);
title('扩频后信息信号');
subplot(413)
Y_AWGN=awgn(Y,1);
plot(Y_AWGN);
title('加性高斯白噪声扩频信号');
X_Result=ds_demod(C(:),Y_AWGN);
X_Result(find(X_Result>=0))=1;
X_Result(find(X_Result<0))=-1;
subplot(414)
plot(X_Result);
title('解扩后信息');
使用的是周期为15的m序列作为伪随机码进行调制,结果仿真图如图所示:
总结:从仿真图中可以看出,原始信号经扩频后长度扩大了15倍,倍数是周期,加了AWGN后,扩频信号变得很难辨别,但通过m序列的调制,发送与接收端用m序列进行调制,最终解扩后得到了原始的窄带信号,故实现了信息通信。
各位同学读完文章觉得有用的话,一键三连支持一波哈!!!