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

📄 data_region.m

📁 基本的WIMAX802.16d MAC层的实现
💻 M
字号:
function [data_matrix] = data_region (Amount_data_users, Segment_users);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                        %
%%        File: data_region.m                                             %
%%                                                                        %
%%        Input:                                                          % 
%%          Data_users = Matrix where we've the users data to transmit    %  
%%          Segment_users = We've to know in which segment we've to put   %
%%            each user.                                                  %
%%                                                                        %
%%        Mean data on the mapping_matrix:                                %
%%            0  --> No info on subcarriers                               %
%%            -1 --> Preamble or control data.                            %
%%            -2 --> DL MAP and UL MAP                                    %
%%            1..N_users --> User data.                                   %
%%                                                                        %
%%        Output : A Matrix where we can see what is going to be          %
%%        transmitted by each user.                                       %
%%                                                                        %   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% We've to know how many users are on the system.
N_users = length(Segment_users);

% Iniciate the whole matrix.
data_matrix = zeros(60,15);  % 60 subchannel, 15 OFDMA symbols

% I know the first OFDMA symbol is the preamble so...
data_matrix (:,1) = -1;

% Here, we should to complete the FCH and DL-MAP and UL-MAP. Actually we
% fill it with '-2' for example.
data_matrix (:,2:3) = -2;

% We know the amount of data to transmit. We know how many bits we could
% fill in each segment = 20 subchannel*24 data_subcarriers = 480 symbols
% So, if we vahe 12 OFDMA symbols --> we could transmit 480*12 = 5760
% symbols on each segment.
Symbols_free_segment0 = 5760;
Symbols_free_segment1 = 5760;
Symbols_free_segment2 = 5760;

% We consider we have QoS, so We are going to transmit in order. First
% user1, then user2 and so on...
% Before that, I want to know how many users has to transmit on each segment.
% We need to know how we can put the next user symbols too. 
% Firstly we'll put them into the first empty slot.
No_users_segment0 = 0;
No_users_segment1 = 0;
No_users_segment2 = 0;
for i=1:N_users
    switch Segment_users(i)
        case 0
            No_users_segment0 = No_users_segment0 + 1;
            Index_segment0 = [1,4];
        case 1
            No_users_segment1 = No_users_segment1 + 1;
            Index_segment1 = [21,4];
        case 2
            No_users_segment2 = No_users_segment2 + 1;
            Index_segment2 = [41,4];
    end
end

% I map the users onto the matrix...
 for i=1:N_users
     data_user = Amount_data_users(i);
     Be_different = 0; 
     % We have to know how many symbols are free at this moment.
     switch Segment_users(i)
         case 0
             Free_this_user = Symbols_free_segment0 / No_users_segment0;
             Index_segment = Index_segment0;
         case 1
             Free_this_user = Symbols_free_segment1 / No_users_segment1;
             Index_segment = Index_segment1;
         case 2
             Free_this_user = Symbols_free_segment2 / No_users_segment2;
             Index_segment = Index_segment2;
     end
                 
     times = 0;
     while data_user > Free_this_user  % We have to split the INFO
         data_user = data_user/2;
         times = times + 1;        
         % Its mean we have 'data_user*(2^times)' data user. We'll use
         % this later...If we want to fill the matrix completely.
     end

     % We've to know how many subcarriers are going to be occupied.
     % We divide by 24 because an slot has 24 data subcarriers on
     % it. We cannot forget the pilot subcarriers...
     No_subchannels = 20;
     No_subcarriers = ceil (data_user / (24*No_subchannels));

     % No_subcarriers has to be an even number !!!
     if mod(No_subcarriers,2)  % If No_subcarriers is an odd number 
         No_subchannels = No_subchannels - ceil(No_subchannels/No_subcarriers);
         No_subcarriers = No_subcarriers + 1;
     end

    % I want to use the most amount of subcarriers possible and I don't
    % wnat to use more subcarriers than necessary.
    % These values tell me how big is the new data area!!!

    Be_different = data_user - (No_subcarriers*No_subchannels*24);
    No_subchannels_2 = 0;
    No_subcarriers_2 = 0;

    if Be_different > 0                            % I have to use more subcarriers.
        delete = 0;
        Number_carriers = ceil (Be_different/24);
        if mod(Number_carriers,2)
            Number_carriers = Number_carriers + 1;
        end
    elseif Be_different < 0                        % I have to delete some subcarriers.
        delete = 1;
        Number_carriers = floor (abs(Be_different)/24);
        if mod(Number_carriers,2)
            Number_carriers = Number_carriers - 1;
        end
    end
        
    while Number_carriers > 0                       % I calculate the new map zone.
        No_subcarriers_2 = No_subcarriers_2 + 1;
        if No_subcarriers_2 == No_subcarriers;
            No_subchannels_2 = No_subchannels_2 + 1;
            No_subcarriers_2 = 0;
        end
        Number_carriers = Number_carriers - 1;
    end
    
    % We know the data shape and we have the parameters (subcarriers and channel), so we are ready
    % to map users onto the matrix
    data_matrix(Index_segment(1,1):Index_segment(1,1)+No_subchannels-1,...
        Index_segment(1,2):Index_segment(1,2)+No_subcarriers-1) = i;
         
    % Now I've to plot the different subcarriers on the new zone that is indicated by No_subcarriers_2 and
    % No_cubchannels_2 parameters.

    if delete
        while (No_subchannels_2 >= 1)
            data_matrix(Index_segment(1,1)+No_subchannels-1,...
                Index_segment(1,2):Index_segment(1,2)+No_subcarriers-1) = 0;
            No_subchannels_2 = No_subchannels_2 -1 ;
            No_subchannels = No_subchannels - 1;
        end
        data_matrix(Index_segment(1,1)+No_subchannels-1,...
            Index_segment(1,2):Index_segment(1,2)+No_subcarriers_2-1) = 0;
    else
        while (No_subchannels_2 >= 1)
            data_matrix(Index_segment(1,1)+No_subchannels,...
                Index_segment(1,2):Index_segment(1,2)+No_subcarriers-1) = i;
            No_subchannels_2 = No_subchannels_2 -1 ;
            No_subchannels = No_subchannels + 1;
        end
        data_matrix(Index_segment(1,1)+No_subchannels,...
            Index_segment(1,2):Index_segment(1,2)+No_subcarriers_2-1) = i;
    end
         
    Symbols_used = No_subcarriers*No_subchannels*24;
    switch Segment_users(i)
        % I need to update the next Index_segment and the number of Symbols
        % free
        case 0
            next_segment0 = Index_segment0(1,2) + No_subcarriers;
            Index_segment0(1,2) = next_segment0;
            Symbols_free_segment0 = Symbols_free_segment0 - Symbols_used;
        case 1
            next_segment1 = Index_segment1(1,2) + No_subcarriers;
            Index_segment1(1,2) = next_segment1;
            Symbols_free_segment1 = Symbols_free_segment1 - Symbols_used;
        case 2
            next_segment2 = Index_segment2(1,2) + No_subcarriers;
            Index_segment2(1,2) = next_segment2;
            Symbols_free_segment2 = Symbols_free_segment2 - Symbols_used;
    end
    
    
    %% HERE WE SHOULD FILL EVERY FREE SLOT, But I haven't got enough time.
    %% Sorry about it....At first this routine works, but I know that it
    %% has very errors....Sorry again.
    
 end






⌨️ 快捷键说明

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