主要内容

代码生成的WLAN工具箱功能

这个例子展示了如何为WLAN Toolbox™波形发生器功能生成MEX文件和高效的C/ c++代码,并验证其正确的行为。此外,还展示了如何解决WLAN工具箱通道模型的代码生成限制。所有WLAN工具箱函数和系统对象™都支持C/ c++代码生成。金宝app

简介

使用MATLAB Coder™,您可以生成高效、可移植的C源代码、独立可执行文件和MEX函数,用于部署在桌面和嵌入式应用程序中。您可以使用MEX函数加速MATLAB代码,或将生成的源代码和静态或动态库集成到C/ c++代码项目中。看到设置C或c++编译器(MATLAB编码器)有关如何设置C/ c++编译器的更多信息。为了使用代码生成,您需要一个MATLAB Coder许可证。

本例使用codegen函数为WLAN工具箱波形发生器和TGax信道系统对象生成代码。首先,准备波形发生器所需的输入参数,并配置MATLAB Coder生成MEX文件。接下来,比较生成的MEX文件的输出和原始的MATLAB代码。最后,该示例展示了如何处理影响WLAN工具箱的代码生成限制。

输入参数定义

对于代码生成,必须为入口点函数指定输入参数的大小和类型。类的输入参数wlanWaveformGenerator函数和报文格式配置对象。波形发生器的强制参数是物理层业务数据单元PSDU (physical layer service data unit)的数据位和波形格式配置。诸如空闲时间、扰频器初始化和窗口转换时间等其他输入取决于格式配置。将附加输入指定为名称-值对。看到wlanWaveformGenerator获取更多信息。

可以使用输入参数的示例值和codegen函数自动派生它们的大小、类和复杂度。然而,输入数据向量的大小取决于格式配置的属性,如信道带宽和编码。使用coder.typeof函数定义一个可变大小的输入数据向量,该向量可根据需要适应格式配置属性。

因此,您可以为格式配置对象的多个参数集运行生成的代码。有关指定可变大小输入参数的详细信息,请参见生成可变大小数据的代码(MATLAB编码器).在本例中,仅将第一个维度指定为可变大小。

variableDims = [10];

可变大小的向量可以是上界的,也可以是无界的。为了充分考虑灵活性,您可以选择上限为最大聚合MAC协议数据单元(A-MPDU)长度,即6500631字节。

upperBound = 6500631*8;%上限(以位为单位)

下一步,使用coder.typeof将输入类型定义为最大大小为的双精度精度列向量upperBound-by-1,第一个维度可变大小。

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

随着inputBits如果数据类型为双精度,则只能对生成的MEX和C/ c++代码的输入位使用双精度值。

方法创建具有默认参数和相应配置结构的高效单用户(HE SU)格式配置对象coder.typeof函数。使用此结构可以指定HE SU格式配置对象的任何属性的类型和大小。

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

HE-Data有两种可能的前向纠错(FEC)编码类型:低密度奇偶校验,通过设置ChannelCoding的属性cfgHESU“方法”,和二进制卷积编码,指定为“* *”.因为这些是不同长度的字符数组,所以使用coder.typeof函数定义最大大小为1 × 4个字符的变长行向量。

cfghesuc . properties . channelcoding = code .typeof(“方法”,[1 4],[0 1]);

对信道带宽属性使用相同的策略。在本例中,最长字符数组对应于“CBW160”,因此六个字符足以涵盖所有其他可能的情况,即,“CBW20”“CBW40”,“CBW80”

cfghesuc . properties . channelbandwidth = code .typeof(“CBW160”,[1 6],[0 1]);

使用名称-值对指定波形发生器的可选参数,例如窗口转换时间。使用编码器。常数来定义参数的名称,因为它是一个不希望更改的字符串字面值。

WindowTransitionTime_Name =编码器。常数(“WindowTransitionTime”);

的示例值codegen函数派生其类型和大小。这种技术只适用于固定大小的输入参数。

WindowTransitionTime_Value = 0;

代码生成的WLAN工具箱波形发生器

一旦为代码生成指定了输入参数,配置MATLAB Coder以生成MEX文件和C/ c++代码。MEX文件充当生成的C/ c++代码的接口,这些代码可以在MATLAB中运行。MEX文件生成通常是代码生成工作流中的第一步,因为它为验证生成的C/ c++代码提供了一种方便的方法。

