MATLAB 一堆散点如何求包络线

比如x=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] y=[1 2 3 2 1 2 3 4 3 2 1 2 3 4]
如果求极值点然后拟合的话,曲线根本不光滑。
百度搜到的是希尔伯特函数,但是看不懂。求大侠看看

你可以用convexHull来找出凸包。

%% x, y 弄成列向量

dt = DelaunayTri(x,y)
k = convexHull(dt)
plot(x,y, '.', 'markersize',10); hold on;
plot(x(k), y(k), 'r'); hold off;

 

追问

用您的方法,1好像只能求出上包络线;2这个求法,跟我把极值点直接拟合有什么区别,包络线一点也不光滑,最好是类似下面的这种

追答

包络线是曲线族的包络线,没有一条曲线的包络线这种说法。
convexHull求出来的叫做凸包,包含点集的最小凸多边形。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-25
处理前后的效果对比,图示为某声波傅里叶变换(fft)后的频谱图

原数据为横纵坐标为 frequency 和 Amplitude,都是<2048x1 double>的数据,即包含2048个数据点,由 subplot(2,2,1),plot(fr,Am); 绘制而成。
包络线的生成,需要将原数据分成等宽度的小段,每段取一个最高点所对应的横坐标和纵坐标(如图所示)。比如设定每小段的长度为 d = 4 或 8 或 16(或2048的其他约数),然后运行
y=reshape(Amplitude,d,2048/d);
y=max(y);
x=linspace(0,max(frequency),2048/d);
所得 x 和 y 即为包络线的横纵坐标。

其中关键的函数为 reshape() 和 linspace()。
reshape() 函数重新调整矩阵的行数、列数、维数。reshape(X,m,n) 可以把矩阵 X 调整为 m 行 n 列的矩阵,比如:
>> reshape([1 2 3 4 5 6],2,3)

ans =

1 3 5
2 4 6

linspace() 用于生产线性矢量。 linspace(a,b,n) 可以生产从 a 到 b 之间共 n 个元素组成的一维数组。比如:
>> linspace(1,5,4)

ans =

1.0000 2.3333 3.6667 5.0000
相似回答