MATLAB仿真直接序列扩频通信1.摘要直接序列扩频通信系统(DS-CDMA)因其抗干扰性强、隐蔽性好、易于实现码分多址(CDMA)、抗多径干扰、直扩通信速率高等众多优点,而被广泛应用于许多领域中。
针对频通信广泛的应用,本文用MATLAB工具箱中的SIMULINK通信仿真模块和MATLAB函数对直接序列扩频通信系统进行了分析和仿真,使其更加形象和具体。
关键字:扩频通信m序列gold正交序列matlab仿真2.引言直接序列扩频(DSSS— Direct Sequence Spread Spectrum)技术是当今人们所熟知的扩频技术之一。
这种技术是将要发送的信息用伪随机码(PN码)扩展到一个很宽的频带上去,在接收端,用与发端扩展用的相同的伪随机码对接收到的扩频信号进行相关处理,恢复出发送的信息。
它是二战期间开发的,最初的用途是为军事通信提供安全保障, 是美军重要的无线保密通信技术。
这种技术使敌人很难探测到信号。
即便探测到信号,如果不知道正确的编码,也不可能将噪声信号重新汇编成原始的信号。
有关扩频通信技术的观点是在1941年由好莱坞女演员Hedy Lamarr 和钢琴家George Antheil提出的。
基于对鱼雷控制的安全无线通信的思路,他们申请了美国专利#2.292.387。
不幸的是,当时该技术并没有引起美国军方的重视,直到十九世纪八十年代才引起关注,将它用于敌对环境中的无线通信系统。
直序扩频解决了短距离数据收发信机、如:卫星定位系统(GPS)、3G移动通信系统、WLAN (IEEE802.11a, IEEE802.11b, IEE802.11g)和蓝牙技术等应用的关键问题。
扩频技术也为提高无线电频率的利用率(无线电频谱是有限的因此也是一种昂贵的资源)提供帮助。
3.直接序列扩频DS-SS是直接用具有高码率的扩频码序列在发送端去扩展信号的频谱。
而在收端,用相同的扩频码序列去进行解扩,把展宽的扩频信号还原成原始的信息。
4.DS-CDMA通信系统原理图在实验中,我们采用;两种扩频码进行仿真。
M序列和正交Gold序列,扩频后的数据通过脉冲成型滤波器后通过信道同时到达接收端,在接收端分别对不同用户信息数据进行解扩,恢复各个用户的原始信息。
5.仿真设计步骤1、m序列的DS-CDMA在AWGN下的性能的仿真。
2、正交Gold序列的DS-CDMA在AWGN下的性能的仿真。
3、对比两个扩频码在AWGN信道下的性能曲线,分析哪种扩频码更适合在AWGN信道中传输,传输衰减最小,对比m序列和正交Gold序列的抗干扰能力。
6.实验仿真运行结果从图中可以看出,由于正交Gold序列在完全同步时,它们的互相关值为0,因此其BER性能并不随着用户数的增加而恶化。
在信噪比为2 、4 、6时误比特率基本相同。
由图可以看出来当误比特率仿真时候小于10-3时结果就会有一定的偏差。
但还是可以看出正交Gold序列比M序列的性能要好。
所以,初步得出结论:正交Gold序列在AWGN信道下的抗干扰能力更强,衰减比,序列要小。
对比图4-1和图4-3,显然M序列在瑞利衰落信道下的性能要比能过AWGN信道下的性能要差7.总结对于本仿真而言,已基本完成了设计任务书的设计和研究目的,通过用MATLAB 对DS-CDMA系统的仿真调试、结果分析,让我组熟悉了DS-CDMA的工作原理,加深了对扩频通信的认识,并深刻的了解PN码在不同信道的衰落情况。
通过仿真结果中波形的直观方式,更让我们了解到了系统衰减的规律。
但是在本设计中也存在着缺陷与不足1、在本设计中过程中可能由于程序过于复杂,信息本身所占用的带宽偏大,用来传输信息的带宽相对不够大,造成结果并不明显,信息衰减严重。
2、在设计中只考虑到加性高斯信道所带来的干扰,在实际通信信道却是复杂多变,存在着各种各样的情况,所以最后的接收信号是在很简单的干扰下得出。
要想应用于实际中,必须加入各种噪声来考虑,以实现真实系统的设计。
3、实验中,我们选择加大传输带宽,来弥补其他干扰带来的影响,可能会造成消耗过大,浪费带宽的结果,实际应用中是不实用的。
只能作为仿真,进行研究。
即使如此,在本次设计的整个过程中,以上的结果已经令我们受益匪浅。
通信系统的性能分析和仿真,随着通信技术、信息技术和计算机技术的发展以及网络系统的大量应用,显得越来越重要。
参考文献[1] 刘学勇,编著.通信系统建模与仿真(电子工业出版社)[2] 邓薇,编著.MATALB函数速查手册(人民邮电出版社)[3] 【美】William C.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序列% ****************************************************************if nargin < 4 %输入参数判断num = 1;endmout = zeros(num,2^n-1); %寄存器输出值的初始化,全0fpos = zeros(n,1); %反馈寄存器连接位置的初始化fpos(taps) = 1; %反馈寄存器连接位置for ii=1:2^n-1mout(1,ii) = inidata(n); % 寄存器的输出值temp = mod(inidata*fpos,2); % 计算反馈数据inidata(2:n) = inidata(1:n-1); % 寄存器移位一次inidata(1) = temp; % 更新第1个寄存器的值endif num > 1 %如果要输出多个m序列,生成其他m序列for ii=2:nummout(ii,:) = shift(mout(ii-1,:),1); %shift函数完成序列的循环移位,上一个序列向右循环移位endend%2.函数goldseq用于产生gold序列function [gout] = goldseq(m1, m2, num)% ****************************************************************% m1 : m序列1% m2 : m序列2% num : 生成的Gold序列个数% gout : 生成的Gold序列输出% ****************************************************************if nargin < 3 %如果没有指定生成的Gold序列个数,默认为1num = 1;endgout = zeros(num,length(m1));for ii=1:num %根据Gold序列生成方法生成Gold序列gout(ii,:) = xor(m1,m2);m2 = shift(m2,1);end%函数shift用于完成循环移位function [outregi] = shift(inregi,shiftr)% ****************************************************************% inregi : 输入序列% shiftr : 循环右移的位数% outregi : 输出序列% ****************************************************************v = length(inregi); %输入序列的长度outregi = inregi; %输出序列初始化为输入序列shiftr = rem(shiftr,v); %求余,使移位的值在[0, v]之间if shiftr > 0outregi(:,1:shiftr) = inregi(:,v-shiftr+1:v); %循环移位把最后shiftr位移到前shiftr位outregi(:,1+shiftr:v) = inregi(:,1:v-shiftr); %完成剩余的移位elseif shiftr < 0outregi(:,1:v+shiftr) = inregi(:,1-shiftr:v);outregi(:,v+shiftr+1:v) = inregi(:,1:-shiftr);end%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=[0 1 3 2]; % Gray编码规则EbNo=0:2:10; % Eb/No 变化范围%************************** 脉冲成形滤波器参数**************************delay = 10; % 升余弦滤波器时延Fs = 8; % 滤波器过采样数rolloff = 0.5; % 升余弦滤波器滚降因子rrcfilter = rcosine(1,Fs,'fir/sqrt',rolloff,delay); %设计根升余弦滤波器%********************** 扩频码产生参数**********************%直接序列扩频主程序代码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=[0 1 3 2]; % 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 = [1 3]; % m序列1的寄存器连接方式ptap2 = [2 3]; % m序列2的寄存器连接方式regi1 = [1 1 1 ]; % m序列1的寄存器初始值regi2 = [1 1 1]; % m序列2的寄存器初始值%******************** 扩频码的生成*********************switch seqcase 1 % M-序列code = mseq(stage,ptap1,regi1,user);case 2 % Gold 序列m1 = mseq(stage,ptap1,regi1);m2 = mseq(stage,ptap2,regi2);code = goldseq(m1,m2,user);case 3 % 正交Gold 序列m1 = mseq(stage,ptap1,regi1);m2 = mseq(stage,ptap2,regi2);code = [goldseq(m1,m2,user),zeros(user,1)];endcode = 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);%**************************** 仿真开始****************************for indx=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; % 计算每个用户信号功率if user > 1 % 用户数大于1时,所有用户数据相加out1=sum(out1.');elseout1=out1.';end%***************************** 通过瑞利衰落信道******************************% out1=h.*out1;%******************************** 接收端*********************************sigma = sqrt(0.5 * spow * sr / br * 10^(-EbNo(indx)/10)); % 根据信噪比计算高斯白噪声方差y=[];for ii=1:usery(ii,:)=out1+sigma(ii).*(randn(1,length(out1))+j*randn(1,length(out1))); %加入高斯白噪声(AWGN)% y(ii,:)=y(ii,:)./h; % 假设理想信道估计endy=rcosflt(y.',sr,Fs*sr,'Fs/filter',rrcfilter); % 通过脉冲成形滤波器进行滤波y=downsample(y,Fs); % 降采样for ii=1:usery1(:,ii)=y(2*delay+1:end-2*delay,ii);endyd = 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 : 扩频后的输出数据序列% ****************************************************************switch nargincase { 0 , 1 } %如果输入参数个数不对,提示错误error('缺少输入参数');end[hn,vn] = size(data);[hc, vc] = size(code);if hn > hc %如果扩频码数小于输入的待扩频的数据序列,提示错误error('缺少扩频码序列');endout = zeros(hn,vn*vc); %初始化输出序列for ii=1:hnout(ii,:) = reshape(code(ii,:).'*data(ii,:),1,vn*vc); %将扩频后的数据排成行矢量的形式end%信号解扩function out = despread(data, code)% ****************************************************************%说明:函数despread用于将输入数据序列和扩频序列解扩% data : 输入数据序列% code : 解扩使用的扩频码序列% out : 解扩后的输出数据序列% ****************************************************************switch nargin %如果输入参数个数不对,提示错误case { 0 , 1 }error('缺少输入参数');end[hn,vn] = size(data);[hc, vc] = size(code);out = zeros(hc,vn/vc); %初始化输出序列for ii=1:hcxx=reshape(data(ii,:),vc,vn/vc);out(ii,:)= code(ii,:)*xx/vc;end%函数rayleigh用于产生瑞利衰落信道function [h]=rayleigh(fd,t)%该程序利用改进的jakes模型来产生单径的平坦型瑞利衰落信道%Yahong R.Zheng and Chengshan Xiao "Improved Models for%the Generation of Multiple Uncorrelated Rayleigh Fading Waveforms"%IEEE Commu letters, Vol.6, NO.6, JUNE 2002%输入变量说明:% 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;for ii=1: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信道下的性能仿真clear alluser=[1 4 7];seq=1;for index=1:length(user)ber(index,:)=dscdma(user(index),seq);endEbNo=0:2:10;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信道下的性能仿真clear alluser=[1 1 1];seq=3;for indx=1:length(user)ber(indx,:)=dscdma(user(indx),seq);endEbNo=0:2:10;semilogy(EbNo,ber(1,:),'-kx',EbNo,ber(2,:),'-ko',EbNo,ber(3,:),'-k*');legend('user=1','user=4','user=7')title('正交Gold序列DS-CDMA在Reyleigh信道下的性能')xlabel('信噪比EbNo(dB)')ylabel('误比特率(BER)')学校电子科技大学学院通信与信息学院班级通信专业十一班候号前2010013110001龚睦2010013110003。