В этом примере показано, как сгенерировать файлы 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) длина, т.е. 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;
Если входные параметры заданы для генерации кода, конфигурируют 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 if ~isequal(waveformMAT,waveformMEX) 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
страница с описанием для получения дополнительной информации.
Моделями Канала WLAN являются Системные объекты, которые специально разработаны для реализации и симуляции динамических систем с входными параметрами то изменение в зависимости от времени. Рассмотрите эти ограничения для генерации кода Системных объектов:
Ненастраиваемые значения свойств должны быть постоянными и могут только быть присвоены однажды step
метод выполняется, включая присвоение в конструкторе.
Вы не можете передать в Системе object™ к функции точки входа.
Смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder) для получения дополнительной информации о правилах и ограничениях Системы objects™ для генерации кода.
При попытке сгенерировать код для функции с именем точки входа hCustomChannelNT
, который создает wlanTGaxChannel
с пропускной способностью, заданной входным параметром BW
и фильтрует inputSignal
сигнала, сбои процесса генерации кода.
function signalOut = hCustomChannelNT(BW, signalIn) if ispc coder.updateBuildInfo('addCompileFlags', '/wd4101'); % Suppress C4101 compiler warning for Microsoft Visual Studio users end % 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};
Однако, если вы задаете постоянное значение для пропускной способности канала, вы не можете изменить пропускную способность канала во времени выполнения. Следующий вызов hCustomChannelNT_mex('CBW20',inputSignal)
сбои, потому что заданный аргумент BW
не 'CBW160'
. Возможно работать вокруг этого на ограниченную изменчивость входных параметров с помощью блока случая переключателя. Функциональный hCustomChannel
содержит случай переключателя, где каждый из случаев создает wlanTGaxChannel
с соответствующей пропускной способностью канала.
function signalOut = hCustomChannel(ChannelBandwidth, signalIn) if ispc coder.updateBuildInfo('addCompileFlags', '/wd4101'); % Suppress C4101 compiler warning for Microsoft Visual Studio users end % 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 sqrt(difference'*difference) > 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
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 sqrt(difference'*difference) > 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), чтобы узнать больше.