Генерация кода функций WLAN Toolbox™

В этом примере показано, как сгенерировать файлы MEX, и эффективный код C/C++ для генератора формы волны WLAN Toolbox™ функционируют и проверяют его правильное поведение. Кроме того, это показывает, как работать вокруг ограничений генерации кода для моделей канала WLAN Toolbox. Все функции WLAN Toolbox и Система objects™ поддерживаются для генерации кода C/C++.

Введение

С MATLAB Coder™ можно сгенерировать эффективный, портативный исходный код C, независимые исполняемые файлы и MEX-функции для развертывания в настольных и встраиваемых приложениях. Можно ускорить код MATLAB с помощью MEX-функций или интегрировать сгенерированный исходный код и статические или динамические библиотеки в проекты C/C++ кода. Смотрите Подготовку C или Компилятора C++ (MATLAB Coder) для получения дополнительной информации о том, как настроить компилятор C/C++. Для того, чтобы использовать генерацию кода, вам нужна лицензия MATLAB Coder.

Этот пример использует codegen функция, чтобы сгенерировать код для генератора формы волны WLAN Toolbox и TGax образовывает канал Системный объект. Во-первых, подготовьте необходимые входные параметры генератора формы волны и сконфигурируйте MATLAB Coder, чтобы сгенерировать файлы MEX. Затем сравните выход сгенерированных файлов MEX и оригинального кода MATLAB. Наконец, пример показывает, как работать вокруг ограничений генерации кода, влияющей на WLAN Toolbox.

Определение входных параметров

Для генерации кода необходимо задать размер и тип входных параметров к функции точки входа. В этом случае вы задаете входные параметры wlanWaveformGenerator объект настройки функционального и формата пакета. Обязательные аргументы генератора формы волны являются битами данных модуля эксплуатационных данных физического уровня (PSDU) и настройки формата формы волны. Дополнительные входные параметры, такие как время простоя, инициализация скремблера, и время перехода окна зависят от настройки формата. Задайте дополнительные входные параметры как пары "имя-значение". Смотрите wlanWaveformGenerator для получения дополнительной информации.

Можно использовать значения в качестве примера входных параметров и codegen функция автоматически выводит их размер, класс и сложность. Однако размер вектора входных данных зависит от свойств настройки формата, таких как полоса пропускания канала и кодирование. Используйте coder.typeof функция, чтобы задать вектор входных данных переменного размера, который адаптируется к свойствам настройки формата как требуется.

Таким образом можно запустить сгенерированный код для нескольких наборов параметров объекта настройки формата. Для получения дополнительной информации об определении входных параметров переменного размера, смотрите, Генерируют Код для Данных Переменного Размера (MATLAB Coder). В этом случае задайте только первую размерность как переменный размер.

variableDims = [1 0];

Векторы переменного размера могут быть верхние ограниченный или неограниченный. Чтобы допускать полную гибкость, можно выбрать верхнюю границу, чтобы быть максимальным агрегированным модулем данных о протоколе MAC (A-MPDU) длина, i.e., 6 500 631 байт.

upperBound = 6500631*8; % Upper bound in bits

Затем используйте coder.typeof чтобы задать входной тип как, вектор-столбец удваивает размер имеющий upperBound- 1, с первым переменным размером размерности.

inputBits = coder.typeof(double(0),[upperBound 1],variableDims);

Как inputBits тип данных является двойным, можно только использовать значения с двойной точностью для входных битов сгенерированного MEX и кода C/C++.

Затем создайте однопользовательскую высокую эффективность (SU HE) объект настройки формата параметрами по умолчанию и его соответствующей конфигурационной структурой с помощью coder.typeof функция. Используйте эту структуру, чтобы задать тип и размер любого свойства объекта настройки формата SU HE.

cfgHESU = wlanHESUConfig;
cfgHESUcg = coder.typeof(cfgHESU);

Существует два возможных типа кодирования прямого исправления ошибок (FEC) для Данных HE: имеющая малую плотность проверка четности, заданная путем установки ChannelCoding свойство cfgHESU к 'LDPC', и бинарное сверточное кодирование в виде 'BCC'. Поскольку они - символьные массивы различных длин, используют coder.typeof функция, чтобы задать вектор-строку переменной длины из максимального размера символы 1 на 4.

cfgHESUcg.Properties.ChannelCoding = coder.typeof('LDPC',[1 4],[0 1]);

Используйте ту же стратегию свойства полосы пропускания канала. В этом случае самый долгий символьный массив соответствует 'CBW160', таким образом, шести символов достаточно, чтобы покрыть все другие возможные случаи, т.е. 'CBW20', 'CBW40', и 'CBW80'.

cfgHESUcg.Properties.ChannelBandwidth = coder.typeof('CBW160',[1 6],[0 1]);

Задайте дополнительные аргументы генератора формы волны, такие как время перехода работы с окнами с помощью пар "имя-значение". Используйте coder.Constant задавать имя аргумента, потому что это - строковый литерал, который, как ожидают, не изменится.

WindowTransitionTime_Name = coder.Constant('WindowTransitionTime');

Используйте значение в качестве примера от который codegen функция выводит свой тип и размер. Этот метод только подходит для входных параметров фиксированного размера.

WindowTransitionTime_Value = 0;

Генерация кода для генератора формы волны WLAN Toolbox

Если входные параметры заданы для генерации кода, конфигурируют MATLAB Coder, чтобы сгенерировать код C/C++ и файлы MEX. Файл MEX действует как интерфейс к сгенерированному коду C/C++, который может запуститься в MATLAB. Генерация файла MEX обычно является первым шагом в рабочем процессе генерации кода, когда это обеспечивает удобный способ для проверки сгенерированного кода C/C++.

Можно сгенерировать файл MEX, код C/C++, динамическую библиотеку или независимый исполняемый файл путем создания объекта настройки MATLAB Coder и определения типа сборки как 'MEX', 'LIB', 'DLL', или 'EXE', соответственно.

BuildType = 'MEX';
cfgCoder = coder.config(BuildType);

Сгенерируйте отчет, содержащий полезную информацию о процессе генерации кода.

cfgCoder.GenerateReport = true;

Имя сгенерированного файла MEX является именем функции точки входа, добавленным суффиксом 'mex', то есть, wlanWaveformGenerator_mex. Чтобы задать другое имя для вашего файла MEX, используйте опцию -o output_file_name. Можно найти сгенерированные файлы MEX в локальной папке и сгенерированный код C/C++ в папке codegen\mex\wlanWaveformGenerator.

Пользователи семейства продуктов Microsoft Visual C++ могут видеть, что предупреждение компилятора C4101 указывает на не имеющую ссылки локальную переменную.

inputArgs = {inputBits,cfgHESUcg,WindowTransitionTime_Name,WindowTransitionTime_Value}; %#ok<NASGU>
codegen wlanWaveformGenerator -args inputArgs -config cfgCoder -o wlanWaveformGenerator_HESU_mex
Code generation successful: To view the report, open('codegen/mex/wlanWaveformGenerator/html/report.mldatx')

Затем проверьте, что сгенерированный файл MEX ведет себя как ожидалось, когда вы используете различные настройки ChannelBandwidth и ChannelCoding путем сравнения его выхода с тем из wlanWaveformGenerator.

% Create a HE SU format configuration object specifying the channel
% bandwidth, coding, number of antennas and streams.
cfgHESU = wlanHESUConfig('ChannelBandwidth','CBW20','ChannelCoding','BCC', ...
                         'NumTransmitAntennas',2,'NumSpaceTimeStreams',2);

% Set the value of the window transition time
WindowTransitionTime = 1e-09;

% Create a PSDU of size defined by the getPSDULength function
inputBits = randi([0 1],getPSDULength(cfgHESU)*8,1);

% Run the wlanWaveformGenerator
waveformMAT = wlanWaveformGenerator(inputBits,cfgHESU,'WindowTransitionTime',WindowTransitionTime);

% Run the generated MEX file
waveformMEX = wlanWaveformGenerator_HESU_mex(inputBits,cfgHESU,'WindowTransitionTime',WindowTransitionTime);

% Compare the outputs of the wlanWaveformGenerator and generated MEX file
difference = waveformMAT - waveformMEX;

% Check the results are consistent
if max(abs(difference),[],'all') > 1e-10
    error('The MEX file generated does not produce the same results as wlanWaveformGenerator.')
else
    disp('The outputs of the generated MEX file and the wlanWaveformGenerator are equal.')
end
The outputs of the generated MEX file and the wlanWaveformGenerator are equal.

Дополнительные опции для генерации кода

В дополнение к опциям создания отчетов, используемым выше, можно сконфигурировать MATLAB Coder с большим количеством расширенных настроек.

  • Сгенерируйте код C/C++ только, но не создавайте установка cfgCoder.GenCodeOnly = true файлов MEX или объектный код. Это может сэкономить время, когда вы выполняете итерации между изменением кода MATLAB и осмотром сгенерированного кода C/C++. Чтобы сгенерировать файл MEX, установите это значение к false.

  • Сконфигурируйте MATLAB Coder для оптимизированной генерации кода C/C++ установкой cfgCoder.BuildConfiguration = 'Faster Runs'. Эта опция доступна только для 'LIB', 'DLL', и 'EXE' создайте типы.

Смотрите coder.config (MATLAB Coder) страница с описанием для получения дополнительной информации.

Ограничения генерации кода

Моделями Канала WLAN являются Системные объекты, которые специально разработаны для реализации и симуляции динамических систем с входными параметрами то изменение в зависимости от времени. Рассмотрите эти ограничения для генерации кода Системных объектов:

  • Ненастраиваемые значения свойств должны быть постоянными и могут только быть присвоены однажды step метод выполняется, включая присвоение в конструкторе.

  • Вы не можете передать в Системе object™ к функции точки входа.

Смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder) для получения дополнительной информации о правилах и ограничениях Системы objects™ для генерации кода.

При попытке сгенерировать код для функции с именем точки входа hCustomChannelNT, который создает wlanTGaxChannel с полосой пропускания, заданной входным параметром BW и фильтрует inputSignal сигнала, сбои процесса генерации кода.

function signalOut = hCustomChannelNT(BW, signalIn)
   
    % Create a TGax channel with the appropriate bandwidth 
    ch = wlanTGaxChannel('ChannelBandwidth',BW);
    % Filter the input signal
    signalOut = ch(signalIn); 
    
end

Сообщение об ошибке указывает: Failed to compute constant value for nontunable property 'ChannelBandwidth'.

ChannelBandwidth свойство wlanTGaxChannel объект не является постоянным значением, потому что он зависит от входного параметра BW из hCustomChannelNT функция. Можно работать вокруг этого установкой BW быть постоянным значением.

inputSignal = coder.typeof(complex(0),[Inf 1],[1 0]); %#ok<NASGU>
codegen hCustomChannelNT -args {coder.Constant('CBW160'),inputSignal};
Code generation successful.

Однако, если вы задаете постоянное значение для полосы пропускания канала, вы не можете изменить полосу пропускания канала во времени выполнения. Следующий вызов hCustomChannelNT_mex('CBW20',inputSignal) сбои, потому что заданный аргумент BW не 'CBW160'. Возможно работать вокруг этого на ограниченную изменчивость входных параметров с помощью блока случая переключателя. Функциональный hCustomChannel содержит случай переключателя, где каждый из случаев создает wlanTGaxChannel с соответствующей полосой пропускания канала.

function signalOut = hCustomChannel(ChannelBandwidth, signalIn)
    
    % Create a TGax channel with the appropriate bandwidth and filter the input signal
    switch ChannelBandwidth
        case 'CBW20'
            ch = wlanTGaxChannel('ChannelBandwidth','CBW20');
            signalOut = ch(signalIn);
        case 'CBW40'
            ch = wlanTGaxChannel('ChannelBandwidth','CBW40');
            signalOut = ch(signalIn);
        case 'CBW80'
            ch = wlanTGaxChannel('ChannelBandwidth','CBW80');
            signalOut = ch(signalIn);
        case 'CBW160'
            ch = wlanTGaxChannel('ChannelBandwidth','CBW160');
            signalOut = ch(signalIn);
        otherwise
            error('Invalid bandwidth configuration.')
    end
    
end

Обратите внимание на то, что hCustomChannel создает новый объект канала каждый раз, когда он используется, таким образом, он не сохраняет состояние канала.

Затем сгенерируйте код для hCustomChannel и выбор несколько полос пропускания канала во времени выполнения.

inputSignal = coder.typeof(complex(0),[Inf 1],[1 0]);
BW = coder.typeof('CBW160',[1 6],[0 1]);
inputArgs = {BW,inputSignal};
codegen hCustomChannel -args inputArgs

cfgHESU = wlanHESUConfig;
cfgHESU.ChannelBandwidth = 'CBW20';

inputSignal = wlanWaveformGenerator_HESU_mex([1 0 1]', cfgHESU,'WindowTransitionTime',0);

rng('default') % Set the default random number generator for reproduction purposes
outputSignalMEX = hCustomChannel_mex('CBW20',inputSignal);
rng('default')
outputSignalMAT = hCustomChannel('CBW20',inputSignal);

% Calculate the difference between the MEX and MATLAB files outputs
difference = outputSignalMAT - outputSignalMEX;

% Check the results are consistent
if max(abs(difference),[],'all') > 1e-10
    error('The generated MEX file does not produce the same results as hCustomChannel.')
else
    disp('The outputs of the generated MEX file and hCustomChannel are equal.')
end
Code generation successful.

The outputs of the generated MEX file and hCustomChannel are equal.

Измените полосу пропускания канала и передайте сигнал через канал.

cfgHESU.ChannelBandwidth = 'CBW40';
inputSignal = wlanWaveformGenerator_HESU_mex([1 0 1]', cfgHESU,'WindowTransitionTime',0);

rng('default') % Set the default random number generator for reproduction purposes
outputSignalMEX = hCustomChannel_mex('CBW40',inputSignal);
rng('default')
outputSignalMAT = hCustomChannel('CBW40',inputSignal);

% Calculate the difference between the MEX and MATLAB files outputs
difference = outputSignalMAT - outputSignalMEX;

% Check the results are consistent
if max(abs(difference),[],'all') > 1e-10
    error('The MEX file generated does not produce the same results as hCustomChannel.')
else
    disp('The outputs of the generated MEX file and hCustomChannel are equal.')
end
The outputs of the generated MEX file and hCustomChannel are equal.

Дальнейшее расследование

Можно интегрировать сгенерированный код с Интерфейсом программирования на машинном языке (DPI) SystemVerilog, чтобы экспортировать алгоритмы MATLAB в ASIC или среды верификации FPGA включая Synopsys VCS®, Cadence Incisive или Xcelium, и Mentor Graphics ModelSim или Questa. Можно автоматически сгенерировать компоненты SystemVerilog DPI от функций MATLAB с помощью MATLAB Coder™ с HDL Verifier™. Следующий рабочий процесс может использоваться с функциями MATLAB, которые генерируют стимулы и выполняют анализ или с функцией MATLAB, которая является поведенческой золотой ссылкой для DUT (Устройство Под Тестом) в ASIC или среде верификации FPGA. Смотрите Генерацию Компонента SystemVerilog DPI (HDL Verifier) (HDL Verifier), чтобы узнать больше.