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

📄 mdltablegen.m

📁 OFDMA 物理层开发的matlab 源码.飞思卡尔提供.对物理层开发的工程师有帮助!
💻 M
字号:
%***************************************************************************
%  802.16-2004 OFDMA PHY - mGenDlTable function
%
%           [DlCarrierMap] = mGenDlTable(ZoneConfig, AsyncPhyControl)
%
%    Description: This functions generates the carrier scrambling
%                 table, that enables translation from logical to physical
%                 carrier numbers.
%
%    Input:
%           ZoneConfig: Data Structure that contains zone configuration
%                       params, including number of carriers, number of
%                       used carriers, maximum number of subchanels, etc.
%                       For details please see WiMAX Integration Framework
%                       Specification document
%           AsyncPhyControl:Asynchronous PHY control data structure
%                       contains info such as DlPremableBase IdCell, etc.
%
%    Output:
%           DlCarrierMap: Map for data carriers within OFDMA symbol, that
%                       enables translation of the physical carrier numbers
%                       into the logical carrier numbers.
%
%    Functions:
%                N/A
%
%    Data Files:
%                N/A
%
%***************************************************************************

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Property of Freescale
%  Freescale Confidential Proprietary
%  Freescale Copyright (C) 2005 All rights reserved
%  ----------------------------------------------------------------------------
%  $RCSfile: mDlTableGen.m.rca $
%  $Revision: 1.4 $
%  $Date: Fri Dec 15 04:48:22 2006 $
%  Target: Matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


function [DlCarrierMap] = mGenDlTable(ZoneConfig, AsyncPhyControl)

%PUSC DL Table calculation
if (ZoneConfig.ZoneType==2)
    % assign renumbering sequence and groups, which are FFT size dependent
    switch ZoneConfig.NFFT
        case 2048
            RenumberingSeq  = ...
                [  6,108, 37, 81, 31,100, 42,116, 32,107,...
                30, 93, 54, 78, 10, 75, 50,111, 58,106,...
                23,105, 16,117, 39, 95,  7,115, 25,119,...
                53, 71, 22, 98, 28, 79, 17, 63, 27, 72,...
                29, 86,  5,101, 49,104,  9, 68,  1, 73,...
                36, 74, 43, 62, 20, 84, 52, 64, 34, 60,...
                66, 48, 97, 21, 91, 40,102, 56, 92, 47,...
                90, 33,114, 18, 70, 15,110, 51,118, 46,...
                83, 45, 76, 57, 99, 35, 67, 55, 85, 59,...
                113, 11, 82, 38, 88, 19, 77,  3, 87, 12,...
                89, 26, 65, 41,109, 44, 69,  8, 61, 13,...
                96, 14,103,  2, 80, 24, 112, 4, 94, 0 ];
            Group  =  [zeros(1,24) ones(1,16) 2*ones(1,24) 3*ones(1,16) 4*ones(1,24) 5*ones(1,16)];
            PermSeqEven = [6,9,4,8,10,11,5,2,7,3,1,0];
            PermSeqOdd  = [7,4,0,2,1,5,3,6];
        case 1024
            RenumberingSeq  = ...
                [  6, 48, 37, 21, 31, 40, 42, 56, 32, 47,...
                30, 33, 54, 18, 10, 15, 50, 51, 58, 46,...
                23, 45, 16, 57, 39, 35,  7, 55, 25, 59,...
                53, 11, 22, 38, 28, 19, 17,  3, 27, 12,...
                29, 26,  5, 41, 49, 44,  9,  8,  1, 13,...
                36, 14, 43,  2, 20, 24, 52,  4, 34, 0 ];
            Group  =  [zeros(1,12) ones(1,8) 2*ones(1,12) 3*ones(1,8) 4*ones(1,12) 5*ones(1,8)];
            PermSeqEven  = [3,2,0,4,5,1];
            PermSeqOdd  =  [3,0,2,1];
        case 512
            RenumberingSeq  = ...
                [12, 13, 26,  9,  5, 15, 21,  6, 28,  4,...
                2,  7, 10, 18, 29, 17, 16,  3, 20, 24,...
                14,  8, 23,  1, 25, 27, 22, 19, 11,  0];
            Group  =  [zeros(1,10)  2*ones(1,10)  4*ones(1,10)];
            PermSeqEven = [4,2,3,1,0];
            PermSeqOdd  = [];
        case 128
            RenumberingSeq = [2, 3, 1, 5, 0, 4];
            Group  =  [zeros(1,2)  2*ones(1,2)  4*ones(1,2)];
            PermSeqEven = [0,1];
            PermSeqOdd  = [];
        otherwise
            disp('Error: FFT size not supported (see ZoneConfig)');
    end

    % subcarrier scrambling within group
    NsubchEven  = length(PermSeqEven);
    NsubchOdd   = length(PermSeqOdd);

    % generates n(s,k), s = 0...Nsubch-1
    for k = 0:23
        nkEven(k+1,:)  = mod((k+13.*(0:NsubchEven-1)),24);
        nkOdd(k+1,:)   = mod((k+13.*(0:NsubchOdd-1)),24);
    end

    % generates p(s), s = 0...Nsubch-1
    for k=1:NsubchEven
        pEven(:,k)  = [PermSeqEven(k:end) PermSeqEven(1:k-1)]';
    end
    for k=1:NsubchOdd
        pOdd(:,k)  = [PermSeqOdd(k:end) PermSeqOdd(1:k-1)]';
    end

    % generates subcarrier mapping
    for k=1:24
        for s=1:NsubchEven
            subcarrierEven(k,s) = ...
                NsubchEven*nkEven(k,s) ...
                + mod((pEven(1+mod(nkEven(k,s),NsubchEven),s)+ AsyncPhyControl.DlPermBase),NsubchEven);
        end
        for s=1:NsubchOdd
            subcarrierOdd(k,s)  = ...
                NsubchOdd*nkOdd(k,s) ...
                + mod((pOdd(1+mod(nkOdd(k,s),NsubchOdd),s)+ AsyncPhyControl.DlPermBase),NsubchOdd);
        end
    end


    if (ZoneConfig.NFFT == 512) | (ZoneConfig.NFFT == 128)
        %only even groups for FFT-128 and FFT-512
        subcarrierEvenV = reshape(subcarrierEven,NsubchEven*24,1);
        subcarrierOddV  = [];
        %subcarrier scrambling
        subcarrierEvenScrambled = (0:NsubchEven*24-1)';
        subcarrierEvenScrambled(subcarrierEvenV+1) = subcarrierEvenScrambled;
        subcarrierOddScrambled = [];
    else
        %even and odd groups for FFT-1024 and FFT-2048
        subcarrierEvenV = reshape(subcarrierEven,NsubchEven*24,1);
        subcarrierOddV  = reshape(subcarrierOdd,NsubchOdd*24,1);
        %subcarrier scrambling
        subcarrierEvenScrambled = (0:NsubchEven*24-1)';
        subcarrierEvenScrambled(subcarrierEvenV+1) = subcarrierEvenScrambled;
        subcarrierOddScrambled = (0:NsubchOdd*24-1)';
        subcarrierOddScrambled(subcarrierOddV+1) = subcarrierOddScrambled;
    end

    %concatenate all groups
    LogClusterOrder = [subcarrierEvenScrambled; subcarrierOddScrambled+NsubchEven*24];
    LogClusterOrder = [ LogClusterOrder;...
        LogClusterOrder+(NsubchEven+NsubchOdd)*24;...
        LogClusterOrder+(NsubchEven+NsubchOdd)*48 ];

    %format one cluster per column (logical oder)
    LogClusterOrder = reshape(LogClusterOrder,12,ZoneConfig.NCluster);

    %cluster permutation
    LogCluster = RenumberingSeq(1+mod(((0:ZoneConfig.NCluster-1)+13*AsyncPhyControl.DlPermBase),ZoneConfig.NCluster));

    %column vector in physical carrier order with the corresponding logical carrier index
    DlCarrierMap = reshape(LogClusterOrder(:,LogCluster+1), 12*ZoneConfig.NCluster, 1);

