OFDM与QPSK对比程序的源代码Word文档下载推荐.docx
《OFDM与QPSK对比程序的源代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OFDM与QPSK对比程序的源代码Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
%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'
.Givinga
%'
MSBFLAGdoesnotchangethefunction'
sdefaultbehavior.
%Givinga'
MSBFLAGflipstheinputorientationsuchthatthe
%MSBisontheleft.
%%%D=BI2DE(...,P)convertsabasePvectortoadecimalvalue.
%%Examples:
%%>
>
B=[0011;
1010];
T=[011;
210];
D=bi2de(B)>
D=bi2de(B,'
)>
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%
SymQAM(NumLoop,NumSubc/2);
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:
SymIFFTtmptmp((NumSubc/2+2):
NumSubc,:
)=flipdim(conj(SymIFFTtmp(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=
SymIFFT=ifft(SymIFFTtmptmp,NumSubc,1);
%Addcyclicprefix%
SymIFFT(NumSubc,NumLoop);
SymCP(NumSubc+NumCP,NumLoop)
NumAddPrefix=NumSubc+NumCP;
SymCP=zeros(NumAddPrefix,NumLoop);
RowPrefix=(NumSubc-NumCP+1):
NumSubc;
SymCP=[SymIFFT(RowPrefix,:
SymIFFT];
%Gothroughthechannel%
SymCP(NumSubc+NumCP,NumLoop);
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'
AWGNmeasures
%thesignalpowerbeforeaddingnoise.
%---------------------------------------------------------------------
%Y=AWGN(X,SNR,SIGPOWER,STATE)resetsthestateofRANDNtoSTATE.
%
%Y=AWGN(...,POWERTYPE)specifiestheunitsofSNRandSIGPOWER.
%POWERTYPEcanbe'
db'
or'
linear'
.IfPOWERTYPEis'
thenSNR
%ismeasuredindBandSIGPOWERismeasuredindBW.IfPOWERTYPEis
thenSNRismeasuredasaratioandSIGPOWERismeasured
%inWatts.
%Example:
TospecifythepowerofXtobe0dBWandaddnoisetoproduce
%anSNRof10dB,use:
%X=sqrt
(2)*sin(0:
pi/8:
6*pi);
%Y=AWGN(X,10,0);
TospecifythepowerofXtobe0dBW,setRANDNtothe1234th
%stateandaddnoisetoproduceanSNRof10dB,use:
%Y=AWGN(X,10,0,1234);
TospecifythepowerofXtobe3Wattsandaddnoiseto
%producealinearSNRof4,use:
%Y=AWGN(X,4,3,'
TocauseAWGNtomeasurethepowerofX,setRANDNtothe
%1234thstateandaddnoisetoproducealinearSNRof4,use:
%Y=AWGN(X,4,'
1234,'
%RemoveGuardIntervals%
SymCh(1,(NumSubc+NumCP)*NumLoop);
SymDeCP(NumSubc,NumLoop)
SymDeCP=zeros(NumSubc,NumLoop);
SymDeCPtmp=reshape(SymCh,NumSubc+NumCP,NumLoop);
SymDeCP=SymDeCPtmp((NumCP+1+SyncDelay):
NumAddPrefix+SyncDelay,:
%FFT%
SymDeCP(NumSubc,NumLoop);
SymFFT(NumSubc,NumLoop)
SymFFT=fft(SymDeCP,NumSubc,1);
%MakeDecision(IncludeDeQAM)%
%SymFFT(NumSubc,NumLoop);
SymDec(NumSubc,NumLoop)
SymDec=zeros(NumSubc,NumLoop);
SymEqtmp(1,:
)=SymFFT(1,:
)+i*SymFFT(NumSubc/2+1,:
SymEqtmp(2:
)=SymFFT(2:
form=1:
NumLoop
forn=1:
NumSubc/2
Real=real(SymEqtmp(n,m));
Imag=imag(SymEqtmp(n,m));
if(abs((Real-1))<
abs((Real+1)))
SymDec(2*n-1,m)=1;
else
SymDec(2*n-1,m)=0;
end
if(abs((Imag-1))<
abs((Imag+1)))
SymDec(2*n,m)=1;
SymDec(2*n,m)=0;
%Testbylavabin
%AnotherwaytoDeQAM
%QAMTable=[-1-i-1+i1-i1+i];
TestSymDec=zeros(NumSubc,NumLoop);
TestSymEqtmp(1,:
TestSymEqtmp(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));
[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;
case3
min_ddd(2*ii-1)=1;
case4
otherwise
fprintf('
Impossibleerror!
!
\n\n'
%%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;
ifmin_ddd==BitsRx
DeQAMtwowaysthesameresults\n\n'
DeQAMtwowaysthedifferentresults'
figure
(1);
subplot(2,1,1);
semilogy(BerSnrTable(:
1),BerSnrTable(:
2),'
o-'
subplot(2,1,2);
3),'
%--------------------------------------------