📄 test.asv
字号:
% main function of OFDM transmitt
% finish time:
% 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,:));
%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))];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -