OFDM与QPSK对比程序的源代码.docx
- 文档编号:7153015
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:16
- 大小:19.63KB
OFDM与QPSK对比程序的源代码.docx
《OFDM与QPSK对比程序的源代码.docx》由会员分享,可在线阅读,更多相关《OFDM与QPSK对比程序的源代码.docx(16页珍藏版)》请在冰豆网上搜索。
OFDM与QPSK对比程序的源代码
附录:
%OFDM误码率分析
echooff;clearall;closeall;clc;
fprintf('OFDM仿真\n');
tic;
%---------------------------------------------%
%参数定义%
%---------------------------------------------%
%Initializetheparameters
NumLoop=1000;
NumSubc=128;
NumCP=8;
SyncDelay=0;
%子载波数128
%位数/符号2
%符号数/载波1000
%训练符号数0
%循环前缀长度8(1/16)*T
%调制方式4-QAM
%多径信道数3
%IFFTSize128
%信道最大时延2
%---------------------------------------------%
%QAMMODULATION%
%---------------------------------------------%
%Generatetherandombinarystreamfortransmittest
BitsTx=floor(rand(1,NumLoop*NumSubc)*2);
%Modulate(GeneratesQAMsymbols)
%input:
BitsTx(1,NumLoop*NumSubc);output:
SymQAM(NumLoop,NumSubc/2)
SymQAMtmp=reshape(BitsTx,2,NumLoop*NumSubc/2).';
SymQAMtmptmp=bi2de(SymQAMtmp,2,'left-msb');
%--------------------------------------------------------------------
%函数说明:
%bin2dec(binarystr)interpretsthebinarystringbinarystrandreturnsthe
%equivalentdecimalnumber.
%bi2de是把列向量的每一个元素都由2进制变为10进制
%D=BI2DE(...,MSBFLAG)usesMSBFLAGtodeterminetheinputorientation.
%MSBFLAGhastwopossiblevalues,'right-msb'and'left-msb'.Givinga
%'right-msb'MSBFLAGdoesnotchangethefunction'sdefaultbehavior.
%Givinga'left-msb'MSBFLAGflipstheinputorientationsuchthatthe
%MSBisontheleft.
%%%D=BI2DE(...,P)convertsabasePvectortoadecimalvalue.
%%Examples:
%%>>B=[0011;1010];
%%>>T=[011;210];
%%>>D=bi2de(B)>>D=bi2de(B,'left-msb')>>D=bi2de(T,3)
%%D=D=D=
%%12312
%%5105
%--------------------------------------------------------------------
%QAMmodulation
%00->-1-i,01->-1+i,10->1-i,11->1+i
%利用查表法进行QAM星座映射
QAMTable=[-1-i-1+i1-i1+i];
SymQAM=QAMTable(SymQAMtmptmp+1);
%---------------------------------------------%
%IFFT%
%---------------------------------------------%
%input:
SymQAM(NumLoop,NumSubc/2);output:
SymIFFT(NumSubc,NumLoop)
SymIFFT=zeros(NumSubc,NumLoop);
SymIFFTtmp=reshape(SymQAM,NumSubc/2,NumLoop);
SymIFFTtmptmp=zeros(NumSubc,NumLoop);
SymIFFTtmptmp(1,:
)=real(SymIFFTtmp(1,:
));%实数
SymIFFTtmptmp(NumSubc/2+1,:
)=imag(SymIFFTtmp(1,:
));%实数
%这么安排矩阵的目的是为了构造共轭对称矩阵
%共轭对称矩阵的特点是在ifft/fft的矢量上N点的矢量
%在0,N/2点必须是实数一般选为0
%1至N/2点与(N/2)+1至N-1点关于N/2共轭对称
SymIFFTtmptmp(2:
NumSubc/2,:
)=SymIFFTtmp(2:
NumSubc/2,:
);
SymIFFTtmptmp((NumSubc/2+2):
NumSubc,:
)=flipdim(conj(SymIFFTtmp(2:
NumSubc/2,:
)),1);
%--------------------------------------------------------------------
%函数说明:
%B=flipdim(A,dim)returnsAwithdimensiondimflipped.
%Whenthevalueofdimis1,thearrayisflippedrow-wisedown.Whendimis2,
%thearrayisflippedcolumnwiselefttoright.flipdim(A,1)isthesameas
%flipud(A),andflipdim(A,2)isthesameasfliplr(A).
%--------------------------------------------------------------------
%%>>a=[123;456;789;101112]
%%a=
%%123
%%456
%%789
%%101112
%%>>b=flipdim(a,1)
%%b=
%%101112
%%789
%%456
%%123
SymIFFT=ifft(SymIFFTtmptmp,NumSubc,1);
%---------------------------------------------%
%Addcyclicprefix%
%---------------------------------------------%
%input:
SymIFFT(NumSubc,NumLoop);output:
SymCP(NumSubc+NumCP,NumLoop)
NumAddPrefix=NumSubc+NumCP;
SymCP=zeros(NumAddPrefix,NumLoop);
RowPrefix=(NumSubc-NumCP+1):
NumSubc;
SymCP=[SymIFFT(RowPrefix,:
);SymIFFT];
%---------------------------------------------%
%Gothroughthechannel%
%---------------------------------------------%
%input:
SymCP(NumSubc+NumCP,NumLoop);output:
SymCh(1,(NumSubc+NumCP)*NumLoop)
SymCh=zeros(1,(NumSubc+NumCP)*NumLoop);
SymChtmp=SymCP(:
).';
%进行这个转置操作之后就成了一个矢量
%相当于把矩阵的列向量依次排列改变为一个行向量
Ch=[11/21/4];
SymChtmptmp=filter(Ch,1,SymChtmp);
%--------------------------------------------------------------------
%函数说明:
%Firlterdatawithaninfiniteimpulseresponse(IIR)orfiniteimpulseresponse
%(FIR)filter
%y=filter(b,a,X)filtersthedatainvectorXwiththefilterdescribedby
%numeratorcoefficientvectorbanddenominatorcoefficientvectora.Ifa
(1)is
%notequalto1,filternormalizesthefiltercoefficientsbya
(1).Ifa
(1)equals
%0,filterreturnsanerror.
%--------------------------------------------------------------------
%IfXisamatrix,filteroperatesonthecolumnsofX.IfXisamultidimensional
%array,filteroperatesonthefirstnonsingletondimension.
%--------------------------------------------------------------------
%AddtheAWGN
BerSnrTable=zeros(20,3);
forsnr=0:
19;
%=SNR+10*log10(log2
(2));
BerSnrTable(snr+1,1)=snr;
SymCh=awgn(SymChtmptmp,snr,'measured');
%--------------------------------------------------------------------
%函数说明:
%AWGNAddwhiteGaussiannoisetoasignal.
%Y=AWGN(X,SNR)addswhiteGaussiannoisetoX.TheSNRisindB.
%ThepowerofXisassumedtobe0dBW.IfXiscomplex,then
%AWGNaddscomplexnoise.
%------------------------------------------------------------------
%Y=AWGN(X,SNR,SIGPOWER)whenSIGPOWERisnumeric,itrepresents
%thesignalpowerindBW.WhenSIGPOWERis'measured',AWGNmeasures
%thesignalpowerbeforeaddingnoise.
%---------------------------------------------------------------------
%Y=AWGN(X,SNR,SIGPOWER,STATE)resetsthestateofRANDNtoSTATE.
%
%Y=AWGN(...,POWERTYPE)specifiestheunitsofSNRandSIGPOWER.
%POWERTYPEcanbe'db'or'linear'.IfPOWERTYPEis'db',thenSNR
%ismeasuredindBandSIGPOWERismeasuredindBW.IfPOWERTYPEis
%'linear',thenSNRismeasuredasaratioandSIGPOWERismeasured
%inWatts.
%
%Example:
TospecifythepowerofXtobe0dBWandaddnoisetoproduce
%anSNRof10dB,use:
%X=sqrt
(2)*sin(0:
pi/8:
6*pi);
%Y=AWGN(X,10,0);
%
%Example:
TospecifythepowerofXtobe0dBW,setRANDNtothe1234th
%stateandaddnoisetoproduceanSNRof10dB,use:
%X=sqrt
(2)*sin(0:
pi/8:
6*pi);
%Y=AWGN(X,10,0,1234);
%
%Example:
TospecifythepowerofXtobe3Wattsandaddnoiseto
%producealinearSNRof4,use:
%X=sqrt
(2)*sin(0:
pi/8:
6*pi);
%Y=AWGN(X,4,3,'linear');
%
%Example:
TocauseAWGNtomeasurethepowerofX,setRANDNtothe
%1234thstateandaddnoisetoproducealinearSNRof4,use:
%X=sqrt
(2)*sin(0:
pi/8:
6*pi);
%Y=AWGN(X,4,'measured',1234,'linear');
%---------------------------------------------%
%RemoveGuardIntervals%
%---------------------------------------------%
%input:
SymCh(1,(NumSubc+NumCP)*NumLoop);output:
SymDeCP(NumSubc,NumLoop)
SymDeCP=zeros(NumSubc,NumLoop);
SymDeCPtmp=reshape(SymCh,NumSubc+NumCP,NumLoop);
SymDeCP=SymDeCPtmp((NumCP+1+SyncDelay):
NumAddPrefix+SyncDelay,:
);
%---------------------------------------------%
%FFT%
%---------------------------------------------%
%input:
SymDeCP(NumSubc,NumLoop);output:
SymFFT(NumSubc,NumLoop)
SymFFT=fft(SymDeCP,NumSubc,1);
%---------------------------------------------%
%MakeDecision(IncludeDeQAM)%
%---------------------------------------------%
%SymFFT(NumSubc,NumLoop);output:
SymDec(NumSubc,NumLoop)
SymDec=zeros(NumSubc,NumLoop);
SymEqtmp(1,:
)=SymFFT(1,:
)+i*SymFFT(NumSubc/2+1,:
);
SymEqtmp(2:
NumSubc/2,:
)=SymFFT(2:
NumSubc/2,:
);
form=1:
NumLoop
forn=1:
NumSubc/2
Real=real(SymEqtmp(n,m));
Imag=imag(SymEqtmp(n,m));
if(abs((Real-1)) SymDec(2*n-1,m)=1; else SymDec(2*n-1,m)=0; end if(abs((Imag-1)) SymDec(2*n,m)=1; else SymDec(2*n,m)=0; end end end %--------------------------------------------------------------------- %Testbylavabin %AnotherwaytoDeQAM %QAMTable=[-1-i-1+i1-i1+i]; %00->-1-i,01->-1+i,10->1-i,11->1+i TestSymDec=zeros(NumSubc,NumLoop); TestSymEqtmp(1,: )=SymFFT(1,: )+i*SymFFT(NumSubc/2+1,: ); TestSymEqtmp(2: NumSubc/2,: )=SymFFT(2: NumSubc/2,: ); TestSymEqtmp1=reshape(TestSymEqtmp,1,NumSubc*NumLoop/2); min_d=zeros(size(TestSymEqtmp1)); min_ddd=zeros(1,NumSubc*NumLoop); d=zeros(4,1); min_index=0; forii=1: 1: (NumSubc*NumLoop/2) forjj=1: 4 d(jj)=abs(TestSymEqtmp(ii)-QAMTable(jj)); end [min_d(ii),min_index]=min(d); %%[Y,I]=MIN(X)returnstheindicesoftheminimumvaluesinvectorI. switchmin_index case1 min_ddd(2*ii-1)=0; min_ddd(2*ii)=0; case2 min_ddd(2*ii-1)=0; min_ddd(2*ii)=1; case3 min_ddd(2*ii-1)=1; min_ddd(2*ii)=0; case4 min_ddd(2*ii-1)=1; min_ddd(2*ii)=1; otherwise fprintf('Impossibleerror! ! ! \n\n'); end end %-------------------------------------------------------------------- %函数说明: %%C=min(A)returnsthesmallestelementsalongdifferentdimensionsofan %%array. %%IfAisavector,min(A)returnsthesmallestelementinA. %%IfAisamatrix,min(A)treatsthecolumnsofAasvectors,returningarow %%vectorcontainingtheminimumelementfromeachcolumn. %%[C,I]=min(...)findstheindicesoftheminimumvaluesofA,andreturns %%theminoutputvectorI.Ifthereareseveralidenticalminimumvalues,the %%indexofthefirstonefoundisreturned. %BitError BitsRx=zeros(1,NumSubc*NumLoop); BitsRx=SymDec(: ).'; [Num,Ber]=symerr(BitsTx,BitsRx) BerSnrTable(snr+1,2)=Num; BerSnrTable(snr+1,3)=Ber; end %-------------------------------------------------------------------- %Testbylavabin ifmin_ddd==BitsRx fprintf('DeQAMtwowaysthesameresults\n\n'); else fprintf('DeQAMtwowaysthedifferentresults'); end %-------------------------------------------------------------------- figure (1); subplot(2,1,1); semilogy(BerSnrTable(: 1),BerSnrTable(: 2),'o-'); subplot(2,1,2); semilogy(BerSnrTable(: 1),BerSnrTable(: 3),'o-'); %--------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OFDM QPSK 对比 程序 源代码