⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.m

📁 OFDM的PHY发射端matlab实现程序
💻 M
字号:
% main function of OFDM transmitt
% finish time:2005.10.14
% by chaodong
%--------------------------------------------------------
  % Geneate the Preamble
%--------------------------------------------------------
shortseq=shorttraining;                                  % shorttraining sequence
longseq=longtraining;                                    % longtraining  sequence
Preamble=[shortseq(1:160),[shortseq(161)+longseq(1)],...
         longseq(2:length(longseq))];                    % Preamble
%--------------------------------------------------------
  % Geneate the Signal field
%--------------------------------------------------------
Ratein=36;                                          
reservebit=[0];
Length=[0 0 1 0 0 1 1 0 0 0 0 0];
Signal=makesignal(Ratein,reservebit,Length);
%--------------------------------------------------------
  % Signal field 卷积编码
%--------------------------------------------------------
[paraSignalencode,Signalencode]=conv_encoder([Signal.Rate,Signal.Reservebit,...
                                              Signal.Length,Signal.Paritybit,Signal.Tail]);
%--------------------------------------------------------
  % 通过读取rate,得到各项参数
%--------------------------------------------------------
SignalRate=Signal.Rate;
[modutype,encoderate,Nbpsc,Ncbps,Ndbps]=readSiginformation(SignalRate);
%--------------------------------------------------------
  % 此处不需穿孔
%--------------------------------------------------------
%Signalpuncture=puncture(paraSignalencode,Signalencode,encoderate);
%--------------------------------------------------------
  % 进行交织
%--------------------------------------------------------
%Signalinterleaver=interleaver(Nbpsc,Ncbps,,Signalencode);%应该如此调用
Signalinterleaver=interleaver(1,48,Signalencode);
%--------------------------------------------------------
  % 进行BPSK映射,得到频域值
%--------------------------------------------------------
SignalBPSK=modulate(1,Signalinterleaver);
%--------------------------------------------------------
  % 插入载波{-27,-7,7,21},成为pilot subcarriers
%--------------------------------------------------------
P127seq=Psequence;
Di=[0];                                                  % 直流分量
Pilot=exp(j.*[0,0,0,pi]);                                % values{1.0,1.0,1.0,-1.0}
Pilotinsert=P127seq(1).*Pilot;                           % multiply with the first elenment of P0-126
Signal52=[SignalBPSK(1:5),Pilotinsert(1),SignalBPSK(6:18),Pilotinsert(2),...
          SignalBPSK(19:24),Di,SignalBPSK(25:30),Pilotinsert(3),...
          SignalBPSK(31:43),Pilotinsert(4),SignalBPSK(44:48)];  
Signalplus=Signal52(28:53);
Siganlsub=Signal52(1:26);
Signalff=[zeros(1,1),Signalplus,zeros(1,11),Siganlsub];
Signaltt=ifft(Signalff);
%--------------------------------------------------------
  % 插入循环前缀,实现Signal field 的时域表示向量
%--------------------------------------------------------
Signalcyclic=Signaltt(49:64);
Signalfield=[Signalcyclic,Signaltt,Signaltt(1)];
for i=1:81
    if i==1||i==81
        Signalfield(i)=Signalfield(i)*0.5;              % multiply with Window function    
    else
        Signalfield(i)=Signalfield(i);
    end
end
%--------------------------------------------------------
  % 产生Service field 符号 
%--------------------------------------------------------
Servicefield=zeros(1,16);                              % 16 个 zero
%--------------------------------------------------------
  % 产生PSDU Tail bits
%--------------------------------------------------------
PSDUTail=zeros(1,6);                                   % 6 个 zero
%--------------------------------------------------------
  % 产生PSDU Message 800bits
