dangjt 发表于 2007-3-1 13:22

如何实现数据光滑处理

我想对下列数据进行光滑处理,以便找到其局部最大最小值,得到半周期(不定相等)
请问一般有什么方法,我用平均法试过,效果不是很好

[ 本帖最后由 dangjt 于 2007-3-1 16:23 编辑 ]

pjab001 发表于 2007-3-1 14:35

用matlab进行样条插值即可

dangjt 发表于 2007-3-1 16:19

插值怎么可能呢?插值不改变当前数据点的值大小,我要求出局部极大极小值,如上图所示,图上有2个局部极小,2个局部极大,但是数据会稍带毛刺,那些小的毛刺没有办法去掉,用普通算法会当作局部极值!

eight 发表于 2007-3-1 16:34

原帖由 dangjt 于 2007-3-1 16:19 发表
插值怎么可能呢?插值不改变当前数据点的值大小,我要求出局部极大极小值,如上图所示,图上有2个局部极小,2个局部极大,但是数据会稍带毛刺,那些小的毛刺没有办法去掉,用普通算法会当作局部极值!

样条插值算很简单且可行的了,或者试试普通插值然后样条磨光

dangjt 发表于 2007-3-1 16:42

原帖由 eight 于 2007-3-1 16:34 发表


样条插值算很简单且可行的了,或者试试普通插值然后样条磨光

呵呵,怎么个搞法,我上面有数据,教我一下,给个代码,用matlab的就行!

风花雪月 发表于 2007-3-4 04:21

/* 二次抛物线法绘制曲线函数 */

void paowuxian(int *x,int *y,int n,unsigned int k)

{
unsigned int i,j;
float t1,t2,t3,t,a,b,c,d,tx,ty;
*x=*(x+1);*(y)=*(y+1);
*(x+n+1)=*(x+n);*(y+n+1)=*(y+n);
t=0.5/k;
setcolor(10);
moveto(*(x+1),*(y+1));
for(i=0;i<n-1;i++)
{
for(j=1;j<k;j++)
    {
    t1=j*t;
    t2=t1*t1;
    t3=t2*t1;
    a=4*t2-t1-4*t3;
    b=1-10*t2+12*t3;
    c=t1+8*t2-12*t3;
    d=4*t3-2*t2;
    tx=a*(*(x+i))+b*(*(x+i+1))+c*(*(x+i+2))+d*(*(x+i+3));
    ty=a*(*(y+i))+b*(*(y+i+1))+c*(*(y+i+2))+d*(*(y+i+3));
    lineto(tx,ty);
    }
}
lineto(*(x+i+2),*(y+i+2));
}

[ 本帖最后由 风花雪月 于 2007-3-4 04:23 编辑 ]

风花雪月 发表于 2007-3-4 04:21

/* 二次B样条法绘制曲线函数 */

void byangtiao(int *x,int *y,int n,unsigned int k)
{
unsigned int i,j;
float t,t1,t2,a,b,c,tx,ty;
*x=*(x+1);*y=*(y+1);
*(x+n+1)=*(x+n);*(y+n+1)=*(y+n);
t=1.0/k;
setcolor(13);
moveto((*x+(*(x+1)))/2.0,(*y+(*(y+1)))/2.0);
for(i=0;i<n;i++)
{
for(j=1;j<k;j++)
    {
    t1=j*t;
    t2=t1*t1;
    a=(t2-2*t1+1)/2.0;
    b=t1-t2+1/2.0;
    c=t2/2.0;
    tx=a*(*(x+i))+b*(*(x+i+1))+c*(*(x+i+2));
    ty=a*(*(y+i))+b*(*(y+i+1))+c*(*(y+i+2));
    lineto(tx,ty);
    }
}
}

[ 本帖最后由 风花雪月 于 2007-3-4 04:23 编辑 ]

风花雪月 发表于 2007-3-4 04:22

/*三次样条法*/

void parspl(int p[],int n,int k)
{
int i,j;
float t1,t2,t3,t,a,b,c,d,x,y;
p=p;p=p;
p=p;p=p;
t=0.5/k;
moveto(p,p+D);
for(i=0;i<n-1;i++)
{
for(j=1;j<k;j++)
    {
    t1=j*t;
    t2=t1*t1;
    t3=t2*t1;
    a=4*t2-t1-4*t3;
    b=1-10*t2+12*t3;
    c=t1+8*t2-12*t3;
    d=4*t3-2*t2;
    x=a*p+b*p+c*p+d*p;
    y=a*p+b*p+c*p+d*p;
    lineto(x,y,15);
    }
}
lineto(p,p,15);
}

风花雪月 发表于 2007-3-4 04:23

试一下上面的几种方法

yimao 发表于 2007-3-8 18:28

楼主要是解决了,能否共享一下啊?
页: [1]
查看完整版本: 如何实现数据光滑处理