您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Matlab仿真DF和AF源程序
版权所有,如转载,请注明出处。说明:该程序是使用Matlab仿真协同通信的DF(解码转发)基本性能,基本模型S-R-D三个节点,接收端使用MRC(最大比合并)。固定DF由于SR信道的错误,其性能受到限制,在大SNR情况下不能获得有效分集。而当SR距离足够近的时候,可能获得一定的分集增益。该程序也可以作为学习Matlab通信仿真的入门实例。使用的基本函数:随机数函数:randrandn文件操作:fopenfprintffclose时间函数:datestr(now)画图函数:semilogylegendaxis通信基本概念和函数:瑞利信道及其产生高斯噪声的产生蒙特卡罗仿真MRC最大比合并程序一:DF_SNR_SR_distance.m主程序%writtenbyxiyong826025/08/2009%thiscodeisforfixedDFperformanceevaluation,comparethediffirentSRdistance%该仿真用来评估不同的SR距离下的固定DF转发性能%forS-R-Dthreenodes%theSDandRDchannelisRayleighfading,andtheaverageSNRisvaried.clearall;%thetimesofMonteCarlo%蒙特卡罗仿真的次数Monte_MAX=10^(7);%thelengthofdataframeM2=10^(0);MIN_SNR=0;MAX_SNR=30;INTERVAL=2;%功率划分因子,在协同情况下,为了保证总的功率一定,每个节点使用1/2的功率发送POW_DIV=1/2;%openanewrecordfile%打开一个新的文件,如果文件已经存在,那么清除以前的内容fid=fopen('record.txt','w');fprintf(fid,'%%%s\n',datestr(now));fclose(fid);%settheSDdistanceandRDdistance%设置SD距离和RD的距离,归一化为1sd_distance=1;rd_distance=1;%变化不同的SR距离sr_distances=[0.1,0.5,0.7,0.9];%使用循环的方式仿真不同的SR距离性能forsr_INDEX=1:2%通过sr_INDEX变量获得真正的SR距离sr_distance=sr_distances(sr_INDEX);%snrcount这个变量用来对下面的SNR循环进行计数snrcount=0;%变化SNR循环forSNR=MIN_SNR:INTERVAL:MAX_SNRsig=10^(SNR/10);%justdisplaysomethingonthescreen.%仅仅是在计算机上显示一些信息,因为仿真往往很漫长,只是想知道仿真到哪里了^.^datestr(now)M2SNRsnrcount=snrcount+1;%用来对错误的bit计数err_num_dsd=0;err_num_coop=0;fortries=0:Monte_MAX%flagindicateifthecooperateisused,if1,usecooperation,elsedirecttranisperferred.%一个标志,表明是否转发tx_coop=1;%generatethesourceBPSKsignal,0,1%产生一个长度为M2的0,1随机数X1=rand(1,M2)0.5;%generatethesourceBPSKsignal,+1,-1%产生一个长度为M2的BPSK随机信号Xs=X1*2-1;%generatethesource-relaychannel,thechannelkeepconstantinaframe%产生SR信道,假设信道在一帧内保持不变CH_sr=xy_RayleighCH(1)/(sr_distance)^2;%thereceivedsignalofsource-relaytransmission%中继接收到的源的信号,y=hx+nR_dsr=CH_sr*sqrt(POW_DIV*sig).*Xs+xy_noise(M2);%thedecodesignalofsource-relaytransmission%中继对信道进行估计,匹配后硬判决得到的源的信号,根据MRC(最大比合并)的基本原理Xr=(conj(CH_sr)*sqrt(POW_DIV*sig).*R_dsr0)*2-1;%如果中继解码错误,则不转发if(sum(Xs~=Xr)0)tx_coop=0;end%如果使用固定DF,我们强制设置tx_coop为1tx_coop=1;%generatethesource-destinationchannel,thechannelkeepconstantinaframe%产生SD信道,假设信道在一帧内保持不变CH_sd=xy_RayleighCH(1)/(sd_distance)^2;%thereceivedsignalofdirectsource-destinationtransmission%假设不使用协同,直接传输情况下目的节点接收到的源的信号,y=hx+n,这里,源节点使用全功率发送R_dsd=CH_sd*sqrt(sig).*Xs+xy_noise(M2);%thedecodesignalofdirectsource-destinationtransmission%目的节点对信道进行估计,匹配后硬判决得到的源的信号,根据MRC(最大比合并)的基本原理Y_dsd=(conj(CH_sd)*sqrt(sig).*R_dsd0)*2-1;%thereceivedsignalofcooperativesource-destinationtransmission%在使用协同情况下,目的节点接收到的源的信号,y=hx+n,这里,源节点使用半功率发送R_csd=CH_sd*sqrt(POW_DIV*sig).*Xs+xy_noise(M2);%generatetherelay-destinationchannel,thechannelkeepconstantinaframe%产生RD信道,假设信道在一帧内保持不变CH_rd=xy_RayleighCH(1)/(rd_distance)^2;if(tx_coop==1)%thereceivedsignalofcooperativerelay-destinationtransmission%在使用协同情况下,目的节点接收到的来自中继的信号R_crd=CH_rd*sqrt(POW_DIV*sig).*Xr+xy_noise(M2);%MRC的合并信号R_combine=conj(CH_sd)*sqrt(POW_DIV*sig).*R_csd+conj(CH_rd)*sqrt(POW_DIV*sig).*R_crd;else%ifdirecttransmissionischosen,thesourcejustretransmitthesignalagain.%如果不使用协同,源节点重复发送自己的数据,假设两次重复发送期间信道保持不变R_crd=CH_sd*sqrt(POW_DIV*sig).*Xs+xy_noise(M2);%MRC的合并信号R_combine=conj(CH_sd)*sqrt(POW_DIV*sig).*R_csd+conj(CH_sd)*sqrt(POW_DIV*sig).*R_crd;end%thedecodesignalofofcooperativeMRCcombining%MRC后的判决信号Y_combine=(R_combine0)*2-1;%thenumberoferrorbit%统计每一帧里面错误的比特数目err_num_dsd=sum(Xs~=Y_dsd)+err_num_dsd;err_num_coop=sum(Xs~=Y_combine)+err_num_coop;end%try=0:Monte_MAX%therealber%计算每个SNR下的平均错误BERber_dsd(snrcount)=err_num_dsd/(M2*Monte_MAX);ber_coop(snrcount)=err_num_coop/(M2*Monte_MAX);end%SNR=MIN_SNR:MAX_SNR%以追加的方式打开文件,将数据写入记录文件fid=fopen('record.txt','a');fprintf(fid,'\n%%ber_dsdis\nber_dsd%d=[',sr_INDEX);fprintf(fid,'%d',ber_dsd);fprintf(fid,'];\n');fprintf(fid,'\n%%fixedber_coopis\nber_coop%d=[',sr_INDEX);fprintf(fid,'%d',ber_coop);fprintf(fid,'];\n');fclose(fid);end%SrindexSNR1=MIN_SNR:INTERVAL:MAX_SNR;%瑞利信道下的直接发送的理论BER表达式sig1=10.^(SNR1/10);u1=sqrt(sig1./(1+sig1));Pe10=1/2*(1-u1);%瑞利信道下的二阶分集理论BER表达式,使用半功率sig2=1/2*10.^(SNR1/10);u2=sqrt(sig2./(1+sig2));Pe20=1/4*(1-u2).^(2).*(2+u2);%使用半对数画出SNR和BER的曲线semilogy(SNR1,ber_dsd,'-o',SNR1,ber_coop,'-+',SNR1,Pe10,'-+',SNR1,Pe20,'-*');legend('direct','cooperative','L=1,therotic','L=2therotic');gridon;ylabel('TheAVERAGEBER');xlabel('SNR(dB)');title('thecooperativeBERofBPSKinRayleighfadingchannel');axis([MIN_SNR,MAX_SNR,10^(-6),1]);程序二:xy_noise.m高斯噪声函数的产生functionM=xy_noise(M2)M=sqrt(1/2)*(randn(1,M2)+j*randn(1,M2));程序三:xy_RayleighCH.m瑞利信道的产生functionH=xy_RayleighCH(M2)H=sqrt(1/2)*(randn(1,M2)+j*randn(1,M2));record.txt文件样例%19-Sep-200918:27:18%ber_dsdisber_dsd1=[2.306000e-0021.564000e-0029.620000e-0036.000000e-0033.870000e-0032.600000e-003];%fixedber_coopisber_coop1=[5.540000e-0032.710000e-0031.070000e-0033.300000e-0041.800000e-0044.000000e-005];%ber_dsdisber_dsd2=[2.348000e-0021.516000e-0029.400000e-0036.480000e-0034.060000e-0032.380000e-003];%fixedber_coopisber_coop2=[7.070000e-0033.320000e-0031.740000e-0038.300000e-0045.100000e-0043.000000e-004];由于蒙特卡罗仿真时间耗时较长,使用文件操作的好处是可以中途看数据,在计算机出现故障或者断电情况下将已经仿真的数据保存起来。程序四:未经过解释的AF源程序%writtenb
本文标题:Matlab仿真DF和AF源程序
链接地址:https://www.777doc.com/doc-8153634 .html