mgenstructupdl.m
来自「OFDMA 物理层开发的matlab 源码.飞思卡尔提供.对物理层开发的工程师有」· M 代码 · 共 133 行
M
133 行
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Property of Freescale
% Freescale Confidential Proprietary
% Freescale Copyright (C) 2006 All rights reserved
% ----------------------------------------------------------------------------
% $RCSfile: mGenStructUPDL.m.rca $
% $Revision: 1.3 $
% $Date: Wed Nov 8 11:39:11 2006 $
% Target: Matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% For WiMAX 802.16 OFDMA, generate Matlab control structures to target
% control structures for UP DL CC Manager
%
% [UPDLCCMgr_byte] =
% mGenStructUPDL(RandFlag,Boosting,BlkSize,PaddedBlkSize,CodeType,PunctureingMode,ModulationMode)
%
% input : Matlab control structures
% BufIn : input burst buffers
%
% output: Target control structures
% (binary file format, big endian)
% BufOut: Concatenated and aligned input burst buffers
%
% Matlab 7 R14 SP2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [UPDLCCMgr_byte DLCbAllocCtrl_byte] = mGenStructUPDL(BurstD,BeforePadBlkSize,PadedBlkSize,NumCodeBlks,BurstNumSlots,ZoneD)
CbStartOffset=0;
UPDLCCMgr=[];
DLCbAllocCtrl=[];
for b=1:size(BurstD,2)
RandFlag=BurstD(b).IUC;
%Randomization is not applied for FCH
if RandFlag~=255
RandFlag=1;%randomizer enabled
else
RandFlag=0;%randomizer disabled
end
% SlotVecOffset=BurstD(b).SymOff/ZoneD.Type;
% SubChanOffset=BurstD(b).SubchOff;
for bl=1:NumCodeBlks(b)
%subframe descriptor
temp = [ ... % structure contains 9 bytes
struct('Name', 'ucRandFlag' ,'Val', uint8(RandFlag)),...
struct('Name', 'ucBoosting' ,'Val', uint8(BurstD(b).Boosting)),...
struct('Name', 'usiCodeBlockSize' ,'Val', uint16(BeforePadBlkSize(b,bl))),...
struct('Name', 'usiCodeBlockSizePadded' ,'Val', uint16(PadedBlkSize(b,bl))),...
struct('Name', 'eCodeType' ,'Val', int8(BurstD(b).FECType)),...
struct('Name', 'ePunctureingMode' ,'Val', int8(BurstD(b).PunctMode)),...
struct('Name', 'eModulationMode' ,'Val', int8(BurstD(b).ModMode))];
UPDLCCMgr = [UPDLCCMgr ,temp];
if BurstD(b).IUC~=254
SlotVecOffset=BurstD(b).SymOff/ZoneD.Type+floor(sum(BurstNumSlots(b,1:bl-1))/BurstD(b).NumSubch);
SubChanOffset=BurstD(b).SubchOff+mod(sum(BurstNumSlots(b,1:bl-1)),BurstD(b).NumSubch);
else
SlotVecOffset=BurstD(b).SymOff/ZoneD.Type+floor(sum(BurstNumSlots(b,1:bl-1))/ZoneD.NumSubch);
SubChanOffset=BurstD(b).SubchOff+mod(sum(BurstNumSlots(b,1:bl-1)),ZoneD.NumSubch);
end
if BurstD(b).IUC==254 || BurstD(b).IUC==255
SubChanLowerBound=0;
SubChanUpperBound=ZoneD.NumSubch;
else
SubChanLowerBound=BurstD(b).SubchOff;
SubChanUpperBound=BurstD(b).SubchOff+BurstD(b).NumSubch;
end
%stDLCbAllocCtrl descriptor
temp = [ ... % structure contains 16 bytes
struct('Name', 'usiCbStartOffset' ,'Val', uint16(CbStartOffset)),...
struct('Name', 'usiNumSlots' ,'Val', uint16(BurstNumSlots(b,bl))),...
struct('Name', 'ucSubChanLowerBound' ,'Val', uint8(SubChanLowerBound)),...
struct('Name', 'ucSubChanUpperBound' ,'Val', uint8(SubChanUpperBound)),...
struct('Name', 'ucSlotVecOffset' ,'Val', uint8(SlotVecOffset)),...
struct('Name', 'ucSubChanOffset' ,'Val', uint8(SubChanOffset)),...
struct('Name', 'ucRepCodingInfo' ,'Val', uint8(BurstD(b).R)),...
struct('Name', 'ucMaxNumSubChan' ,'Val', uint8(ZoneD.NumSubch)),...
struct('Name', 'ucReserved' ,'Val', uint8(zeros(6,1)))...
];
DLCbAllocCtrl = [DLCbAllocCtrl ,temp];
CbStartOffset=CbStartOffset+BeforePadBlkSize(b,bl);
end
end
UPDLCCMgr_byte = ConvertStruct(UPDLCCMgr);
DLCbAllocCtrl_byte = ConvertStruct(DLCbAllocCtrl);
% UPDLCCMgr_byte = (UPDLCCMgr);
% DLCbAllocCtrl_byte = (DLCbAllocCtrl);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Out] = ConvertStruct(In)
% concatenate all structure elements in big-endian format
Out=[];
for k=1:length(In),
switch class(In(k).Val)
case 'uint8'
val = In(k).Val;
case 'int8'
base = 256;
val = uint8(mod(double(In(k).Val)+base,base)); %make unsigned
case 'uint16'
val = In(k).Val;
val = uint8(bitand([bitshift(val,-8);val],255));
case 'int16'
base = 65536;
val = uint16(mod(double(In(k).Val)+base,base)); %make unsigned
val = uint8(bitand([bitshift(val,-8);val],255));
case 'uint32'
val = In(k).Val;
val = uint8(bitand([bitshift(val,-24);bitshift(val,-16);...
bitshift(val,-8) ;val],255));
case 'int32'
base = 4294967296;
val = uint32(mod(double(In(k).Val)+base,base)); %make unsigned
val = uint8(bitand([bitshift(val,-24);bitshift(val,-16);...
bitshift(val,-8) ;val],255));
otherwise
error('Error: Class not supported.');
end %switch
Out = [Out;val];
end %for
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?