data = load('out3.txt'); N = length(data(:,1)); b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data(:,1)); [IndMin, IndMax] = findExtrema(data_smooth); figure; subplot(2,1,1); plot(data_smooth, 'r'); hold on; plot(IndMin, data_smooth(IndMin), 'r^', 'MarkerFaceColor', 'r'); plot(IndMax, data_smooth(IndMax), 'k*', 'MarkerFaceColor', 'k'); box on; legend('曲线','波谷点','波峰点'); title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); subplot(2,1,2); plot(data(:,1), 'k'); hold on; plot(data_smooth, 'r'); box on; legend('原始数据','平滑数据'); title('原始数据和平滑数据', 'FontWeight', 'Bold'); function [IndMin, IndMax] = findExtrema(data) b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data); [~, IndMin] = findpeaks(-data_smooth); [~, IndMax] = findpeaks(data_smooth); end 优化这段代码加入线性插值法
时间: 2023-12-14 20:03:39 浏览: 49
这段代码中的波峰波谷信息计算函数findExtrema可以优化,加入线性插值法可以提高精度。具体来说,可以在找到波峰和波谷的位置之后,使用线性插值法计算出精确的极值点位置。代码实现如下:
```matlab
function [IndMin, IndMax] = findExtrema(data)
b = fir1(15, 0.3, chebwin(16, 30));
data_smooth = filtfilt(b, 1, data);
% 找到原始数据中的极值点位置
[~, IndMin] = findpeaks(-data_smooth);
[~, IndMax] = findpeaks(data_smooth);
% 线性插值法计算精确的极值点位置
x = 1:length(data_smooth);
IndMin = interp1(x(IndMin), IndMin, x, 'linear', 'extrap');
IndMax = interp1(x(IndMax), IndMax, x, 'linear', 'extrap');
end
```
使用线性插值法可以使得波峰波谷点的位置更加精确,提高数据处理的准确性。
相关问题
data = load('out3.txt'); N = length(data(:,1)); b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data(:,1)); [IndMin, IndMax] = findExtrema(data_smooth); figure; subplot(2,1,1); plot(data_smooth, 'r'); hold on; plot(IndMin, data_smooth(IndMin), 'r^', 'MarkerFaceColor', 'r'); plot(IndMax, data_smooth(IndMax), 'k*', 'MarkerFaceColor', 'k'); box on; legend('曲线','波谷点','波峰点'); title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); subplot(2,1,2); plot(data(:,1), 'k'); hold on; plot(data_smooth, 'r'); box on; legend('原始数据','平滑数据'); title('原始数据和平滑数据', 'FontWeight', 'Bold'); function [IndMin, IndMax] = findExtrema(data) b = fir1(15, 0.3, chebwin(16, 30)); data_smooth = filtfilt(b, 1, data); [~, IndMin] = findpeaks(-data_smooth); [~, IndMax] = findpeaks(data_smooth); end 优化这段代码
以下是我对这段代码的一些优化建议:
1. 在函数内部定义滤波器b并进行滤波的操作,每次调用函数都会重新定义滤波器并进行滤波,会浪费时间和计算资源。可以将滤波器定义在函数外部,函数内部只进行滤波操作。
2. 函数内部调用findpeaks函数时,将数据取反再调用函数,会增加计算量。可以直接调用findpeaks函数,并在调用时指定'NegativePeakValley'参数,来同时寻找波峰和波谷。
3. 当数据量很大时,函数内部的数据平滑操作会消耗大量的计算资源和时间。可以考虑使用其他更高效的平滑算法。
4. 可以增加输入参数的验证,确保输入数据的正确性和合法性。
以下是优化后的代码:
```matlab
function [IndMin, IndMax] = findExtrema(data, b)
% 寻找数据的波峰和波谷
% data: 输入的数据
% b: 滤波器
if nargin < 2
% 如果没有输入滤波器,则使用默认的滤波器
b = fir1(15, 0.3, chebwin(16, 30));
end
% 数据滤波
data_smooth = filtfilt(b, 1, data);
% 寻找波峰和波谷
[IndMax, IndMin] = findpeaks(data_smooth, 'MinPeakDistance', 10, 'NegativePeakValley', true);
end
```
优化后的代码去除了subplot和绘图等操作,仅保留了寻找波峰和波谷的核心代码,可以在需要时进行调用。在调用时,可以传入自定义的滤波器,也可以使用默认的滤波器。
data1 = load('out3.txt'); %加载数据到变量data1中 data = data1(:, 1); %取出变量data1中第1列中的数据到变量data中 %对数据进行平滑处理 data_smooth = smoothdata(data, 'movmean', 5); IndMin = find(diff(sign(diff(data_smooth))) > 0) + 1; %获得局部最小值的位置 IndMax = find(diff(sign(diff(data_smooth))) < 0) + 1; %获得局部最大值的位置 figure; %绘制图形 hold on; box on; plot(1:length(data_smooth), data_smooth); plot(IndMin, data_smooth(IndMin), 'r^'); plot(IndMax, data_smooth(IndMax), 'k*'); legend('曲线','波谷点','波峰点'); title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); 把对数据进行平滑处理的方法更改为使用15阶Chebyshev滤波器
可以使用 `chebwin` 函数生成 Chebyshev 窗口,再将其作为参数传递给 `fir1` 函数生成 Chebyshev 滤波器系数,最后使用 `filter` 函数对数据进行滤波处理,代码如下:
```matlab
data1 = load('out3.txt'); %加载数据到变量data1中
data = data1(:, 1); %取出变量data1中第1列中的数据到变量data中
%生成Chebyshev窗口
N = 15; %窗口长度
win = chebwin(N, 30); %阶数为30的Chebyshev窗口
%生成Chebyshev滤波器系数
fc = 0.1; %截止频率
b = fir1(N-1, fc, 'low', win); %生成低通Chebyshev滤波器系数
%使用Chebyshev滤波器对数据进行滤波处理
data_smooth = filter(b, 1, data);
%获得局部最小值和最大值的位置
IndMin = find(diff(sign(diff(data_smooth))) > 0) + 1; %获得局部最小值的位置
IndMax = find(diff(sign(diff(data_smooth))) < 0) + 1; %获得局部最大值的位置
%绘制图形
figure; %创建新窗口
hold on; %保持原有图形并在其上添加新图形
box on; %在图形周围添加边框
plot(1:length(data_smooth), data_smooth); %绘制数据曲线
plot(IndMin, data_smooth(IndMin), 'r^'); %绘制波谷点
plot(IndMax, data_smooth(IndMax), 'k*'); %绘制波峰点
legend('曲线','波谷点','波峰点'); %添加图例
title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold'); %添加标题
```
其中,`fc` 为截止频率,可以根据实际情况进行调整。
阅读全文