只需将以下文件放在你的 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 中,你可以这样添加它:
连接到 Scope 时的输出如下所示:

