data = load('out3.txt'); data_smooth = smoothdata(data(:,1), 'movmean', 5); [IndMin, IndMax] = findExtrema(data_smooth); figure; subplot(2,1,1); plot(data_smooth); hold on; plot(IndMin, data_smooth(IndMin), 'r^'); plot(IndMax, data_smooth(IndMax), 'k*'); box on; legend('曲线','波谷点','波峰点'); title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); subplot(2,1,2); plot(data); box on; title('原始数据', 'FontWeight', 'Bold'); function [IndMin, IndMax] = findExtrema(data_smooth) %获得局部最小值的位置 IndMin = find(diff(sign(diff(data_smooth))) > 0) + 1; %获得局部最大值的位置 IndMax = find(diff(sign(diff(data_smooth))) < 0) + 1; end 将这段代码的平滑方法smooth改为使用三次样条插值方法
时间: 2023-12-27 22:04:35 浏览: 70
matlab 中findpeaks c代码实现
5星 · 资源好评率100%
将代码中的 `smoothdata` 函数替换为三次样条插值的代码如下:
```matlab
data = load('out3.txt');
x = 1:length(data);
y = data(:, 1);
cs = csapi(x, y); % 构造三次样条插值函数
x_new = linspace(1, length(data), 1000); % 新的 x 坐标
y_new = fnval(cs, x_new); % 在新的 x 坐标处进行插值
[IndMin, IndMax] = findExtrema(y_new); % 在插值后的曲线上找波峰波谷
figure;
subplot(2, 1, 1);
plot(y_new);
hold on;
plot(IndMin, y_new(IndMin), 'r^');
plot(IndMax, y_new(IndMax), 'k*');
box on;
legend('曲线', '波谷点', '波峰点');
title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold');
subplot(2, 1, 2);
plot(data);
box on;
title('原始数据', 'FontWeight', 'Bold');
function [IndMin, IndMax] = findExtrema(data_smooth)
% 获得局部最小值的位置
IndMin = find(diff(sign(diff(data_smooth))) > 0) + 1;
% 获得局部最大值的位置
IndMax = find(diff(sign(diff(data_smooth))) < 0) + 1;
end
```
在上面的代码中,首先使用 `csapi` 函数构造了三次样条插值函数,并在新的 x 坐标处进行插值。然后,在插值后的曲线上找波峰波谷的过程和之前的代码相同。需要注意的是,由于插值后的曲线是连续的,所以在寻找波峰波谷时需要使用 `diff(sign(diff(data_smooth)))` 的方式来计算二阶导数的符号变化。
阅读全文