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 + -
显示快捷键?