matlab取离散数据图像的极大值与极小值

需求:现实数据都是离散的,有时需要离散数据图像的极大值点集极小值点集,并用它们绘制原函数的上、下包络线。基于此需求,本文给出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('振幅');

效果:

《matlab取离散数据图像的极大值与极小值》 图1:原始数据及极值包络

其实包络线可以用三次样条插值绘制的更平滑一些!
三次样条插值的操作参考这篇文章

    原文作者:胜负55开
    原文地址: https://www.jianshu.com/p/0a56c4a319d7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