需求:离散数据图像的极值点集得到后,想得到图像"极值点的包络线"。直接用直线连很难看!我们一般会用三次样条插值线来连,很平滑!因为每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:极值包络线的三次样条插值
网友评论