基于MATLAB/Simulink的CDMA系统设计与仿真

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MATLAB/Simulink的CDMA系统设计与仿真相关的知识,希望对你有一定的参考价值。

目录

1.整体结构

2.发射端

3.接收端 

4.性能仿真


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 GUI的电机特性分析

基于MATLAB/SIMULINK工业锅炉燃烧过程控制系统的设计与仿真

matlab simulink基于BPPID控制的机械臂位置仿真

直流电机基于matlab Simulink直流电机开环和比例控制闭环仿真含Matlab源码 2365期

船舶基于matlab simulink船舶推力分配含Matlab源码 2416期