MATLAB分时间区间叠加两正弦波生成连续合成信号方法
MATLAB实现分段合成连续信号mcm
实现思路
直接用MATLAB的逻辑索引做分段赋值,不需要写循环,能保证所有采样点和时间轴严格对齐,避免插值带来的误差。核心是按时间阈值标记每个分段对应的采样点位置,再按规则逐段计算取值。
注意
如果直接把前两段规则交替延伸到后两个四分之一周期,会在t=0.005s、t=0.015s两个交界点出现幅值跳变,不符合连续无断点的要求。下面先给出按明确写出的分段规则的实现代码,再附连续无断点版本的修正方案。
版本1:严格按给定分段规则实现
%% 1. 生成基础信号 t = 0:0.00001:0.02; w = 2*pi*50; ma = 0.8*sin(w*t); mb = 0.8*sin(w*t-pi); mcm = zeros(size(t)); % 初始化合成信号数组 %% 2. 逐段赋值 % 0~0.005s区间 idx1 = t >= 0 & t < 0.005; mcm(idx1) = 1 + ma(idx1); % 0.005s~0.01s区间 idx2 = t >= 0.005 & t < 0.01; mcm(idx2) = 1 + mb(idx2); % 0.01s~0.015s区间 按交替逻辑延伸 idx3 = t >= 0.01 & t < 0.015; mcm(idx3) = 1 + ma(idx3); % 0.015s~0.02s区间 按交替逻辑延伸 idx4 = t >= 0.015 & t <= 0.02; mcm(idx4) = 1 + mb(idx4); %% 可选:校验跳变点 diff_mcm = diff(mcm); max_jump = max(abs(diff_mcm)); fprintf('最大相邻点跳变值:%.4f\n',max_jump); % 运行后会输出最大跳变约1.6,对应两个分段交界点的断点
版本2:满足连续无断点要求的修正实现
断点出现的原因是t=0.005s、t=0.015s处1+ma和1+mb的取值不相等,要消除断点只需要调整分段计算逻辑,让相邻两段在交界点的取值完全匹配。如果要实现和前两个四分之一周期变化趋势一致的连续馒头波,代码如下:
%% 1. 生成基础信号 t = 0:0.00001:0.02; w = 2*pi*50; ma = 0.8*sin(w*t); mb = 0.8*sin(w*t-pi); mcm = zeros(size(t)); %% 2. 连续分段赋值 % 0~0.005s 上升沿:1+ma 从1升到1.8 idx1 = t >=0 & t <0.005; mcm(idx1) = 1 + ma(idx1); % 0.005s~0.01s 下降沿:1 - mb 从1.8降到1(t=0.005处和上一段终点值完全相等) idx2 = t >=0.005 & t <0.01; mcm(idx2) = 1 - mb(idx2); % 0.01s~0.015s 上升沿:1 + mb 从1升到1.8(t=0.01处和上一段终点值相等) idx3 = t >=0.01 & t <0.015; mcm(idx3) = 1 + mb(idx3); % 0.015s~0.02s 下降沿:1 - ma 从1.8降到1(t=0.015处和上一段终点值相等) idx4 = t >=0.015 & t <=0.02; mcm(idx4) = 1 - ma(idx4); %% 校验连续性 diff_mcm = diff(mcm); max_jump = max(abs(diff_mcm)); fprintf('最大相邻点跳变值:%.2e\n',max_jump); % 运行后最大跳变在1e-15量级,属于浮点计算误差,完全连续无断点
可选绘图验证
运行完代码后加下面的代码可以直接查看波形对比:
figure;plot(t,ma,'--',t,mb,'--',t,mcm,'LineWidth',1.5); legend('ma','mb','mcm');grid on; xlabel('时间t(s)');ylabel('幅值');
内容的提问来源于stack exchange,提问作者Trickk
相关产品推荐
相关产品推荐