%--------------------------------------------------------
Message=[0 0 1 0 0 0 0 0,0 1 0 0 0 0 0 0,0 0 0 0 0 0 0 0,0 1 1 1 0 1 0 0,...
         0 0 0 0 0 0 0 0,0 0 0 0 0 1 1 0,0 0 0 1 0 0 0 0,1 0 1 1 0 0 1 1,...
         1 1 1 0 1 1 0 0,0 1 1 0 0 1 0 1,0 0 0 0 0 0 0 0,0 0 0 0 0 1 0 0,...
         0 1 1 0 1 0 1 1,1 0 0 0 0 0 0 0,0 0 1 1 1 1 0 0,1 0 0 0 1 1 1 1,...
         0 0 0 0 0 0 0 0,0 0 0 0 0 1 1 0,0 0 0 1 0 0 0 0,1 0 1 1 0 1 0 1,...
         1 1 0 1 1 1 0 0,1 1 1 1 0 1 0 1,0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0,...
         0 1 0 1 0 0 1 0,1 1 1 1 0 1 1 0,1 0 0 1 1 1 1 0,0 0 1 1 0 1 0 0,...
         0 0 0 0 0 1 0 0,0 1 0 0 0 1 1 0,0 1 0 0 1 1 1 0,1 0 0 1 0 1 1 0,...
         1 1 1 0 0 1 1 0,0 0 0 1 0 1 1 0,0 0 1 0 1 1 1 0,0 0 0 0 0 1 0 0,...
         1 1 0 0 1 1 1 0,0 0 0 0 1 1 1 0,1 0 0 0 0 1 1 0,0 1 0 0 1 1 1 0,...
         1 1 0 1 0 1 1 0,0 0 0 0 0 1 0 0,1 1 1 1 0 1 1 0,0 1 1 0 0 1 1 0,...
         0 0 0 0 0 1 0 0,0 0 1 0 0 1 1 0,1 0 0 1 0 1 1 0,0 1 1 0 1 1 1 0,...
         1 0 0 1 0 1 1 0,0 1 1 1 0 1 1 0,1 0 0 1 0 1 1 0,0 0 1 0 1 1 1 0,...
         1 0 0 1 1 1 1 0,0 0 1 1 0 1 0 0,0 1 0 1 0 0 0 0,0 0 1 0 0 0 1 0,...
         1 0 0 0 0 1 1 0,1 0 1 0 1 1 1 0,1 1 1 0 0 1 1 0,0 0 0 1 0 1 1 0,...
         0 0 1 0 1 1 1 0,1 0 1 0 0 1 1 0,0 1 0 0 1 1 1 0,0 0 0 0 0 1 0 0,...
         1 1 1 1 0 1 1 0,0 1 1 0 0 1 1 0,0 0 0 0 0 1 0 0,1 0 1 0 0 0 1 0,...
         0 0 1 1 0 1 1 0,1 0 0 1 1 1 1 0,1 1 0 0 1 1 1 0,1 0 0 1 0 1 1 0,...
         1 0 1 0 1 1 1 0,1 0 1 1 0 1 1 0,0 0 1 1 0 1 0 0,0 1 0 1 0 0 0 0,...
         0 1 1 0 0 0 1 0,1 0 0 1 0 1 1 0,0 1 0 0 1 1 1 0,1 0 1 0 0 1 1 0,...
         1 0 1 1 0 1 0 0,1 0 0 1 0 1 1 0,0 1 1 1 0 1 1 0,1 1 0 0 1 1 1 0,...
         1 0 0 1 0 1 1 0,0 1 0 0 1 1 1 0,1 0 1 0 0 1 1 0,0 0 1 0 0 1 1 0,...
         0 0 0 0 0 1 0 0,1 1 1 0 1 1 1 0,1 0 1 0 0 1 1 0,0 0 0 0 0 1 0 0,...
         0 0 1 0 1 1 1 0,0 1 0 0 1 1 1 0,1 0 1 0 0 1 1 0,1 0 0 0 0 1 1 0,...
         0 1 0 1 1 0 1 1,1 1 1 0 1 0 1 0,1 0 0 1 1 0 0 1,1 0 1 1 0 1 1 1];
 %--------------------------------------------------------
  % 产生Pad bits
 %--------------------------------------------------------
 messagelen=length(Message);
 Nsym=ceil((16+messagelen+6)/Ndbps);
 Ndata=Nsym*Ndbps;
 Npad=Ndata-(16+messagelen+6);                           % number of pad bits
 Padbits=zeros(1,Npad);
 %--------------------------------------------------------
  % 产生DATA field
 %--------------------------------------------------------
 Datafield=[Servicefield,Message,PSDUTail,Padbits];
 %--------------------------------------------------------
  % DATA field Scrambler
 %--------------------------------------------------------
 DataScram=scrambler(Datafield);
 %--------------------------------------------------------
  % PSDU Tail bits 重新赋零
 %--------------------------------------------------------
 DataScrambler=DataScram;
 DataScrambler(817:822)=zeros(1,6);
 %--------------------------------------------------------
  % Coding the DATA bits
 %--------------------------------------------------------
 [Dataconvpara,Dataconvseri]=conv_encoder(DataScrambler);    % 卷积编码
 Datapuncture=puncture(Dataconvpara,Dataconvseri,encoderate);% 穿孔
 %--------------------------------------------------------
  % 分组 ,交织
 %--------------------------------------------------------
 dividenum=length(Datapuncture)/Ncbps;
 for t=1:dividenum
     Datasymbol(t,:)=Datapuncture((t-1)*Ncbps+1:t*Ncbps);
     Datainterleave(t,:)=interleaver(Nbpsc,Ncbps,Datasymbol(t,:));
 end
 %--------------------------------------------------------
  % 映射
 %--------------------------------------------------------
 for ii=1:dividenum
     Datamapping(ii,:)=modulate(modutype,Datainterleave(ii,:));
 end
 %--------------------------------------------------------
  % 插入导频,形成symbols矩阵
 %--------------------------------------------------------
 for jj=1:dividenum
     Pilotdatainsert=P127seq(jj+1).*Pilot;                         % multiply with the second elenment of P0-126
     Data52(jj,:)=[Datamapping(jj,1:5),Pilotdatainsert(1),Datamapping(jj,6:18),Pilotdatainsert(2),...
                   Datamapping(jj,19:24),Di,Datamapping(jj,25:30),Pilotdatainsert(3),...
                   Datamapping(jj,31:43),Pilotdatainsert(4),Datamapping(jj,44:48)]; 
     Datasymplus(jj,:)=Data52(jj,28:53);
     Datasymsub(jj,:)=Data52(jj,1:26);
     Datasymff(jj,:)=[zeros(1,1),Datasymplus(jj,:),zeros(1,11),Datasymsub(jj,:)];
     %Datasymff(jj,:)=[zeros(1,6),Datasymplus(jj,:),Datasymsub(jj,:),zeros(1,6)];
     %Datasymff(jj,:)=[zeros(1,6),Datasymsub(jj,:),Datasymplus(jj,:),zeros(1,6)];
     %Datasymtt(jj,:)=myidft(Datasymff(jj,:),64);
     Datasymtt(jj,:)=ifft(Datasymff(jj,:));
 end