通过创建MATLAB Coder配置对象并指定构建类型为,可以生成MEX文件、C/ c++代码、动态库或独立可执行文件墨西哥人的“自由”“DLL”,或EXE”,分别。

BuildType =墨西哥人的;cfgCoder = code .config(BuildType);

生成包含关于代码生成过程的有用信息的报告。

cfgCoder。GenerateReport = true;

生成的MEX文件名称为入口点函数名,后缀为“MEX”,即:wlanWaveformGenerator_mex.若要为MEX文件指定不同的名称,请使用该选项- o output_file_name.您可以在本地文件夹中找到生成的MEX文件,在codegen\ MEX \wlanWaveformGenerator文件夹中找到生成的C/ c++代码。

Microsoft Visual c++产品族的用户可能会看到C4101编译器警告,指出一个未引用的局部变量。

inputArgs = {inputBits,cfgHESUcg,WindowTransitionTime_Name,WindowTransitionTime_Value};% #好< NASGU >codegenwlanWaveformGeneratorarg游戏inputArgs配置cfgCoder- owlanWaveformGenerator_HESU_mex
要查看报告,打开('codegen/mex/wlanWaveformGenerator/html/report.mldatx')

的不同配置时,验证所生成的MEX文件是否符合预期ChannelBandwidthChannelCoding通过将其输出与wlanWaveformGenerator

