Matlab Level 2 S-Function 示例:正弦波(连续输出)

只需将以下文件放在你的 Matlab 路径中(例如 Matlab/Simulink 中打开的目录)并运行 mex sfun_sine_wave.cpp 编译它。它以 1 kHz 采样率生成 1 Hz 正弦波。

sfun_sine_wave.cpp
#define S_FUNCTION_NAME  sine_wave_generator
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include <cmath>  // 用于生成正弦波

// 定义常量
#define SAMPLING_RATE 1000 // 1kHz
#define WAVE_FREQUENCY 1   // 1Hz
#define PI 3.14159265358979323846

// 函数: mdlInitializeSizes ===============================================
// 摘要:
//   设置各种向量的大小。
static void mdlInitializeSizes(SimStruct *S)
{
    ssSetNumSFcnParams(S, 0);  // 无参数
    ssSetNumContStates(S, 0);  // 无连续状态
    ssSetNumDiscStates(S, 0);  // 无离散状态

    // 1个输出端口,1个元素
    if (!ssSetNumOutputPorts(S, 1)) return;
    ssSetOutputPortWidth(S, 0, 1);  // 输出端口宽度 = 1(正弦波值)
    ssSetOutputPortDataType(S, 0, SS_DOUBLE);
    ssSetOutputPortComplexSignal(S, 0, COMPLEX_NO);

    // 采样时间
    ssSetNumSampleTimes(S, 1);  // 单一采样时间

    // 无工作向量(如果需要,在此处分配工作向量)
    ssSetNumRWork(S, 0);  // 实数工作向量
    ssSetNumIWork(S, 0);  // 整数工作向量
    ssSetNumPWork(S, 0);  // 指针工作向量
    ssSetNumModes(S, 0);  // 模式向量
    ssSetNumNonsampledZCs(S, 0);  // 零交叉

    // 使 S-function 模块能够用于 Real-Time Workshop 生成的模型
    ssSetOptions(S, 0);
}

// 函数: mdlInitializeSampleTimes =========================================
// 摘要:
//    将采样时间初始化为 1ms(1kHz)
static void mdlInitializeSampleTimes(SimStruct *S)
{
    ssSetSampleTime(S, 0, 1.0 / SAMPLING_RATE);  // 采样率 1kHz
    ssSetOffsetTime(S, 0, 0.0);
}

// 函数: mdlOutputs =======================================================
// 摘要:
//      根据仿真时间计算正弦波输出。
static void mdlOutputs(SimStruct *S, int_T tid)
{
    real_T *y = ssGetOutputPortRealSignal(S, 0);  // 输出指针
    real_T time = ssGetT(S);  // 获取当前仿真时间

    // 计算 1Hz 频率的正弦波值
    y[0] = sin(2 * PI * WAVE_FREQUENCY * time);
}

// 函数: mdlTerminate =====================================================
// 摘要:
//    此函数在仿真结束时被调用以进行清理。
static void mdlTerminate(SimStruct *S)
{
    // 此示例不需要清理
}

// 必需的 S-function 尾部
#ifdef MATLAB_MEX_FILE
#include "simulink.c"   // MEX 文件接口机制
#else
#include "cg_sfun.h"    // 代码生成接口
#endif

在 Simulink 中,你可以这样添加它:

Simulink 模块:连续 S-Function 正弦波发生器

连接到 Scope 时的输出如下所示:

MATLAB 连续 S 函数正弦波发生器


按类别查看类似文章: Matlab/Simulink