No BSD License  

Highlights from
IEEE 802.11a WLAN model

image thumbnail

IEEE 802.11a WLAN model

by

 

03 Jun 2003 (Updated )

IEEE 802.11a WLAN physical layer model, with demonstration of adaptive modulation and coding.

IEEE80211a_udg(t, x, u, varargin)
function [sys, x0, str, ts] = IEEE80211a_udg(t, x, u, varargin)
% IEEE80211a_UDG  User-defined graphics for IEEE 802.11a model.
% Plot data u in MATLAB figure.
% u is assumed to be Nx2; first column real-part, second column imag-part.
% Can also pass additional parameters to plot function

switch varargin{1}
    case 3
        sys = [];  % mdlOutput - unused
    case 2
        sys = mdlUpdate(t, x, u, varargin{:});
    case 0
        [sys, x0, str, ts] = mdlInitializeSizes;
    case 9
        sys=mdlTerminate;
    otherwise
        feval(varargin{:});
end


% -----------------------------------------------------------
function [sys, x0, str, ts] = mdlInitializeSizes

blk = get_param(gcb, 'parent');

sizes = simsizes;
sizes.NumInputs      = -1;
sizes.NumOutputs     =  0;
sizes.NumSampleTimes =  1;
sys = simsizes(sizes);
x0  = [];           % states
str = '';           % state ordering strings
ts  = [-1 1];       % inherited sample time, fixed in minor steps

% initialize block data
bd = get_param(blk, 'userdata');
bd.firstcall = true;
bd.figTag = blk;
bd.graphicsName = get_param(blk, 'graphicsName');
bd.plotFcnHandle = str2func(bd.graphicsName);
bd.cellArrayMode = strcmp(get_param(blk, 'convertMode'), 'cell array');
set_param(blk, 'userdata', bd);


% ------------------------------------------------------------
function sys = mdlUpdate(t, x, u, flag, params)

% Faster implementation of: blk=gcb;
cs   = get_param(0, 'CurrentSystem');
cb   = get_param(cs, 'CurrentBlock');
sfcn = [cs '/' cb];
blk  = get_param(sfcn, 'parent');
sys  = [];

bd = get_param(blk, 'userdata');

% Need to check for figure every update
bd.fig = findobj('type', 'figure', 'tag', bd.figTag);

if isempty(bd.fig)
    % figure is not open
    
    bd.firstcall = true;
    
else
    % figure is open

    if bd.firstcall
        % get axes handles
        [bd.axes, bd.multiple_axes] = get_axes_handles(bd.fig);
    end
    
    [M, N] = size(u);
    u_complex = u(:, 1:N/2) + j*u(:, N/2+1:N);
    
    input_names = params{1};
    other_params = params{2:length(params)};
    other_params_exist = ~isempty(other_params);
    plot_data = convert_simulink_vector(u_complex, input_names, bd.cellArrayMode);
    
    if other_params_exist
        feval(bd.plotFcnHandle, plot_data, bd.axes, bd.firstcall, other_params);
    else
        feval(bd.plotFcnHandle, plot_data, bd.axes, bd.firstcall)
    end
    
    bd.firstcall = false;

end

set_param(blk, 'userdata', bd);

% ---------------------------------------------------------------
function sys = mdlTerminate
sys = [];

%--------------------------------------------------------------------------
function data = convert_simulink_vector(u, input_names, cellArrayMode);
% CONVERT_SIMULINK_VECTOR
%
% u: Nx1 input vector, containing data corresponding to multiple matrices
%    (see format below)
% input_names: cell array containing names (strings) of the above matrices
%
% u uses format [s1; v1; s2; v2; s2; v3; ...]
% where sn is a scalar, and vn is a (sn x 1) vector
% The nth name in input_names corresponds to vector vn

num_inputs = length(input_names);
if num_inputs == 1
    data = u(2:end, :);
    return
end

length_u = length(u);

if cellArrayMode
    data = cell(1, num_inputs);
else
    data = cell2struct(cell(1, num_inputs), input_names, 2);
end

idx = 1;
for i = 1:num_inputs
    L = u(idx);
    v = u(idx+1 : idx+L, :);
    if cellArrayMode
        data{i} = v;
    else
        data = setfield( data, input_names{i}, v );
    end
    idx = idx + L + 1;
end

%--------------------------------------------------------------------------
function [haxes, multi] = get_axes_handles(fig);
% returns axes handles
% if there is only one axes, axes is a handle
% if more, axes is a structure of handles, with fieldnames corresponding to
% axes tags.
% multi: true if more than one axes
c = get(fig, 'children');
multi = (length(c)>1);
if ~multi
    haxes = c;
else
    t = get(c, 'tag');
    h = num2cell(c);
    x = [t(:).'; h(:).'];
    haxes = struct(x{:});
end

Contact us