创建一个指定通道的HE SU格式配置对象%带宽,编码,天线和流的数量。cfgHESU = wlanHESUConfig(“ChannelBandwidth”“CBW20”“ChannelCoding”“* *”...“NumTransmitAntennas”2,“NumSpaceTimeStreams”2);设置窗口转换时间WindowTransitionTime = 1e-09;创建一个大小由getPSDULength函数定义的PSDUinputBits = randi([0 1], getpsulength (cfgHESU)*8,1);运行wlanWaveformGeneratorwlanWaveformGenerator(inputBits,cfgHESU,“WindowTransitionTime”, WindowTransitionTime);%运行生成的MEX文件wavformmex = wlanWaveformGenerator_HESU_mex(inputBits,cfgHESU,“WindowTransitionTime”, WindowTransitionTime);比较wlanWaveformGenerator和生成的MEX文件的输出difference = waveformMAT - waveformMEX;检查结果是否一致如果马克斯(abs(差异),[],“所有”> 1e-10错误(生成的MEX文件不能产生与wlanWaveformGenerator相同的结果。其他的disp (生成的MEX文件和wlanWaveformGenerator的输出是相等的。结束
生成的MEX文件和wlanWaveformGenerator的输出是相等的。

代码生成的其他选项

除了上面使用的报告选项外,您还可以使用更高级的选项配置MATLAB Coder。

  • 只生成C/ c++代码,不生成目标代码或MEX文件设置cfgCoder。GenCodeOnly = true.这可以节省在修改MATLAB代码和检查生成的C/ c++代码之间迭代的时间。在生成MEX文件时,将该值设置为

  • 配置MATLAB Coder优化C/ c++代码生成设置cfgCoder。BuildConfiguration = '更快的运行'.此选项仅适用于“自由”“DLL”,EXE”构建类型。

看到coder.config(MATLAB编码器)有关更多信息的参考页。

代码生成的局限性

WLAN信道模型是系统对象,专门为实现和模拟输入随时间变化的动态系统而设计。考虑以下系统对象代码生成的限制:

  • 属性的不可调属性值必须为常量,并且只能在一步方法执行,包括构造函数中的赋值。

  • 不能将System对象™传递给入口点函数。

看到系统对象在MATLAB代码生成(MATLAB编码器)以了解关于用于代码生成的System对象™的规则和限制的更多信息。

如果尝试为命名的入口点函数生成代码hCustomChannelNT,这将创建一个wlanTGaxChannel使用输入参数指定的带宽BW然后对信号进行过滤inputSignal时,代码生成过程失败。

函数signalOut = hCustomChannelNT(BW, signalIn)创建一个具有适当带宽的TGax通道ch = wlanTGaxChannel(“ChannelBandwidth”BW);对输入信号进行滤波signalOut = ch(signalIn);结束

错误信息表示:无法为不可调属性“ChannelBandwidth”计算恒定值

ChannelBandwidth的属性wlanTGaxChannel对象不是常量,因为它取决于输入参数BWhCustomChannelNT函数。您可以通过设置来解决这个问题BW是一个常数值。

inputSignal = code .typeof(complex(0),[Inf 1],[1 0]);% #好< NASGU >codegenhCustomChannelNTarg游戏{coder.Constant (CBW160), inputSignal}
代码生成成功。

但是,如果您为通道带宽指定了一个固定值,则不能在运行时更改通道带宽。下面的调用hCustomChannelNT_mex (CBW20, inputSignal)失败,因为指定的参数BW不是“CBW160”.对于输入参数的有限可变性,可以使用switch-case块来解决这个问题。这个函数hCustomChannel包含一个开关用例,其中每个用例创建一个wlanTGaxChannel使用适当的信道带宽。

函数signalOut = hCustomChannel(ChannelBandwidth, signalIn)创建一个具有适当带宽的TGax通道,并对输入信号进行滤波开关ChannelBandwidth情况下“CBW20”ch = wlanTGaxChannel(“ChannelBandwidth”“CBW20”);signalOut = ch(signalIn);情况下“CBW40”ch = wlanTGaxChannel(“ChannelBandwidth”“CBW40”);signalOut = ch(signalIn);情况下“CBW80”ch = wlanTGaxChannel(“ChannelBandwidth”“CBW80”);signalOut = ch(signalIn);情况下“CBW160”ch = wlanTGaxChannel(“ChannelBandwidth”“CBW160”);signalOut = ch(signalIn);否则错误('无效的带宽配置。'结束结束

请注意,hCustomChannel每次使用通道对象时都会创建一个新的通道对象,因此它不会保留通道的状态。

接下来,生成的代码hCustomChannel并在运行时选择多个通道带宽。

inputSignal = code .typeof(complex(0),[Inf 1],[1 0]);BW = code .typeof(“CBW160”,[1 6],[0 1]);inputArgs = {BW,inputSignal};codegenhCustomChannelarg游戏inputArgscfgHESU = wlanHESUConfig;cfgHESU。ChannelBandwidth =“CBW20”;inputSignal = wlanWaveformGenerator_HESU_mex([1 0 1]', cfgHESU,“WindowTransitionTime”, 0);rng (“默认”为复制目的设置默认的随机数生成器outputSignalMEX = hCustomChannel_mex(“CBW20”, inputSignal);rng (“默认”outputSignalMAT = hCustomChannel(“CBW20”, inputSignal);计算MEX和MATLAB文件输出的差值difference = outputSignalMAT - outputSignalMEX;检查结果是否一致如果马克斯(abs(差异),[],“所有”> 1e-10错误(“生成的MEX文件不会产生与hCustomChannel相同的结果。”其他的disp (生成的MEX文件和hCustomChannel的输出是相等的。结束
代码生成成功。生成的MEX文件和hCustomChannel的输出是相等的。

改变信道带宽,使信号通过信道。

cfgHESU。ChannelBandwidth =“CBW40”;inputSignal = wlanWaveformGenerator_HESU_mex([1 0 1]', cfgHESU,“WindowTransitionTime”, 0);rng (“默认”为复制目的设置默认的随机数生成器outputSignalMEX = hCustomChannel_mex(“CBW40”, inputSignal);rng (“默认”outputSignalMAT = hCustomChannel(“CBW40”, inputSignal);计算MEX和MATLAB文件输出的差值difference = outputSignalMAT - outputSignalMEX;检查结果是否一致如果马克斯(abs(差异),[],“所有”> 1e-10错误(“生成的MEX文件不会产生与hCustomChannel相同的结果。”其他的disp (生成的MEX文件和hCustomChannel的输出是相等的。结束
生成的MEX文件和hCustomChannel的输出是相等的。

进一步的调查

您可以将生成的代码与SystemVerilog直接编程接口(DPI)集成,以将MATLAB算法导出到ASIC或FPGA验证环境,包括Synopsys VCS®,Cadence Incisive或Xcelium,以及Mentor Graphics ModelSim或Questa。您可以使用MATLAB Coder™与HDL Verifier™从MATLAB函数自动生成SystemVerilog DPI组件。以下工作流程可与生成刺激并执行分析的MATLAB函数一起使用,也可与在ASIC或FPGA验证环境中作为被测设备(DUT)行为黄金参考的MATLAB函数一起使用。看到SystemVerilog DPI组件生成(高密度脂蛋白校验)(HDL验证器)了解更多。