基于Matlab的CDMA通信系统仿真.docx
《基于Matlab的CDMA通信系统仿真.docx》由会员分享,可在线阅读,更多相关《基于Matlab的CDMA通信系统仿真.docx(22页珍藏版)》请在冰豆网上搜索。
基于Matlab的CDMA通信系统仿真
1绪论
1.1课题背景及目的
20世纪60年代以来,随着民用通信事业的发展,频带拥挤问题日益突出。
CDMA(CodeDiveisionMultipleAccess,码分多址)通信,在使用相同频率资源的情况下,理论上CDMA移动网比模拟网容量大20倍,实际使用中比模拟网大10倍,比GSM要大4~5倍,所以在通信领域中起着非常重要的作用。
CDMA的基本原理是利用互相正交(或尽可能正交)的不同编码,分配给不同用户调制信号,实现多用户同时使用同一频率接入系统和网络的通信。
由于利用互相正交(或尽可能正交)的编码去调制信号,会将原信号的频谱带宽扩展,因此,这种通信方式,又称为扩频通信。
本论文所完成的CDMA通信仿真系统,是结合CDMA的实际通信情况,利用MATLAB的通信工具箱—SIMULINK组建出完整的CDMA通信系统,完成整体设计方案,实现完整的发送到接收的端到端的CDMA无线通信系统的建模、仿真和分析。
教学实践表明,该系统的完成使得比较抽象的概念得以直接表示,烦琐的计算得以大大简化,提高上机效率,在通信原理课程教学中起到良好的辅助作用。
1.2课题研究方法
为了研究CDMA通信系统的通信方式,我们对两种扩频码(m序列和正交gold序列)经过衰落信道后再解扩,通过比较两种扩频码的误比特率与信噪比的关系得出用来扩频的PN码哪种更好。
使其更符合CDMA通信的抗干扰能力强的要求和实现多用户同时在同一频率互不干扰进行通信而误比特率性能不随着用户数的增加而恶化这样的目的进行仿真实验。
2CDMA基础及原理
CDMA多址技术的原理是基于扩频技术,即将需传送的具有一定信号带宽的信息数据,用一个带宽远大于信号带宽的高速伪随机码进行调制,使原数据信号的带宽被扩展,再经载波调制并发送出去。
接收端由使用完全相同的伪随机码,与接收的带宽信号作相关处理,把宽带信号换成原信息数据的窄带信号即解扩,以实现信息通信。
2.1扩频通信
扩频通信技术是一种信息传输方式,其信号所占有的频带宽度远大于所传信息所需的最小带宽;频带的扩展是通过一个独立的码序列来完成,用编码及调制的方法来实现的,与所传信息数据无关;在接收端则用同样的码进行相关同步接受、解扩及恢复所传信息数据。
2.1.1扩频通信理论基础
香农公式:
C=Wlog2(1+S/N)
1、在给定的传输速率C不变的条件下,频带宽度W和信噪比S/N是可以互换的。
即可通过增加频带宽度的方法,在较低的信噪比情况下,传输信息。
2、扩展频谱换取信噪比要求的降低,正是扩频通信的重要特点,并由此为扩频通信的应用奠定了基础。
2.1.2扩频通信系统的分类
(1)直接序列扩频(DS)
(2)跳频扩频(FH)
(3)跳时扩频(TH)
(4)混合方式(以上三种基本方式的不同组合)
在实际的CDMA系统中,直接序列扩频得到了广泛的认可和应用,所以,在本次实验中主要研究直接序列扩频技术。
2.2直接序列扩频
DS-SS是直接用具有高码率的扩频码序列在发送端去扩展信号的频谱。
而在收端,用相同的扩频码序列去进行解扩,把展宽的扩频信号还原成原始的信息。
图2-1直接序列扩频的发射机和接收机框图
2.3扩频码序列
在扩频系统中,信号频谱的扩展是通过扩频码实现的,扩频系统的性能与扩频码的性能有很大的关系,对扩频通常提出下列要求:
易于产生;具有随机性;扩频码应该具有尽可能长的周期,使干扰者难以从扩频码的一小段中重建整个码序列;扩频码应该具有良好的自相关和互相关特性,以利于接收时的捕获和跟踪,以及多用户检测等。
扩频码中应用最多的是M序列,又称最大长度序列,还有GOLD序列、WALSH码序列等,本次试验中我们主要运用了M序列和正交GOLD序列。
2.3.1PN码
CDMA信道的区分是靠PN码来进行的,因而要求PN码自相关性要好,互相关性要弱,实现和编码方案简单等。
目前的CDMA系统就是采用一种基本的PN序列m序列作为地址码,利用它的不同相位来区分不同用户。
M序列是最长线性移位寄存器序列的简称,它通常是由反馈移位寄存器产生的具有像随机噪声波形的周期性二元序列。
Gold码序列是一种基于m序列的码序列。
Gold码是m序列的组合码,由同步时钟控制的两个m序列逐位模2加得到。
这两个码发生器的周期相同,速率也相同,因而两者保持一定的相位关系,这样产生的组合码与这两个子码序列的周期也相同。
正交Gold码是在优选对产生的Gold码末尾加0,使序列的长度为偶数。
3DS-CDMA通信系统仿真
3.1DS-CDMA通信系统原理图
图3-1DS-CDMA通信系统原理图
在实验中,我们采用;两种扩频码进行仿真。
M序列和正交Gold序列,扩频后的数据通过脉冲成型滤波器后通过信道同时到达接收端,在接收端分别对不同用户信息数据进行解扩,恢复各个用户的原始信息。
3.2仿真流程设计与介绍
3.2.1仿真设计步骤
1、m序列的DS-CDMA在AWGN下的性能的仿真。
2、正交Gold序列的DS-CDMA在AWGN下的性能的仿真。
3、对比两个扩频码在AWGN信道下的性能曲线,分析哪种扩频码更适合在AWGN信道中传输,传输衰减最小,对比m序列和正交Gold序列的抗干扰能力。
4、为了证明这一结论,把两种PN码再经过Rayleigh衰落信道下的性能进行验证。
(代码见附录)
3.2.2程序编程设计
最外层循环的时候是信噪比,根据每种信噪比下,首先产生各个用户的发射数据,根据用户数,每一行是每个用户的发射数据,然后进行Gray编码、4-QAM调制,调制完后,对信号进行扩频,扩频部分是通过spread函数完成的,是完成扩频的功能。
扩频时,看输入参数是否满足要求,满足要求后,用扩频码与每一个数据符号相乘,对原始符号进行扩展,完成扩频。
扩频完成后,再通过脉冲成形滤波器计算每个用户信号功率。
当用户数大于1时,所有用户数据相加。
相加完成后,如果需要通过瑞利衰落信道,再让信道系数与发射数据相乘。
接收端加入高斯白噪声,首先根据信噪比计算高斯白噪声标准差,根据标准差加入白噪声。
如果通过瑞利衰落信道后,我们还需要进行一个信道补偿。
最后通过脉冲成形滤波器进行降采样,之后进行数据解扩,解扩部分是通过despread函数完成的,解扩完成后,对信号进行4-QAM解调、Gray编码逆映射,分别对用户原始数据和解扩后数据进行比较,最后统计误比特率。
以上就是完成扩频的主程序。
M序列和正交Gold序列脚本程序的介绍:
用户数统一定义的是1、4、7,扩频码分别选择的是M序列和正交Gold序列,然后在每种用户数下仿真扩频系统的性能,最后画出仿真得到的误比特率。
4仿真结果分析
4.1实验仿真运行结果
图4-1M序列DS_CDMA在AWGN下的性能
从图4-1中可以看出,由于m序列即使在完全同步时,之间的互相换值也不为0,因此随着用户数的增加(解调其中一个用户的数据时,其他用户会对该用户的解调产生干扰),干扰越来越大,导致系统的误码率性能下降。
图4-2正交Gold序列在AWGN下的性能
从图4-2中可以看出,由于正交Gold序列在完全同步时,它们的互相关值为0,因此其BER性能并不随着用户数的增加而恶化。
在信噪比为2、4、6时误比特率基本相同。
由图可以看出来当误比特率仿真时候小于10-3时结果就会有一定的偏差。
但还是可以看出正交Gold序列比M序列的性能要好。
所以,初步得出结论:
正交Gold序列在AWGN信道下的抗干扰能力更强,衰减比,序列要小。
为证明这一结论进行了下面的实验(图4-3、图4-4)。
图4-3M序列在Rayleigh衰落信道下的性能
对比图4-1和图4-3,显然M序列在瑞利衰落信道下的性能要比能过AWGN信道下的性能要差。
图4-4正交Gold序列在Rayleigh衰落信道下的性能
正交Gold序列在的瑞利衰落信道下的性能也要比AWGN信道下的性能要差,可以看出,DS-CDMA系统在Rayeligh衰落信道下的性能要比AWGN信道下的性能差。
在图4-3上可以看出,随着用户数的增加,其误比特率还是会增高,但是由图4-4可以看出,信号的误比特率甚至由于用户的增多而降低,性能变的更优,此次实验,可能存在些许误差,而且为了使程序更快运行出结果我们给他加了信道补偿,也可能会由于描点过少,造成图像与真实有些不符,但从大体方向上仍然能够得出结论,即使在瑞利衰落信道下正交Gold序列的性能依然优于m序列。
总结
对于本仿真而言,已基本完成了设计任务书的设计和研究目的,通过用MATLAB对DS-CDMA系统的仿真调试、结果分析,让我组熟悉了DS-CDMA的工作原理,加深了对扩频通信的认识,并深刻的了解PN码在不同信道的衰落情况。
通过仿真结果中波形的直观方式,更让我们了解到了系统衰减的规律。
但是在本设计中也存在着缺陷与不足
1、在本设计中过程中可能由于程序过于复杂,信息本身所占用的带宽偏大,用来传输信息的带宽相对不够大,造成结果并不明显,信息衰减严重。
2、在设计中只考虑到加性高斯信道所带来的干扰,在实际通信信道却是复杂多变,存在着各种各样的情况,所以最后的接收信号是在很简单的干扰下得出。
要想应用于实际中,必须加入各种噪声来考虑,以实现真实系统的设计。
3、实验中,我们选择加大传输带宽,来弥补其他干扰带来的影响,可能会造成消耗过大,浪费带宽的结果,实际应用中是不实用的。
只能作为仿真,进行研究。
即使如此,在本次设计的整个过程中,以上的结果已经令我们受益匪浅。
通信系统的性能分析和仿真,随着通信技术、信息技术和计算机技术的发展以及网络系统的大量应用,显得越来越重要。
致谢
在本次仿真设计中,感谢指导老师在论文选题、设计任务书中对我的无私帮助,加深了我对专业基础理论的理解,拓宽了我的专业知识面,实在是受益匪浅。
感谢我组同学的团结协作,在设计过程中,共同商讨,共同去图书馆查阅相关参考资料,使我组能够抓紧宝贵的时间,完成论文的写作。
在此,谨对所有在论文写作中帮助过我的老师、同学表示衷心的感谢和由衷的敬意!
谢谢大家!
参考文献
[1]刘学勇,编著.通信系统建模与仿真(电子工业出版社)
[2]邓薇,编著.MATALB函数速查手册(人民邮电出版社)
[3]【美】WilliamC.Y.Lee,著.移动通信工程理论和应用(第二版)(人民邮电出版社)
[4]王华奎,李艳萍等编著.移动通信原理与技术(清华大学出版社)
附录(各部分编程):
1、M序列
function[mout]=mseq(n,taps,inidata,num)
%****************************************************************
%n:
m序列的阶数n
%taps:
反馈寄存器的连接位置
%inidata:
寄存器的初始值序列
%num:
输出的m序列的个数
%mout:
输出的m序列,如果num>1,则每一行为一个m序列
%****************************************************************
ifnargin<4
num=1;
end
mout=zeros(num,2^n-1);
fpos=zeros(n,1);
fpos(taps)=1;
forii=1:
2^n-1
mout(1,ii)=inidata(n);%寄存器的输出值
temp=mod(inidata*fpos,2);%计算反馈数据
inidata(2:
n)=inidata(1:
n-1);%寄存器移位一次
inidata
(1)=temp;%更新第1个寄存器的值
end
ifnum>1%如果要输出多个m序列,生成其他m序列
forii=2:
num
mout(ii,:
)=shift(mout(ii-1,:
),1);
end
end
关于shift函数的代码:
function[outregi]=shift(inregi,shiftr)
%****************************************************************
%inrege:
输入序列
%shiftr:
循环右移的位数
%outregi:
输出序列
%****************************************************************
v=length(inregi);
outregi=inregi;
shiftr=rem(shiftr,v);
ifshiftr>0
outregi(:
1:
shiftr)=inregi(:
v-shiftr+1:
v);%循环移位
outregi(:
1+shiftr:
v)=inregi(:
1:
v-shiftr);
elseifshiftr<0
outregi(:
1:
v+shiftr)=inregi(:
1-shiftr:
v);
outregi(:
v+shiftr+1:
v)=inregi(:
1:
-shiftr);
end
%*********************endoffile********************************
2、Gold序列:
function[gout]=goldseq(m1,m2,num)
%****************************************************************
%m1:
m序列1
%m2:
m序列2
%num:
生成的Gold序列个数
%gout:
生成的Gold序列输出
%****************************************************************
ifnargin<3%如果没有指定生成的Gold序列个数,默认为1
num=1;
end
gout=zeros(num,length(m1));
forii=1:
num%根据Gold序列生成方法生成Gold序列
gout(ii,:
)=xor(m1,m2);
m2=shift(m2,1);
end
%**********************endoffile********************************
其shift函数代码同M序列
3、仿真部分主程序:
%直接序列扩频主程序代码
function[ber]=dscdma(user,seq)
%user:
同时进行扩频通信的用户数
%seq:
扩频码1:
M-序列2:
Gold序列3:
正交Gold序列
%ber:
该用户数下的误码率
%**************************初始化部分*****************************
sr=25600.0;%符号速率
nSymbol=1000;%每种信噪比下发送的符号数
M=4;%4-QAM调制
br=sr*log2(M);%比特速率
graycode=[0132];%Gray编码规则
EbNo=0:
2:
10;%Eb/No变化范围
%**********************脉冲成形滤波器参数**************************
delay=10;%升余弦滤波器时延
Fs=8;%滤波器过采样数
rolloff=0.5;%升余弦滤波器滚降因子
rrcfilter=rcosine(1,Fs,'fir/sqrt',rolloff,delay);
%设计根升余弦滤波器
%**********************扩频码产生参数**********************
%user=user1;%用户数
stage=3;%m序列的阶数
ptap1=[13];%m序列1的寄存器连接方式
ptap2=[23];%m序列2的寄存器连接方式
regi1=[111];%m序列1的寄存器初始值
regi2=[111];%m序列2的寄存器初始值
%********************扩频码的生成*********************
switchseq
case1%M-序列
code=mseq(stage,ptap1,regi1,user);
case2%Gold序列
m1=mseq(stage,ptap1,regi1);
m2=mseq(stage,ptap2,regi2);
code=goldseq(m1,m2,user);
case3%正交Gold序列
m1=mseq(stage,ptap1,regi1);
m2=mseq(stage,ptap2,regi2);
code=[goldseq(m1,m2,user),zeros(user,1)];
end
code=code*2-1;
clen=length(code);
%**************************衰落信道参数**************************
ts=1/Fs/sr/clen;%信道采样时间间隔
t=(0:
nSymbol*Fs*clen-1+2*delay*Fs)*ts;%每种信噪比下的符号传输时间
%fd=160;%多普勒频移[Hz]
%h=rayleigh(fd,t);
%****************************仿真开始****************************
forindx=1:
length(EbNo)
indx
%**************************发射端********************************
data=randsrc(user,nSymbol,[0:
3]);%产生各个用户的发射数据
data1=graycode(data+1);%Gray编码
data1=qammod(data1,M);%4-QAM调制
[out]=spread(data1,code);%扩频
out1=rcosflt(out.',sr,Fs*sr,'filter',rrcfilter);
%通过脉冲成形滤波器
spow=sum(abs((out1)).^2)/nSymbol;%计算每个用户信号功率
ifuser>1%用户数大于1时,所有用户数据相加
out1=sum(out1.');
else
out1=out1.';
end
%********************通过瑞利衰落信道******************************
%out1=h.*out1;
%*************************接收端*********************************
sigma=sqrt(0.5*spow*sr/br*10^(-EbNo(indx)/10));
%根据信噪比计算高斯白噪声方差
y=[];
forii=1:
user
y(ii,:
)=out1+sigma(ii).*(randn(1,length(out1))+j*randn(1,length(out1)));%加入高斯白噪声(AWGN)
%y(ii,:
)=y(ii,:
)./h;%假设理想信道估计
end
y=rcosflt(y.',sr,Fs*sr,'Fs/filter',rrcfilter);
%通过脉冲成形滤波器进行滤波
y=downsample(y,Fs);%降采样
forii=1:
user
y1(:
ii)=y(2*delay+1:
end-2*delay,ii);
end
yd=despread(y1.',code);%数据解扩
demodata=qamdemod(yd,M);%4-QAM解调
demodata=graycode(demodata+1);%Gray编码逆映射
[err,ber(indx)]=biterr(data,demodata,log2(M));%统计误比特率
end
主程序中spread函数的代码:
%扩频函数
function[out]=spread(data,code)
%****************************************************************
%data:
输入数据序列
%code:
扩频码序列
%out:
扩频后的输出数据序列
%****************************************************************
switchnargin
case{0,1}%如果输入参数个数不对,提示错误
error('缺少输入参数');
end
[hn,vn]=size(data);
[hc,vc]=size(code);
ifhn>hc%如果扩频码数小于输入的待扩频的数据序列,提示错误
error('缺少扩频码序列');
end
out=zeros(hn,vn*vc);
forii=1:
hn
out(ii,:
)=reshape(code(ii,:
).'*data(ii,:
),1,vn*vc);
end
%****************************endoffile*************************
解扩函数despread的代码:
%信号解扩
functionout=despread(data,code)
%****************************************************************
%data:
输入数据序列
%code:
解扩使用的扩频码序列
%out:
解扩后的输出数据序列
%****************************************************************
switchnargin%如果输入参数个数不对,提示错误
case{0,1}
error('缺少输入参数');
end
[hn,vn]=siz