美文网首页
matlab离散数据三次样条插值

matlab离散数据三次样条插值

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

    需求:离散数据图像的极值点集得到后,想得到图像"极值点的包络线"。直接用直线连很难看!我们一般会用三次样条插值线来连,很平滑!因为每2点间用3次函数连接。

    实现如下:
    t为原始采样时间序列,x为对应的振幅序列;
    已得到:极大(小)值点所在的时间序列t1(t2),对应的振幅序列x1(x2);
    说明:极值点(少)就是插值必过的那些点~
    实现:spline(t1,x1,t)
    注意:spline第3个参数t是辅助点,理解为在极值点集每两点间又辅助增加一些点,让连的线变成光滑曲线。

    以一维离散的地震数据为例:

    clear ; clc;
    
    x = xlsread('shuju.xlsx');
    x = x(1001:1001+1023)';  % 有效数据长必须是2^n,所以我取1024,最后10几个点是0
    N = length(x);
    fs = 100;         % 采样频率 = 1/采样间隔
    t = (0:N-1)/fs;   % 时间刻度
    
    [top,local1] = findpeaks(x);   % 取极大值
    [low,local2] = findpeaks(-x);  % 取极小值
    
    t1 = t(local1);   % (必过的)极大值主插值点--时间x
    x1 = x(local1);   % 振幅 
    
    t2 = t(local2);   % 时间
    x2 = x(local2);   % (必过的)极小值主插值点--振幅y
    
    xtop = spline(t1, x1, t);
    xlow = spline(t2, x2, t);  % 三次样条插值结果
    
    figure(1);
    h1 = plot(t,x); hold on;
    h2 = plot(t, xtop, 'r'); hold on;
    h3 = plot(t, 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/cwafaqtx.html