基于MATLAB/Simulink的CDMA系统设计与仿真
Posted fpga和matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MATLAB/Simulink的CDMA系统设计与仿真相关的知识,希望对你有一定的参考价值。
目录
1.整体结构
利用Simulink平台,模拟了一个小区内四个用户的码元发送,扩频,接收,解扩,判决的CDMA通信基本过程,仿真基本流程如图1所示:
在每一个仿真步长(1秒)内,每个用户发送一个信息码元,4个用户则对应发送4个用户信息码元,然后用4个P=31的m序列分别对这4个用户的信息码元进行扩频(相乘)处理,然后合路相加并加入高斯白噪声。在接收端用和发送端相同的4个m序列分别对信息码元进行解扩(相乘)处理,最后进行积分,判决,完成了对这4个用户的信息码元的恢复,即对于这4个用户中的每一个用户,一个仿真步长(1秒)内完成了一个信息码元的恢复,若要发送5000个码元,仿真时间设置为5000秒即可,这是传统单用户检测的情况。
2.发射端
利用MATLAB2007b来,应此对于SIMULINK模块必须用该版本的MATLAB才能打开。其中发送端的基本结构如下:
·用户发送的信号的模拟
为了便于观察和数据的对比,我采用发送常数信号1来作为用户的发送信号,打开SIMULINK,添加Constant模块,来模拟用户,其具体的参数设置如下:
图3 CONSTANT模块参数设置
·伪随机序列的产生
在扩频调制中,我通常运用PN码来进行信号的扩频处理,这里运用Embedded MATLAB Function block编写了一个m序列发生器模块,模块有一个输入,一个输出,,输出为一个P=31的m序列。
PN码的产生,实际上就是利用移位寄存器来实现伪随机序列,其MATLAB核心代码如下:
for i= 2:L
newregisters(1:len-1) = registers(2:len);
newregisters(len) = mod(sum(coefficients.*registers'),2);
registers=newregisters;
a(i)=registers(1);
end
利用这个模块,我们就可以参身周期为31的伪随机序列了。
·扩频调制设计
所谓扩频调制,就是信号和PN码进行相乘,我们只要利用SIMULINK的乘法模块就可以了。
图 一路用户的扩频调制过程
·信号和路设计
重复以上的步骤,我们可以得到4个用户的扩频调制,然后我们将4路信号进行合路。并加入一个Random Number模块,生成均值是0,方差为1的高斯正态分布随机信号做为噪声。其中Random Number模块的参数设置如下:
图 噪声模块的参数设置
3.接收端
系统接收端的具体结构如下:
图 系统的接收图
·解扩模块设计
解扩模块的就是扩频调制的逆运算,应此我们只要再次利用PN码来对信号相乘,得到解扩信号就可以了。
·信号还原模块设计
将得到的信号进行符号判决,就可以还原发送的信号了,符号判决模块的设置如下:
至此,我们完成利用SIMULINK设计了最基本的CDMA系统了。
4.性能仿真
上节我们介绍了利用SIMULINK建立一个简单的四用户的CDMA系统,下面我们利用MATLAB对系统的性能进行仿真。来验证系统的正确性。
下面我们主要来分析一下整个系统的代码部分:
N=31; %伪随机序列的阶数
R=(ones(UserNumber)+(N-1)*eye(UserNumber))/N; %相关系数矩阵
b=2*randint(UserNumber,inflength)-1; %用户信息矩阵
coefficients=[1 0 1 0 0]; %PN码生成系数
mseq=mseries(coefficients); %有生成系数产生随机序列
mseq=mseq(1:UserNumber,1:N);
以上代码主要功能是,产生PN码作为信号的扩频码,从而产生用于信号检测的扩频信号。
%产生噪声
n1=Pn*normrnd(0,1,1,inflength*N);
n=zeros(UserNumber,inflength);
for j=1:inflength
ntemp=n1(1,((j-1)*N+1):j*N);
n(:,j)=(mseq*ntemp')/N;
end
这个代码的主要作用就是产生检测信号用的噪声,将噪声添加到四个用户信号的合成信号中。
A=diag(a);
y=R*A*b+n; %传统的单用户检测
ydec=inv(R)*y; %线性解相关多用户检测
ymmse=inv(R+sigma^2*inv(A))*y; %最小均方误差多用户检测
for i=1:UserNumber
ylen(i)=length(find(sign(real(y(i,:)))-b(i,:)));
ydeclen(i)=length(find(sign(real(ydec(i,:)))-b(i,:)));
ymmselen(i)=length(find(sign(real(ymmse(i,:)))-b(i,:)));
BER_y(i)=ylen(i)/inflength;
BER_ydec(i)=ydeclen(i)/inflength;
BER_ymmse(i)=ymmselen(i)/inflength;
end
A01-02
以上代码我们主要用到了三种检测方式,1.传统的单用户检测;2.线性解相关多用户检测;3.最小均方误差多用户检测。
通过将前后发送和接收信号的对比,我们利用普通用户信号检测的方法进行对比,可以得到如下的对比结果:
图 误码率
可见在连续发送的相同数据的情况下,接收端的正确率也是比较高的,从而验证了SIMULNIK建立的模型的正确性。
测试传码5000个情况下10个用户的误码率是一个比较传统单用户检测,线性解相关多用户检测,最小均方误差多用户检测之间的误码率性能的程序,运行本程序首先出现一个对话框,等待输入相应的仿真参数,如图所示:
图 仿真界面
其中第一行为用户数,第二行为用户信息码元个数,第三行为各个用户对应的信号功率,第四行为噪声功率,第五行为要观察的用户,默认值如图中所示。设置用户信号功率依次为1,2,3,4是由于用户距离基站的远近不同,故信号功率有差别,用此来模拟远近效应。信噪比的计算拿第一个用户作为基准,当噪声功率设置为10时,信噪比s/n=20lg(1/10)=-20dB。第五行设置为1表示要观察第一个用户,信号功率较大的用户的误码率明显低于信号功率较小的用户。
以上是关于基于MATLAB/Simulink的CDMA系统设计与仿真的主要内容,如果未能解决你的问题,请参考以下文章
电机调速基于matlab Simulink转速开环恒压频比异步电动机调速系统仿真含Matlab源码 2370期
基于MATLAB/SIMULINK工业锅炉燃烧过程控制系统的设计与仿真
matlab simulink基于BPPID控制的机械臂位置仿真