直接序列扩频通信Word格式.docx
《直接序列扩频通信Word格式.docx》由会员分享,可在线阅读,更多相关《直接序列扩频通信Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
7.总结
对于本仿真而言,已基本完成了设计任务书的设计和研究目的,通过用MATLAB对DS-CDMA系统的仿真调试、结果分析,让我组熟悉了DS-CDMA的工作原理,加深了对扩频通信的认识,并深刻的了解PN码在不同信道的衰落情况。
通过仿真结果中波形的直观方式,更让我们了解到了系统衰减的规律。
但是在本设计中也存在着缺陷与不足
1、在本设计中过程中可能由于程序过于复杂,信息本身所占用的带宽偏大,用来传输信息的带宽相对不够大,造成结果并不明显,信息衰减严重。
2、在设计中只考虑到加性高斯信道所带来的干扰,在实际通信信道却是复杂多变,存在着各种各样的情况,所以最后的接收信号是在很简单的干扰下得出。
要想应用于实际中,必须加入各种噪声来考虑,以实现真实系统的设计。
3、实验中,我们选择加大传输带宽,来弥补其他干扰带来的影响,可能会造成消耗过大,浪费带宽的结果,实际应用中是不实用的。
只能作为仿真,进行研究。
即使如此,在本次设计的整个过程中,以上的结果已经令我们受益匪浅。
通信系统的性能分析和仿真,随着通信技术、信息技术和计算机技术的发展以及网络系统的大量应用,显得越来越重要。
参考文献
[1]学勇,编著.通信系统建模与仿真(电子工业)
[2]邓薇,编著.MATALB函数速查手册(人民邮电)
[3]【美】WilliamC.Y.Lee,著.移动通信工程理论和应用(第二版)(人民邮电)
[4]王华奎,艳萍等编著.移动通信原理与技术(清华大学)
程序
%1.函数mseq用于产生m序列:
function[mout]=mseq(n,taps,inidata,num)
%****************************************************************
%说明:
函数mseq用于产生num个阶数为n的m序列
%n:
m序列的阶数n
%taps:
反馈寄存器的连接位置
%inidata:
寄存器的初始值序列
%num:
输出的m序列的个数
%mout:
输出的m序列,如果num>
1,则每一行为一个m序列
ifnargin<
4%输入参数判断
num=1;
end
mout=zeros(num,2^n-1);
%寄存器输出值的初始化,全0
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个寄存器的值
ifnum>
1%如果要输出多个m序列,生成其他m序列
forii=2:
num
mout(ii,:
)=shift(mout(ii-1,:
),1);
%shift函数完成序列的循环移位,上一个序列向右循环移位
end
%2.函数goldseq用于产生gold序列
function[gout]=goldseq(m1,m2,num)
%m1:
m序列1
%m2:
m序列2
生成的Gold序列个数
%gout:
生成的Gold序列输出
3%如果没有指定生成的Gold序列个数,默认为1
gout=zeros(num,length(m1));
num%根据Gold序列生成方法生成Gold序列
gout(ii,:
)=xor(m1,m2);
m2=shift(m2,1);
%函数shift用于完成循环移位
function[outregi]=shift(inregi,shiftr)
%inregi:
输入序列
%shiftr:
循环右移的位数
%outregi:
输出序列
v=length(inregi);
%输入序列的长度
outregi=inregi;
%输出序列初始化为输入序列
shiftr=rem(shiftr,v);
%求余,使移位的值在[0,v]之间
ifshiftr>
0
outregi(:
1:
shiftr)=inregi(:
v-shiftr+1:
v);
%循环移位把最后shiftr位移到前shiftr位
1+shiftr:
v)=inregi(:
v-shiftr);
%完成剩余的移位
elseifshiftr<
v+shiftr)=inregi(:
1-shiftr:
v+shiftr+1:
-shiftr);
%3.直接序列扩频主程序代码
function[ber]=dscdma(user,seq)
%user:
同时进行扩频通信的用户数
%seq:
扩频码1:
M-序列2:
Gold序列3:
正交Gold序列
%ber:
该用户数下的误码率
%****************************初始化部分*****************************
sr=256000.0;
%符号速率
nSymbol=10000;
%每种信噪比下发送的符号数
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序列
code=[goldseq(m1,m2,user),zeros(user,1)];
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.'
;
%*****************************通过瑞利衰落信道******************************
%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;
%假设理想信道估计
y=rcosflt(y.'
Fs/filter'
%通过脉冲成形滤波器进行滤波
y=downsample(y,Fs);
%降采样
user
y1(:
ii)=y(2*delay+1:
end-2*delay,ii);
yd=despread(y1.'
code);
%数据解扩
demodata=qamdemod(yd,M);
%4-QAM解调
demodata=graycode(demodata+1);
%Gray编码逆映射
[err,ber(indx)]=biterr(data,demodata,log2(M));
%统计误比特率
End
%扩频函数
function[out]=spread(data,code)
函数spread用于将输入数据序列和扩频序列扩频
%data:
输入数据序列
%code:
扩频码序列
%out:
扩频后的输出数据序列
switchnargin
case{0,1}%如果输入参数个数不对,提示错误
error('
缺少输入参数'
[hn,vn]=size(data);
[hc,vc]=size(code);
ifhn>
hc%如果扩频码数小于输入的待扩频的数据序列,提示错误
缺少扩频码序列'
out=zeros(hn,vn*vc);
%初始化输出序列
hn
out(ii,:
)=reshape(code(ii,:
).'
*data(ii,:
),1,vn*vc);
%将扩频后的数据排成行矢量的形式
%信号解扩
functionout=despread(data,code)
函数despread用于将输入数据序列和扩频序列解扩
解扩使用的扩频码序列
解扩后的输出数据序列
switchnargin%如果输入参数个数不对,提示错误
case{0,1}
out=zeros(hc,vn/vc);
%初始化输出序列
hc
xx=reshape(data(ii,:
),vc,vn/vc);
)=code(ii,:
)*xx/vc;
%函数rayleigh用于产生瑞利衰落信道
function[h]=rayleigh(fd,t)
%该程序利用改进的jakes模型来产生单径的平坦型瑞利衰落信道
%YahongR.ZhengandChengshanXiao"
ImprovedModelsfor
%theGenerationofMultipleUncorrelatedRayleighFadingWaveforms"
%IEEECommuletters,Vol.6,NO.6,JUNE2002
%输入变量说明:
%fd:
信道的最大多普勒频移单位Hz
%t:
信号的抽样时间序列,抽样间隔单位s
%h为输出的瑞利信道函数,是一个时间函数复序列
%假设的入射波数目
N=40;
wm=2*pi*fd;
%每象限的入射波数目即振荡器数目
N0=N/4;
%信道函数的实部
Tc=zeros(1,length(t));
%信道函数的虚部
Ts=zeros(1,length(t));
%归一化功率系数
P_nor=sqrt(1/N0);
%区别个条路径的均匀分布随机相位
theta=2*pi*rand(1,1)-pi;
N0
%第i条入射波的入射角
alfa(ii)=(2*pi*ii-pi+theta)/N;
%对每个子载波而言在(-pi,pi)之间均匀分布的随机相位
fi_tc=2*pi*rand(1,1)-pi;
fi_ts=2*pi*rand(1,1)-pi;
%计算冲激响应函数
Tc=Tc+cos(cos(alfa(ii))*wm*t+fi_tc);
Ts=Ts+cos(sin(alfa(ii))*wm*t+fi_ts);
end;
%乘归一化功率系数得到传输函数
h=P_nor*(Tc+j*Ts);
%4.主程序
%m-序列DS-CDMA在AWGN信道下的性能仿真
clearall
user=[147];
seq=1;
forindex=1:
length(user)
ber(index,:
)=dscdma(user(index),seq);
semilogy(EbNo,ber(1,:
),'
-kx'
EbNo,ber(2,:
-ko'
EbNo,ber(3,:
-k*'
legend('
user=1'
'
user=4'
user=7'
)
title('
m序列DS-CDMA在AWGN信道下的性能'
xlabel('
信噪比EbNo(dB)'
ylabel('
误比特率(BER)'
%5、正交Gold序列在AWGN信道下的性能
%正交Gold序列DS-CDMA在AWGN信道下的性能仿真
user=[111];
seq=3;
ber(indx,:
)=dscdma(user(indx),seq);
正交Gold序列DS-CDMA在Reyleigh信道下的性能'
学校 电子科技大学
学院 通信与信息学院
班级 通信专业十一班
候号前 2010013110001
龚睦 2010013110003