📄 mupulrxchain.m
字号:
% Uplink Rx (BS) chain of user processing of IEEE 802.16-2004
% (WiMAX, OFDMA only)
%
% [Out] = mUPULRXchain(SlotVecs,ZoneD,BurstD,PilotAmpl,PilotVecs)
%
% This function chains up all the required Matlab functions and
% processes all slots of one burst. After Randomization the decoded data
% is available for further processing in the MAC.
%
% SlotVecs: input matrix, data from FP (complex)
% one column per slot vector, 48*ZoneD.NumSubch rows
% ZoneD : zone descriptor
% BurstD : uplink burst descriptor
% PilotAmpl: original pilot amplitude which is consistent with the distance
% PilotVecs: input matrix, pilots from FP (int16, complex)
% one column per slot vector, 24*ZoneD.NumSubch rows
% If only one values is provided, it gives the average absolute
% pilot amplitude. No channel estimation if matrix is empty .
%
% Out : output vector, payload data for one burst
% (unsigned bytes, values 0 or 255)
%
% Matlab 7 Release 14 SP2
% The communication toolbox is required.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Property of Freescale
% Freescale Confidential Proprietary
% Freescale Copyright (C) 2005 All rights reserved
% ----------------------------------------------------------------------------
% $RCSfile: mUPULRXchain.m.rca $
% $Revision: 1.18 $
% $Date: Mon Jan 22 14:39:04 2007 $
% Target: Matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%-- Matlab files used by this file
% mSlotDemap
% mSlotDeseg
% mDerep
% mDIL
% mDerandomizer
% mCodeBlkDeseg
% mVitDecoder_2x
% mVitDecoder_3x
% mDepuncturing
%-- End of list
% DemapScale set to 'n' means unquant Viterbi
% DemapScale set to 'y' means soft 8 Viterbi
% TC is not compulsory, by default TC=0
% VitMode is not compulsory. Viterbi Mode: '2x' or '3x' (2x by default)
function [Out] = mUPULRXchain(SlotVecs,ZoneD,BurstD,BlkSize,BurstNo,DemapScale,VitMode,AsyncPhyCtrl,TC)
if ~exist('TC')
TC=0; %by default, no TV generation
AsyncPhyCtrl = 'non available';
end
if isreal(SlotVecs) %call the LIB2 function
[Out] = mUPULRXchainLIB2_v2(SlotVecs,BlkSize,BurstD,BurstNo,DemapScale,VitMode,AsyncPhyCtrl,ZoneD,TC);
else %call the original
[Out] = mUPULRXchain_old_v2(SlotVecs,ZoneD,BurstD,PilotAmpl,PilotVecs);
end
if exist('VitMode')==0
VitMode='2x'; %go to 2x by default
end
if ~exist('TC')
TC=0; %by default, no TV generation
end
%TV generation
if TC
% FN=0;%Frame number and Zone number is concidered as 0 for time being
% ZN=0;%Frame number and Zone number is concidered as 0 for time being
FN=AsyncPhyCtrl.FrameNr;
ZN=ZoneD.ZoneNr;
TCstr=sprintf('TC%03d',TC);
if ~exist(['../vector/ref/',TCstr],'dir')
mkdir(['../vector/ref/',TCstr]);
end
blks=size(SlotVecs,2);
for b=1:blks,
%Generation of IF1jRX
%at SBX/SP/UP/DL/SPManager/vector/ref
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../vector/ref/%s/IF1jRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
%at SBX/Manager/UL/DataExtraction/vector/in
if ~exist(['../../../../../Manager/UL/DataExtraction/vector/in/',TCstr],'dir')
mkdir(['../../../../../Manager/UL/DataExtraction/vector/in/',TCstr]);
end
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../../../../../Manager/UL/DataExtraction/vector/in/%s/IF1jRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
%at SBX/Manager/UL/ULCodeBlockSeg/vector/ref
if ~exist(['../../../../../Manager/UL/ULCodeBlockSeg/vector/ref/',TCstr],'dir')
mkdir(['../../../../../Manager/UL/ULCodeBlockSeg/vector/ref/',TCstr]);
end
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../../../../../Manager/UL/ULCodeBlockSeg/vector/ref/%s/IF1jRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
%Generation of IF1jRX and IF1iRX
%at SBX/SP/UP/DL/SPManager/vector/ref
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../vector/ref/%s/IF1iRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
%at SBX/Manager/UL/DataExtraction/vector/ref
if ~exist(['../../../../../Manager/UL/DataExtraction/vector/ref/',TCstr],'dir')
mkdir(['../../../../../Manager/UL/DataExtraction/vector/ref/',TCstr]);
end
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../../../../../Manager/UL/DataExtraction/vector/ref/%s/IF1iRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
%SBX/SP/UP/UL/SPKernel/Derep/vector/in
if ~exist(['../../SPKernel/Derep/vector/in/',TCstr],'dir')
mkdir(['../../SPKernel/Derep/vector/in/',TCstr]);
end
mGenBin(int8(SlotVecs(1:BlkSize(1,b),b)),...
sprintf('../../SPKernel/Derep/vector/in/%s/IF1iRX_%02d_%02d_%02d_%02d.lod',TCstr,FN,ZN,BurstNo,b-1),...
'int8','R');
end
end
function [Out] = mUPULRXchainLIB2_v2(SlotVecs,BlkSize,BurstD,BurstNo,DemapScale,VitMode,AsyncPhyCtrl,ZoneD,TC)
% %slot data & pilot demapping
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [slotdemap_out] = mSlotDemap(SlotVecs.',ZoneD,BurstD);
%
% %slot desegmentation (combine slots to code blocks)
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [slotdeseg_out,BlkSize] = mSlotDeseg(slotdemap_out,BurstD);
%slot derepetition
%%%%%%%%%%%%%%%%%%%
[derep_out,BlkSize] = mDerep(SlotVecs,BlkSize,BurstD.R,BurstD.ModMode);
%deinterleaving
%%%%%%%%%%%%%%%%
[dil_out,BlkSize] = mDIL(derep_out,BlkSize,BurstD.ModMode);
TCstr= [];
%FEC decoding
%%%%%%%%%%%%%%
[FEC_out,BlkSize] = FECDecoder(dil_out,BlkSize,BurstD,TCstr,BurstNo,DemapScale,VitMode,AsyncPhyCtrl,ZoneD,TC);
%de-randomize
%%%%%%%%%%%%%%
[derand_out,BlkSize] = mDerandomizer(FEC_out,BlkSize);
%code block de-segmentation
Out=mCodeBlkDeseg(derand_out,BlkSize);
%Generation of test vectors
if TC
% FN=0;%Frame number and Zone number is concidered as 0 for time being
% ZN=0;%Frame number and Zone number is concidered as 0 for time being
FN=AsyncPhyCtrl.FrameNr;
ZN=ZoneD.ZoneNr;
TCstr=sprintf('TC%03d',TC);
%at SBX/SP/UP/UL/SPKernel/Derep
if ~exist(['../../SPKernel/Derep/vector/ref/',TCstr],'dir')
mkdir(['../../SPKernel/Derep/vector/ref/',TCstr]);
end
if ~exist(['../../SPKernel/DIL/vector/in/',TCstr],'dir')
mkdir(['../../SPKernel/DIL/vector/in/',TCstr]);
end
if ~exist(['../../SPKernel/DIL/vector/ref/',TCstr],'dir')
mkdir(['../../SPKernel/DIL/vector/ref/',TCstr]);
end
if ~exist(['../../SPKernel/DePunct/vector/in/',TCstr],'dir')
mkdir(['../../SPKernel/DePunct/vector/in/',TCstr]);
end
if ~exist(['../../SPKernel/DeRand/vector/ref/',TCstr],'dir')
mkdir(['../../SPKernel/DeRand/vector/ref/',TCstr]);
end
for b=1:size(BlkSize,2)
%Generation of IF1gRX %at SBX/SP/UP/UL/SPKernel/Derep
mGenBin(int8(derep_out(1:BlkSize(1,b),b)),...
sprintf('../../SPKernel/Derep/vector/ref/TC%03d/IF1gRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
%at SBX/SP/UP/DL/SPManager/vector/ref
mGenBin(int8(derep_out(1:BlkSize(1,b),b)),...
sprintf('../vector/ref/TC%03d/IF1gRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
%at SBX/SP/UP/UL/SPKernel/DIL
mGenBin(int8(derep_out(1:BlkSize(1,b),b)),...
sprintf('../../SPKernel/DIL/vector/in/TC%03d/IF1gRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
%Generation of IF1fRX
mGenBin(int8(dil_out(1:BlkSize(1,b),b)),...
sprintf('../../SPKernel/DIL/vector/ref/TC%03d/IF1fRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
mGenBin(int8(dil_out(1:BlkSize(1,b),b)),...
sprintf('../../SPKernel/DePunct/vector/in/TC%03d/IF1fRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
mGenBin(int8(dil_out(1:BlkSize(1,b),b)),...
sprintf('../vector/ref/TC%03d/IF1fRX_%02d_%02d_%02d_%02d.lod',TC,FN,ZN,BurstNo,b-1),...
'int8','R');
%Generation of IF1cRX (before Codeblock desegmentation)
mGenBin(uint8(derand_out(1:BlkSize(1,b),b)),...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -