?? data_region.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 + -