北京邮电大学信通院小学期CDMA前向业务信道仿真.docx
《北京邮电大学信通院小学期CDMA前向业务信道仿真.docx》由会员分享,可在线阅读,更多相关《北京邮电大学信通院小学期CDMA前向业务信道仿真.docx(21页珍藏版)》请在冰豆网上搜索。
北京邮电大学信通院小学期CDMA前向业务信道仿真
北京邮电大学
实验报告
题目:
CDMA2000前向业务信道仿真
班级:
200921112x班
专业:
信息工程
姓名:
xxx0921xxxx
xxx0921xxxx
邮箱:
xxxxxxxxxxxxxxxxxxx
成绩:
一、实验目的。
1、了解移动通信发展历史
2、掌握CDMA系统的技术:
(1)信道编码、交织、加扰、扩频、调制
(2)关键技术:
RAKE接收机
(3)信道结构:
导频、业务
(4)长码、短码和Walsh码在CDMA系统中的作用
3、了解CDMA1X的技术特点
学习Walsh码、Turbo码
二、实验内容。
完成CDMA2000前向业务信道多径信道的RAKE接收仿真。
掌握CDMA的技术特点。
三、实验原理。
系统框图如下:
1、交织。
发送序列若按照扩频、加扰、调制后的顺序直接发送,若信道出现突发错误,则可能出现某一个用户的信息出现大块丢失,严重影响通信质量。
交织所解决就是这类错误,将输出序列打乱,在接收端再按照相同的规则将顺序复原,则原本信道突发错误下可能大块出错、严重影响某一个用户通信质量的可能性大大降低,而每个用户出现单独或者少数比特错误对该用户、整体通信质量影响都很小,从而保证了整体通信质量。
最基本的交织是块交织,将序列按照一定长度写成矩阵形式,以行入、列出的方式进行重拍,在接收端进行反操作,就完成了解交织。
具体方法如下图:
交织编码可以抗无线信号在空中传播时产生的快衰落,而对于慢衰落则交织所起的作用不大,因为慢衰落可能造成长的连续误码,甚至整帧都是误码,因此反交织后也是连续误码。
CDMA2000中采用的是一种随机性更大的交织方式,公式及说明如下:
在序列长度为384的情况下,m=6,J=6,将基本的行入列出块交织序号顺序进一步打乱。
2、扩频。
CDMA2000中码片速率1.2288Mbps,帧长20ms,在一个基站服务下有通过64个walsh码区分的信道,walsh码之间有良好的正交性,其对应的用户的扩频操作即采用walsh码来完成。
Walsh码中0~8号信道和32号信道不能作为业务信道,是控制信道,作为导频等使用。
直扩序列扩频通信系统中,扩展数据信号带宽的一个方法是用PN序列和信号相乘,所得宽带信号可以在基带传输系统传输可也可以进行载波调制进行传输。
建模:
以BPSK调制的直扩系统为例,模型如下:
认为信道理想,不考虑高斯白噪声的影响。
图中
b(t):
基带信号。
c(t):
m序列发生器输出的PN码序列信号,即为扩频码。
b(t)与c(t)都是双极性NRZ码。
b(t)一个比特的长度Tb等于PN序列c(t)的一个周期,即Tb=NTc,带宽Bc=NBb。
发射机对发送信息信号b(t)处理的第一步是扩频,c(t)和b(t)相乘,得到信号:
x(t)=b(t)c(t)
依据卷积定理:
时域相乘,频域卷积,则乘积后等效于将b(t)扩展到c(t)的带宽上。
扩展的倍数即PN序列一周期的码片数:
N=Bc/Bb
频谱展宽,信号功率谱密度变为原来的1/N。
扩频后对x(t)进行BPSK调制,得到信号:
s(t)=x(t)cos(wct)=b(t)c(t)cos(wct)
调制后的带宽为2Bc。
接收端,忽略噪声影响,认为r(t)=s(t)。
接收机将受到的信号与本地PN码相乘。
PN码的特性:
(c(t))^2=1,有
r(t)c(t)=s(t)c(t)=b(t)cos(wct)(c(t))^2=b(t)cos(wct)
所得信号为窄带的BPSK信号,带宽2Rb。
PN码的(c(t))^2=1的特性使得扩频和解扩的算法相同,但由此而来必须注意的一点:
发送端所用PN码与接收端所用的是同一组PN码且两者必须时间同步。
扩频通信具有抗窄带噪声的能力。
抗窄带干扰模型如下:
i(t):
载波附近的窄带干扰信号。
发送信号受窄带噪声干扰,接收机输入信号:
r(t)=s(t)+i(t)
r(t)与本地PN序列相乘后,干扰为:
r(t)c(t)=s(t)c(t)+i(t)c(t)=b(t)cos(wct)+i(t)c(t)
i(t)与c(t)相乘后,类似于上面对原发送信号扩频的过程,噪声信号的带宽被扩展到W=2Bc。
设输入干扰信号功率Pi,则干扰信号(i(t)c(t))带宽为2Bc、功率谱密度Pi/W=Pi/(2Bc),解扩后落入信号带宽的干扰功率为:
Pn=Pi*Rb/Bc=Pi/N
解扩后,窄带干扰噪声落入频带的功率为原噪声功率的1/N,扩频比N越大,对窄带干扰的抗噪性能越好。
扩频、解扩的过程不会改变对于与发送信号频率有相同变化关系的噪声,使得扩频通信不具有抗白噪声的能力。
扩频还具有抗多径干扰的好处。
扩频通信系统中,扩频PN序列码采取具有良好自相关、互相关特性的正交码,码片周期短,当信号通过多条路径到达接收端,只有与收端解扩PN码时间同步的那一径信号在与收端PN码进行乘积后得到有效信号值,其余径信号由于PN码的互相关特性使得接收信号值很小,接近于0,如此能有效克服多径干扰。
以两条径信号为例进行分析,以第一个到达接收机的信号为坐标,第二条径延时Td到达接收端。
建模:
b(t):
数据信号。
c(t):
扩频码。
第二径信号比第一径信号延迟Td到达接收端,经扩频、载波调制后的发射信号为:
s(t)=b(t)c(t)cos(wct)
发射信号经过二径信道到达接收机的信号为
r(t)=ps(t)+qs(t-Td)
p、q分别为第一、第二径的衰减,设a(0)=1,a
(1)<1,有:
r(t)=x(t)cos(wct)+qx(t-Td)cos(wc(t-Td))
与本地相干载波、本地解扩码相乘,设本地扩频码与第一径信号同步,得到结果经过积分器滤除高频分量得
y(Tb)=(1/Tb)
+kd*(1/Tb)
=(1/Tb)
+kd*(1/Tb)
式中kd=q*cos(wcTd)<1,设发送的二进制码元为…b(-1)b(0)b
(1)b
(2)…,且第二径信号b
(1)比第一径信号b(0)延迟Td时间,在第一径b
(1)到达时刻t=Tb时刻进行采样输出
y(Tb)=b
(1)+kd*b(0)*(1/Tb)
+kd*b
(1)*(1/Tb)
=b
(1)+kd*b(0)Rc(-Td)+kd*b
(1)Rc(Tb-Td)
(1)
式中R(т)为c(t)的局部自相关函数:
Rc(т)=(1/Tb)
对于上式,后两项是第二径信号对第一径信号的干扰。
对于扩频码m序列,当|т|>Tc,其局部自相关系数都很小,即式
(1)中后两项几乎为0,即接收信号:
y(Tb)=b
(1)
可知,利用正交码的良好自相关特性和互相关特性,有效抑制了多径分量的干扰。
三径及更多径信号原理与此相同。
3、加扰。
CDMA2000系统中采用长m序列来进行加扰,实验总采用(2^42-1)周期长的m序列进行加扰。
m序列具有良好的自相关、互相关特性,CDMA2000中用此性质来进行基站的区分。
设a(t)为扩频后的序列,m1、m2分别为与a(t)同长度的不同基站的m序列,且设m1为服务基站,
复加扰:
mseq1=(1+i)*m1;mseq2=(1+i)*m2;
加扰后:
b(t)=a(t)*mseq1;
接收到信号,进行解扰、解扩:
c(t)=b(t)*conj(mseq1)
=a(t)*mseq1*conj(mseq1)
=a(t)*abs(mseq1)
其他基站的干扰:
s(t)=a(t)*mseq2*conj(mseq1)
=a(t)*(m1*m2*2)
解扩时设扩频吗为sqsq_seq:
r(t)=
由于m序列之间的互相关特性,则求和后的其他几站的干扰接近为0,得出结果即为本基站所要传送的信号。
M序列生成函数代码如下:
functionseq=mseq_test(ori_state,len)
%poly为特征多项式向量,ori_state为初始值向量,len为所需序列长度
hpn=commsrc.pn;%生成PN序列
poly=[1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,0,1,1,1,1];
hpn.GenPoly=poly;
hpn.InitialStates(1:
42)=bitget(ori_state,1:
42);
hpn.NumBitsOut=len;
seq=generate(hpn);
4、RAKE接收。
在CDMA传输中,考虑了多径信号的接收。
在CDMA移动通信系统中,由于信号带宽较宽,各种信号在信道中传输时的折射、衍射的规则都不一样,所以会存在着复杂的多径无线电信号。
多径信号彼此干扰,但都携带能量,且能量的大小都不一样,所以需要一种优秀的接收机。
RAKE接收技术实际上是一种多径分集接收技术,可以在时间上分辨出细微的多径信号,对这些分辨出来的多径信号分别进行加权调整、使之复合成加强的信号。
Rake接收由一组相关器构成,在多个位置对多径信息各自进行相关检测,相关后把原来的矢量合并转换为标量合并。
模型如下:
Rake接收机的相关器,通过码的自相关特性区分多径信号,通过码的互相关特性区分来多个用户的信号。
CDMA系统不同码字之间的正交性使得不同用户的信号传递到接收端经过不同的相关器后,相当于进行一次滤波,携带其他用户信息的码子信号被滤除,仅留下当前码字对应用户的信号分量。
在一个码字时间内,同组内的不同相关器在不同的延迟时间点,对相应时间点到来的多径信号进行相关检测,之后进行进行线性标量求和,以求得合并比的最大化。
在扩频码有效抗窄带干扰、抗多径干扰的基础上,结合Rake接收使得信噪比有很大的提高,从而在3G系统功率控制等的相应协调下,使得基站、移动台发射功率都可以有大幅度的降低。
5、调制与解调。
在CDMA2000中采用QPSK调制,但阅读CDMA2000上行信道的物理层标准规范、并且结合物理框图,可以发现实际运用中QPSK的四个相位仅仅用到了两个,在加扰、解扰的过程中就相当于进行了调制和解调,但由于一个基站只有一个m序列,则其实部和虚部是相同,即I路和Q路的数据完全相同,如此实际上相当于BPSK调制,在经过扩频、加扰、解扰、解扩后,结果就是接收数据的实部。
6、多用户多径RAKE接收。
与单用户多户rake接收相比,多用户多径rake接收仅需要添加相应的信道扩频码来区分用户即可。
在一个基站服务下的用户之间用信道码来区分,即通过walsh码的正交性来区分。
其余扩频、加扰、调制等原理与单用户均相同。
7、重复。
重复的目的是让每一帧传送的数据量相同,此次采用数据长度172位,不需重复。
四、模块介绍
1、CRC校验模块
(1)CRC编码模块
原理:
循环冗余校验(CRC)主要用来检测或校验数据传输或者保存后可能出现的错误。
生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。
在本程序使用了12位的CRC校验,即如下图:
先将信元多项式左移8位,使用生成多项式除以信元多项式所得余数即为CRC校验位,然后将信元多项式与校验位相合并产生系统循环码。
(2)CRC解码模块
如果接受到的码多项式可以被生成多项式所整除,则没有出现误码,如果不能,则表示出现了误码。
2、卷积编码模块
1、卷积
代码中,以下定义了卷积码的
conv_poly=[561,753];
conv_sonstraints_length=9;
编码器是(2,1,9)的,其表示的意义为,输出位数=2输入位数=1约束长度=9
编码器结构(编码器生成多项式):
[561,753](八进制),即反馈位置为:
[101110001,111101011]
产生编码所用的格图:
trellis=poly2trellis(conv_constraints_length,conv_poly);
使用convenc进行编码
code=convenc([source_FCS_added,tail],trellis);
2、解卷积
解卷积使用了维特比译码的方法,其核心思想就是寻找与接收序列汉明距离最小的编码序列。
我们可以直接使用MATLAB自带的vitdec函数,其输入信号为经过解调,解扩频,解交织,解重复后的接收信号。
如下图为一个最简单的(2,1,3)解码器的示意图
如下代码:
得到判决结果
decision=vitdec(deinterleaved,trellis,tb_len,'term','unquant');
五、实验结果、截图及分析。
首先测试所生成m序列的自相关、互相关特性,测试代码如下:
clear;clc;
N_chip=38400;
temp1=1-2*mseq_test(1234,N_chip);
temp2=circshift(temp1,[1,1]);
temp3=circshift(temp2,[1,1]);
ans1=sum(temp1.*temp1);
ans2=sum(temp1.*temp2);
ans3=sum(temp1.*temp3);
ans4=sum(temp2.*temp3);
temp4=1-2*mseq_test(76543,N_chip);
temp5=circshift(temp4,[1,1]);
temp6=circshift(temp5,[1,1]);
ans5=sum(temp4.*temp5);
ans6=sum(temp4.*temp6);
ans7=sum(temp5.*temp6);
temp7=1-2*mseq_test(37657,N_chip);
temp8=circshift(temp7,[1,1]);
temp9=circshift(temp8,[1,1]);
ans8=sum(temp7.*temp8);
ans9=sum(temp7.*temp9);
ans10=sum(temp8.*temp9);
ans11=sum(temp1.*temp4);
ans12=sum(temp1.*temp7);
ans13=sum(temp4.*temp7);
得到结果如图:
分析:
只有ans1为自相关性,与码片数相等,其余结果ans2~ans13为所生成的m序列之间、m序列移位一比特、吗序列移位两比特之间的互相关结果,相比于码片数38400,其值都都很小,比值接近于0,相关性良好。
说明m序列生成正确。
N-block=100,误码块超过10停止情况下的结果:
N_block=1000,误码块超过100停止的运行结果:
五、实验总结。
首先要赞老师,进行课程设计任务布置的时候,讲解很清楚、任务布置也很明白,敬礼。
之前仿真课上接触过WCDMA反向业务信道的仿真,对WCDMA的系统有一定了解,此次进行CDMA2000前向业务信道仿真,对CDMA2000D系统也有了一定了解,如此,对3G系统中系能较好的两种系统都有了一定认识,并且能够比较详细地了解到其不同之处,收获很大。
两者主要在码片速率、帧时间、加扰方式、扩频方式上有区别。
码片速率
帧间隔
扩频方式
加扰方式
WCDMA
3.84Mbps
10ms
[+1-1+1-1]序列扩频
Gold码
CDMA2000
1.2288Mbps
20ms
Walsh码扩频
M序列
具体编写代码过程中还是遇到了一些麻烦,主要集中在扩频、加扰、rake接收部分,在查找多径情况下要具体操作的64个码片构成的数据块过程遇到了很大困难,反复研究才得以明白原理;在编写CDMA2000交织函数的过程中也遇到了一点挫折,对其原理对应关系也是研究了一段时间才看明白;其余部分,在PPT中讲解的很清楚。
另外,对matlab工具的强大性也有了越来越深的体会,也明白了团队合作是提高工作效率很有效的一种办法。
在实验中两个人一起寻找解决方法,其效率远远高于一个人,合作也是一种成功的秘诀。
附:
源代码。
tic
clear;clc%clearthescreenanddata
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%definetheneededparametersandinitialize
conv_poly=[561,753];
conv_sonstraints_length=9;
trellis=poly2trellis(conv_sonstraints_length,conv_poly);
tb_len=50;
N_chip=12288*2;%frameof20mswithchiprate1.2288Mbps
SF=64;%SPSPscale
walsh_code_ori=hadamard(64);%togeneratewalshcode
spsp_code=walsh_code_ori(15,:
);%chooserow15tobewalshcodefortheuser
Num_coded_bits=N_chip/SF;%384
N_bits=Num_coded_bits/2-conv_sonstraints_length-11;%172
tail=zeros(1,conv_sonstraints_length-1);
SNR_db=-25:
-15;
SNR=10.^(SNR_db/10);
ts=1/(1.2288e6);%periodofthechip
fd=100;%Dopplerfrequenceshift
tau=[0ts2*ts];%intendedtimedelay
path_position=[0,1,2];
pd=[0,0,0];%relativevalueofthemultipathpower
channel=rayleighchan(ts,fd,tau,pd);%settherayleighchannel
channel.ResetBeforeFiltering=1;
channel.StorePathGains=1;
source=zeros(1,N_bits);%datatobedelivered
rake_fingers=zeros(3,Num_coded_bits);
combined_real=zeros(1,Num_coded_bits);
interleaved=zeros(1,Num_coded_bits);%initializing,predefinethematrixes
interleaved_anti=zeros(1,Num_coded_bits);
deinterleaved=zeros(1,Num_coded_bits);
divider=[1,0,0,0,0,0,1,0,1,0,0,1,1];%twelverankoripolynomial
m_seq_temp=1-2*mseq_test(23246,N_chip).';
m_seq=m_seq_temp*(1+1i);%them_sequencetoidentifyBTS
length_of_snr=length(SNR_db);
ber=zeros(1,length_of_snr);
bler=zeros(1,length_of_snr);
bler_crc=zeros(1,length_of_snr);
N_block=100;%numofblocksineachsnr_dbloop
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%tansferringbegins
forloop_snr=1:
length_of_snr
err=0;%numoferrorbits
err_blk=0;%numoferrorblocks
err_blk_crc=0;%numoferrorblockswhenusingcrc
sigma=sqrt(1/(2*SNR(loop_snr)));
chips=zeros(1,N_chip);
pass_channel=zeros(1,N_chip);
temp_chip=zeros(1,N_chip);
forloop_block=1:
N_block
source=randsrc(1,N_bits,[0,1]);%datatobetransfered
source_FCS_added=(generate(crc.generator(divider),source.')).';%CRC
code=convenc([source_FCS_added,tail],trellis);%CC
fori=1:
length(code)
interleaved(matintr(i))=code(i);
end
interleaved_anti=1-2*interleaved;
length_of_interleaved=length(interleaved);
fori=1:
length_of_interleaved
forii=1:
SF
temp_chip((i-1)*SF+ii)=interleaved_anti(i)*spsp_code(ii);
end
end%SPSP
chips=temp_chip.*m_seq;%scramble,andequally,modulate
pass_channel=(filter(channel,chips));
combined=zeros(1,Num_coded_bits);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%transferringends
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%receivingbegins
received=pass_channel+(randn(1,N_chip)+1i*randn(1,N_chip))*sigma;%filteredbyrayleightchannelandaddedwithwhitenoise
fornsym=1:
length(interleaved)
index_offset=(nsym-1)*SF+1;%firstnumofeach64chips
temp_code_scrambling=conj(m_seq(index_offset:
(index_offset+SF-1)));
forn_finger=1:
3
tmp_index=(index_offset:
(index_offset+SF-1))+path_position(n_finger);%getthecorresbondingindexesof64