需求:现实数据都是离散的,有时需要离散数据图像的极大值点集和极小值点集,并用它们绘制原函数的上、下包络线。基于此需求,本文给出matlab的简单实现。
极大值的寻找方式:
函数:findpeaks
使用1:findpeaks(x)
使用2:[top, location1] = findpeaks(x);
效果:找到原始数据x的极大"值"们(top)以及对应的索引(location1)!
极小值的寻找方式:
说明:matlab里没有自带直接的找极小值的函数,可用下面这个小技巧
函数:findpeaks
技巧:findpeaks(-x);
使用:[low, location2] = findpeaks(-x);
效果:把原始数据相当于翻转或乘-1,这样原来的极小值就是极大值!翻转不会改变极小值的索引!
真实数据的实例:
clear ; clc;
x = xlsread('shuju.xlsx');
x = x(1001:1001+1023)';
N = length(x);
fs = 100; % 采样频率 = 1/采样间隔
t = (0:N-1)/fs; % 时间刻度
% 一般只要返回的第2个参数: 极值的索引
[top,location1] = findpeaks(x);
[low,location2] = findpeaks(-x);
xtop = x(location1);
ttop = t(location1);
xlow = x(location2);
tlow = t(location2);
figure(1);
h1 = plot(t, x, 'k'); hold on;
h2 = plot(ttop, xtop, 'r'); hold on;
h3 = plot(tlow, xlow, 'g'); hold off;
axis([min(t) max(t) -inf inf]);
legend([h1(1),h2(1),h3(1)],'原始数据', '极大值包络', '极小值包络');
title('原始数据的极大值、极小值包络');
xlabel('采样点时间');
ylabel('振幅');
效果:
图1:原始数据及极值包络
其实包络线可以用三次样条插值绘制的更平滑一些!
三次样条插值的操作参考这篇文章。
网友评论