В этом примере показано, как сгенерировать файлы 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;
Когда входные параметры заданы для генерации кода, сконфигурируйте 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).