160 lines
5.6 KiB
Matlab
160 lines
5.6 KiB
Matlab
function showResourceMatrix(cfgHE,cfgUI,RU_index,varargin)
|
||
% **输入:含有RU分配信息的HE结构体、来自UI的额外控制参数
|
||
% **输出:含有'时间*频率*用户'三维的资源分配示意图
|
||
|
||
% 获取RU分配信息
|
||
if cfgUI.numUsers == 1
|
||
cfgHE = wlanHEMUConfig(RU_index);
|
||
end
|
||
|
||
allocInfo = ruInfo(cfgHE);
|
||
|
||
% 画布初始化
|
||
if nargin == 3
|
||
% fig = figure('Name',getString(message('wlan:hePlotAllocation:FigureTitle')));
|
||
fig = figure('visible','off');
|
||
ax = axes(fig);
|
||
else
|
||
ax = varargin{1};
|
||
end
|
||
cla(ax,'reset')
|
||
|
||
% 绘图参数
|
||
dpi = 96;
|
||
cbw = wlan.internal.cbwStr2Num(cfgHE.ChannelBandwidth);
|
||
Nfft = cbw/20*256;
|
||
isHETBNDP = isa(cfgHE,'wlanHETBConfig') && cfgHE.FeedbackNDP;
|
||
centerColor = [1 0 0; 0.5 0 0; 0.25 0 0]; % Colors for special split RUs
|
||
|
||
% infoLims contains tuples of channel bandwidth and the minimum RU size for
|
||
% which RU information is to be displayed on a patch: [cbw rusize].
|
||
% tuple中记录给定带宽下可分配的最小RU大小
|
||
infoLims = ...
|
||
[20 26; ...
|
||
40 52; ...
|
||
80 106; ...
|
||
160 242 ];
|
||
|
||
% 构建sequencial allocation matrix
|
||
time_sequence_len = length(cfgUI.user1.t);
|
||
frequency_sequence_len = length(cfgUI.user1.f);
|
||
allo_sequencial=zeros(time_sequence_len,frequency_sequence_len,cfgUI.numUsers);
|
||
for t = 1 : time_sequence_len
|
||
for f = 1 : frequency_sequence_len
|
||
for n = 1 : cfgUI.numUsers
|
||
if n == 1
|
||
if cfgUI.user1.t(t) == 1 && cfgUI.user1.f(f) == 1
|
||
allo_sequencial(t,f,n) = 1;
|
||
end
|
||
elseif n == 2
|
||
if cfgUI.user2.t(t) == 1 && cfgUI.user2.f(f) == 1
|
||
allo_sequencial(t,f,n) = 1;
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
% Plot the HE occupied subcarriers
|
||
kRUPuncture = wlan.internal.hePuncturedRUSubcarrierIndices(cfgHE);
|
||
bi = 1;
|
||
icenter = 1;
|
||
startEndIdx = zeros(0,2);
|
||
hRU = gobjects(allocInfo.NumRUs,2); % At most 2 patches per RU
|
||
|
||
% 共有5个时隙,每个时隙都将相同的RU资源块分配给固定的几个用户
|
||
for seq = 1:size(allo_sequencial,1)
|
||
i_accu = 0;
|
||
for i = 1:allocInfo.NumRUs
|
||
% Get the active subcarrier indices for the RU
|
||
% 可用子载波序号
|
||
if isHETBNDP
|
||
kFull = wlan.internal.heTBNDPSubcarrierIndices(cbw,cfgHE.RUToneSetIndex,cfgHE.FeedbackStatus);
|
||
else
|
||
kFull = wlan.internal.heRUSubcarrierIndices(cbw,allocInfo.RUSizes(i),allocInfo.RUIndices(i));
|
||
end
|
||
if ~isempty(kRUPuncture)
|
||
k = setdiff(kFull,kRUPuncture); % Discard punctured subcarriers
|
||
else
|
||
k = kFull;
|
||
end
|
||
|
||
|
||
|
||
% 配置patch的颜色和说明文字
|
||
UserIndex = 'User #';
|
||
colorToUse = 0;
|
||
firstUser = 0;
|
||
for n = 1 : cfgUI.numUsers
|
||
if allo_sequencial(seq,i + i_accu,n) == 1
|
||
if colorToUse == 0
|
||
firstUser = n; % 方便后边构建字符:User #a-b
|
||
UserIndex = [UserIndex,num2str(n)];
|
||
end
|
||
colorToUse = colorToUse + n^2;% 使用平方避免颜色重复
|
||
end
|
||
end
|
||
UserInRU = sum(allo_sequencial(seq,i + i_accu,:));% 当前RU中用户总数
|
||
% RU中用户数超过1时,需要额外构造不同形式的字符串
|
||
if UserInRU > 1
|
||
UserIndex = [UserIndex,'-',num2str(firstUser + UserInRU - 1)];
|
||
end
|
||
|
||
|
||
|
||
|
||
% Get the end index of each continuous block of subcarriers within the RU
|
||
% 因为利用patch函数画图,需要以子载波是否连续划分patch
|
||
nonContigEnd = [find(diff(k)~=1); numel(k)];
|
||
startIdx = 1; % The start index of the continuous block of subcarriers
|
||
for j = 1:numel(nonContigEnd)
|
||
% Plot a patch of the continuous block of subcarriers
|
||
blkIdx = startIdx:nonContigEnd(j);
|
||
startEndIdx(bi,:) = [k(blkIdx(1)) k(blkIdx(end))];
|
||
% y = [k(blkIdx(1)) k(blkIdx(end)) k(blkIdx(end)) k(blkIdx(1))];
|
||
% x = [0 0 1.5 1.5 ];
|
||
y = [k(blkIdx(1)) k(blkIdx(end)) k(blkIdx(end)) k(blkIdx(1))];
|
||
x = [0.05+1.6*(seq-1) 0.05+1.6*(seq-1) 1.55+1.6*(seq-1) 1.55+1.6*(seq-1)];
|
||
|
||
|
||
hold(ax,'on');
|
||
startIdx = nonContigEnd(j)+1;
|
||
bi = bi+1;
|
||
|
||
if colorToUse == 0
|
||
hRU(i,j) = patch(ax,x,y,'w');% 无用户使用该RU时填充为白色
|
||
UserIndex = '';
|
||
else
|
||
hRU(i,j) = patch(ax,x,y,colorToUse);% 有用户使用该RU时即使用colorToUse对应的颜色
|
||
end
|
||
|
||
% 标记用户序号
|
||
xMiddle = hRU(i,j).Vertices(1,1)+(hRU(i,j).Vertices(end,1)-hRU(i,j).Vertices(1,1))/2;
|
||
yMiddle = hRU(i,j).Vertices(1,2)+(hRU(i,j).Vertices(2,2)-hRU(i,j).Vertices(1,2))/2;
|
||
htext = text(ax,xMiddle,yMiddle,UserIndex,'HorizontalAlignment','center','FontSize',9);
|
||
htext.PickableParts = 'none';
|
||
end
|
||
|
||
switch length(k)
|
||
case 242
|
||
i_offset = 3;
|
||
case 106
|
||
i_offset = 1;
|
||
case 52
|
||
i_offset = 0;
|
||
end
|
||
i_accu = i_accu + i_offset;
|
||
|
||
end
|
||
end
|
||
% ylabel(ax,getString(message('wlan:hePlotAllocation:SubcarrierIndex')))
|
||
ylabel('Subcarrier Index');
|
||
xticks(ax,[])
|
||
ylim(ax,[-Nfft/2 Nfft/2-1]);
|
||
ax.Box = 'on';
|
||
h = plot(ax,NaN,NaN,'ow'); % Placeholder for empty legend
|
||
print(fig, 'RU_Alloc.png', '-dpng', ['-r', num2str(dpi)]);
|
||
% pause(0.5);
|
||
% close;
|
||
|
||
end |