elseif (ZoneConfig.ZoneType==1)
    %FUSC DL Table calculation
    Nsubchannel=ZoneConfig.MaxSubch;
    Nsubcarrier=ZoneConfig.CarrierPerSubch;
    switch ZoneConfig.NFFT
        case 512
            PermSeq=[2,0,1,6,4,3,5,7];
        case 1024
            PermSeq=[6,14,2,3,10,8,11,15,9,1,13,12,5,7,4,0];
        otherwise
            disp(sprintf('FFT size %d is not supported by mDLTableBen',ZoneConfig.NFFT));
    end
    % DlPermBase=0;
    DlPermBase=AsyncPhyControl.DlPermBase;

    subcarrier=zeros(Nsubcarrier,Nsubchannel);

    for k = 0:Nsubcarrier-1
        nk(k+1,:)  = mod((k+13.*(0:Nsubchannel-1)),Nsubcarrier);
    end

    for s=1:Nsubchannel
        p(:,s)  = [PermSeq(s:end) PermSeq(1:s-1)]';
    end

    for k=1:Nsubcarrier
        for s=1:Nsubchannel
            subcarrier(k,s) = ...
                Nsubchannel*nk(k,s) ...
                + mod((p(1+mod(nk(k,s),Nsubchannel),s)+ DlPermBase),Nsubchannel);
        end
    end

    subcarrierV = reshape(subcarrier,[],1);
    %subcarrier scrambling
    subcarrierScrambled = (0:Nsubchannel*Nsubcarrier-1)';
    subcarrierScrambled(subcarrierV+1) = subcarrierScrambled;

    DlCarrierMap=subcarrierScrambled;
end

⌨️ 快捷键说明

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