В этом примере показано, как генерировать MEX-файлы и эффективный C/C + +-код для функции генератора сигнала WLAN Toolbox™ и проверять его правильное поведение. Кроме того, в нем показано, как обходить ограничения генерации кода для моделей каналов WLAN Toolbox. Все функции инструментария WLAN и системные objects™ поддерживаются для генерации кода C/C + +.
MATLAB Coder™ позволяет создавать эффективный переносной исходный код C, автономные исполняемые файлы и функции MEX для развертывания в настольных и встраиваемых приложениях. Можно ускорить код MATLAB с помощью функций MEX или интегрировать сгенерированный исходный код и статические или динамические библиотеки в проекты кода C/C + +. Дополнительные сведения о настройке компилятора C/C + + см. в разделе Настройка компилятора C или C++ (MATLAB Coder). Для создания кода необходима лицензия MATLAB Coder.
В этом примере используется codegen создание кода для генератора формы сигнала WLAN Toolbox и объекта системы каналов TGax. Сначала подготовьте требуемые входные аргументы генератора формы сигнала и сконфигурируйте кодер MATLAB для генерации MEX-файлов. Затем сравните выходные данные созданных файлов MEX и исходный код MATLAB. Наконец, в примере показано, как обойти ограничения генерации кода, влияющие на панель инструментов WLAN.
Для создания кода необходимо указать размер и тип входных аргументов для функции точки входа. В этом случае указываются входные аргументы wlanWaveformGenerator функция и объект конфигурации формата пакета. Обязательными аргументами генератора формы сигнала являются биты данных блока служебных данных физического уровня (PSDU) и конфигурация формата формы сигнала. Дополнительные входные данные, такие как время простоя, инициализация скремблера и время перехода окна, зависят от конфигурации формата. Укажите дополнительные входные данные как пары имя-значение. Посмотрите wlanWaveformGenerator для получения дополнительной информации.
Можно использовать примерные значения входных аргументов и codegen функция автоматически определяет их размер, класс и сложность. Однако размер вектора входных данных зависит от свойств конфигурации формата, таких как полоса пропускания канала и кодирование. Используйте coder.typeof для определения вектора входных данных переменного размера, который при необходимости адаптируется к свойствам конфигурации формата.
Таким образом, можно запустить сгенерированный код для нескольких наборов параметров объекта конфигурации формата. Дополнительные сведения об указании входных аргументов переменного размера см. в разделе Создание кода для данных переменного размера (кодер MATLAB). В этом случае укажите только первый размер в качестве размера переменной.
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-Data: проверка четности с низкой плотностью, определяемая установкой 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 для генерации файлов 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 с более расширенными опциями.
Создавать только код C/C + +, но не создавать объектный код или параметры MEX-файловcfgCoder.GenCodeOnly = true. Это позволяет сэкономить время при итерации между изменением кода MATLAB и проверкой созданного кода C/C + +. Чтобы создать файл MEX, установите это значение вfalse.
Настройка кодера MATLAB для создания оптимизированного кода C/C + + путем установкиcfgCoder.BuildConfiguration = 'Faster Runs'. Эта опция доступна только для 'LIB', 'DLL', и 'EXE' типы построений.
См. раздел coder.config (Кодер MATLAB) для получения дополнительной информации.
Модели каналов WLAN - это системные объекты, разработанные специально для реализации и моделирования динамических систем с вводами, изменяющимися с течением времени. Рассмотрим следующие ограничения для создания кода системных объектов:
Значения неперестраиваемых свойств должны быть постоянными и могут быть назначены только один раз перед step выполняется метод, включая назначение в конструкторе.
Невозможно передать системное object™ функции точки входа.
Для получения дополнительной информации о правилах и ограничениях objects™ системы для создания кода см. Системные объекты в разделе Создание кода MATLAB (Кодер MATLAB).
При попытке создания кода для функции точки входа с именем 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'. Можно обойти это для ограниченной изменчивости входных аргументов с помощью блока switch-case. Функция hCustomChannel содержит switch-case, где каждый из вариантов создает 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 ModelSim или Questa. Можно автоматически генерировать DPI-компоненты SystemVerilog из функций MATLAB с помощью Coder™ MATLAB с Verifier™ HDL. Следующий рабочий процесс может использоваться с функциями MATLAB, которые генерируют стимулы и выполняют анализ, или с функцией MATLAB, которая является поведенческой золотой привязкой для DUT (тестируемого устройства) в среде проверки ASIC или FPGA. Дополнительные сведения см. в разделе Создание компонентов DPI SystemVerilog (проверка HDL).
