声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2494|回复: 9

[C/C++] 如何实现数据光滑处理

[复制链接]
发表于 2007-3-1 13:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

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

曲线图

曲线图

图形

图形

data.txt

8.13 KB, 下载次数: 10

数据

回复
分享到:

使用道具 举报

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


样条插值算很简单且可行的了,或者试试普通插值然后样条磨光
 楼主| 发表于 2007-3-1 16:42 | 显示全部楼层
原帖由 eight 于 2007-3-1 16:34 发表


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


呵呵,怎么个搞法,我上面有数据,教我一下,给个代码,用matlab的就行!
发表于 2007-3-4 04:21 | 显示全部楼层
  1. /* 二次抛物线法绘制曲线函数 */

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

  3. {
  4. unsigned int i,j;
  5. float t1,t2,t3,t,a,b,c,d,tx,ty;
  6. *x=*(x+1);*(y)=*(y+1);
  7. *(x+n+1)=*(x+n);*(y+n+1)=*(y+n);
  8. t=0.5/k;
  9. setcolor(10);
  10. moveto(*(x+1),*(y+1));
  11. for(i=0;i<n-1;i++)
  12.   {
  13.   for(j=1;j<k;j++)
  14.     {
  15.     t1=j*t;
  16.     t2=t1*t1;
  17.     t3=t2*t1;
  18.     a=4*t2-t1-4*t3;
  19.     b=1-10*t2+12*t3;
  20.     c=t1+8*t2-12*t3;
  21.     d=4*t3-2*t2;
  22.     tx=a*(*(x+i))+b*(*(x+i+1))+c*(*(x+i+2))+d*(*(x+i+3));
  23.     ty=a*(*(y+i))+b*(*(y+i+1))+c*(*(y+i+2))+d*(*(y+i+3));
  24.     lineto(tx,ty);
  25.     }
  26.   }
  27.   lineto(*(x+i+2),*(y+i+2));
  28. }
复制代码

[ 本帖最后由 风花雪月 于 2007-3-4 04:23 编辑 ]
发表于 2007-3-4 04:21 | 显示全部楼层
  1. /* 二次B样条法绘制曲线函数 */

  2. void byangtiao(int *x,int *y,int n,unsigned int k)
  3. {
  4. unsigned int i,j;
  5. float t,t1,t2,a,b,c,tx,ty;
  6. *x=*(x+1);*y=*(y+1);
  7. *(x+n+1)=*(x+n);*(y+n+1)=*(y+n);
  8. t=1.0/k;
  9. setcolor(13);
  10. moveto((*x+(*(x+1)))/2.0,(*y+(*(y+1)))/2.0);
  11. for(i=0;i<n;i++)
  12.   {
  13.   for(j=1;j<k;j++)
  14.     {
  15.     t1=j*t;
  16.     t2=t1*t1;
  17.     a=(t2-2*t1+1)/2.0;
  18.     b=t1-t2+1/2.0;
  19.     c=t2/2.0;
  20.     tx=a*(*(x+i))+b*(*(x+i+1))+c*(*(x+i+2));
  21.     ty=a*(*(y+i))+b*(*(y+i+1))+c*(*(y+i+2));
  22.     lineto(tx,ty);
  23.     }
  24.   }
  25. }
复制代码

[ 本帖最后由 风花雪月 于 2007-3-4 04:23 编辑 ]
发表于 2007-3-4 04:22 | 显示全部楼层
  1. /*三次样条法*/

  2. void parspl(int p[][2],int n,int k)
  3. {
  4. int i,j;
  5. float t1,t2,t3,t,a,b,c,d,x,y;
  6. p[0][0]=p[1][0];p[0][1]=p[1][1];
  7. p[n+1][0]=p[n][0];p[n+1][1]=p[n][1];
  8. t=0.5/k;
  9. moveto(p[1][0],p[1][1]+D);
  10. for(i=0;i<n-1;i++)
  11.   {
  12.   for(j=1;j<k;j++)
  13.     {
  14.     t1=j*t;
  15.     t2=t1*t1;
  16.     t3=t2*t1;
  17.     a=4*t2-t1-4*t3;
  18.     b=1-10*t2+12*t3;
  19.     c=t1+8*t2-12*t3;
  20.     d=4*t3-2*t2;
  21.     x=a*p[i][0]+b*p[i+1][0]+c*p[i+2][0]+d*p[i+3][0];
  22.     y=a*p[i][1]+b*p[i+1][1]+c*p[i+2][1]+d*p[i+3][1];
  23.     lineto(x,y,15);
  24.     }
  25.   }
  26.   lineto(p[i+2][0],p[i+2][1],15);
  27. }
复制代码
发表于 2007-3-4 04:23 | 显示全部楼层
试一下上面的几种方法
发表于 2007-3-8 18:28 | 显示全部楼层
楼主要是解决了,能否共享一下啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-10 07:13 , Processed in 0.127735 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表