如何在Matlab Simulink中对10秒整数倍时刻的信号峰值求和?
解决积分器复位峰值求和的几种实用方法
方法1:时钟触发捕获+累加
- 拖入
Clock模块获取当前时间,用Relational Operator模块判断abs(mod(t,10)) < 1e-6(别直接用mod(t,10)==0,浮点数精度容易出问题),这个条件会精准命中10s、20s等整数倍时刻。 - 将判断结果接到
Triggered Subsystem的上升沿触发端,子系统内放置Sum模块:一端接积分器输出,另一端用Memory模块存储之前的累加值,每次触发就把当前峰值加入总和,输出更新后的结果。
方法2:Matlab Function模块直接实现逻辑
- 添加
Matlab Function模块,输入端口设为积分器输出和时钟的t值,内部用持久变量保存累加值,代码示例:
function sum_peaks = fcn(signal, t) persistent total; if isempty(total) total = 0; end % 捕获10s整数倍时刻的信号 if abs(mod(t,10)) < 1e-6 total = total + signal; end sum_peaks = total; end
- 若担心仿真重启时变量残留,可替换为
Data Store Memory模块存储累加值,稳定性更强。
方法3:复用复位信号做触发
- 既然积分器是通过阶梯函数复位的,那这个阶梯函数的上升沿就是峰值出现的时刻!直接把复位信号传入
Edge Detector模块检测上升沿,用该边沿信号控制Switch模块:触发时将积分器输出接入Sum模块,否则接入0。Sum模块的输出反馈回来完成累加,每次复位前的峰值会自动被计入总和。
重要提示:Simulink处理时间判断时,必须给浮点数比较加容差,否则仿真步长的细微变化可能导致漏触发或误触发。
内容的提问来源于stack exchange,提问作者Diodendomme
相关产品推荐
相关产品推荐

