美文网首页
matlab取离散数据图像的极大值与极小值

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

作者: 胜负55开 | 来源:发表于2019-05-11 22:31 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:matlab取离散数据图像的极大值与极小值

          本文链接:https://www.haomeiwen.com/subject/juwfaqtx.html