%--------------------------------------------------------
  % 插入循环前缀,加窗,实现Data field Symbols的时域表示向量
%--------------------------------------------------------
 for jt=1:dividenum
     Datasymcyclic(jt,:)=Datasymtt(jt,49:64);
     Datasymfield(jt,:)=[Datasymcyclic(jt,:),Datasymtt(jt,:),Datasymtt(jt,1)];
   for ji=1:81
       if ji==1||ji==81
          Datasymfield(jt,ji)=Datasymfield(jt,ji)*0.5;              % multiply with Window function    
       else
          Datasymfield(jt,ji)=Datasymfield(jt,ji);
       end
   end
 end
%--------------------------------------------------------
  % 把矩阵转换为行向量的帧格式,实现Data field Symbols的时域表示向量
%--------------------------------------------------------
onerowlen=length(Datasymfield(1,:));
for jm=1:dividenum
       if jm==1
          Datasymserilast=Datasymfield(1,1:onerowlen-1);
       elseif jm>=2
          Datasymserilast=[Datasymserilast,...
                           Datasymseri(length(Datasymseri))+Datasymfield(jm,1),...
                           Datasymfield(jm,2:onerowlen-1)];
       end
       Datasymseri=Datasymfield(jm,:);
end 
Datasymserilast=[Datasymserilast,Datasymseri(length(Datasymseri))];
%--------------------------------------------------------
  % constitue the entire Packet
%--------------------------------------------------------
OFDMpacket=[Preamble(1:length(Preamble)-1),[Preamble(length(Preamble))+Signalfield(1)],...
            Signalfield(2:length(Signalfield)-1),...
            [Signalfield(length(Signalfield))+Datasymserilast(1)],...
            Datasymserilast(2:length(Datasymserilast))];
%--------------------------------------------------------
  % end of  the file
%--------------------------------------------------------
 



 
 
 
 
 
         






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -