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

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

Введение

С помощью MATLAB Coder™ можно сгенерировать эффективный, портативный исходный код C, независимые исполняемые файлы и MEX-функции для развертывания в настольных и встраиваемых приложениях. Вы можете ускорить код MATLAB с помощью MEX-функций или интегрировать сгенерированный исходный код и статические или динамические библиотеки в проекты кода C/C + +. Дополнительные сведения о настройке компилятора C/C + + см. в разделе Настройка компилятора C или C++ (MATLAB Coder). В порядок, чтобы использовать генерацию кода, вам нужна лицензия 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), т.е. 6500631 байт.

upperBound = 6500631*8; % Upper bound in bits

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

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

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

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

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, чтобы сгенерировать файлы MEX и код C/C + +. Файл 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 + + только, но не создавайте объектный код или настройку файлов MEX cfgCoder.GenCodeOnly = true. Это может сэкономить время, когда вы итератируете между изменением кода 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'.

The 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'. Возможно обойти это для ограниченной изменчивости входных параметров с помощью блока switch-case. Функция 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.

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

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