搜索
bottom↓
回复: 41

谁能帮我看一段150行C语言滤波算法,红包酬谢

   关闭 [复制链接]

出0入0汤圆

发表于 2020-6-25 16:09:25 | 显示全部楼层 |阅读模式
需求高手帮我看一段150行滤波算法,我看得云里雾里,不知道有没有用,谁能帮我理清原理思路,给我结构图和注释,红包500,能提出改进另说

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出1310入193汤圆

发表于 2020-6-25 17:14:23 | 显示全部楼层
  1. #include "hx711.c"


  2. #define  wtime2               30      
  3. #define  wdtm                 35      
  4. uchar  idata wtime0=6 ;   //默认值5,6,10    震动值
  5. uchar  idata wtime1=5 ; //5,5,10
  6. uchar  idata wtime4=2 ;//2,2,5
  7. uchar idata   fash1 ;  //默认值4,5, 8,10,10,12 缓冲区值
  8. uchar idata   fash2 ;  //默认值8,10,12,12,15,18            
  9. uchar idata   fash3 ; //默认值10,12,15,20,15,20
  10. uchar idata  mer1 ; //默认值100,150,250     震动值        
  11. uchar idata  mer2 ; //默认值80,100,180           
  12. uchar idata  mer3 ; //默认值40,50,100  

  13. bit     pick;   
  14. bit     f_bit6;   
  15. bit     stab2;         
  16. unsigned long idata   ad_out;
  17. xdata unsigned long  adbuff[50];               
  18. xdata unsigned long  adw_li;
  19. idata unsigned long  i1c,i21;         
  20. idata unsigned long  ls_li;
  21. idata unsigned long  ls_lei;
  22. unsigned char ch_12,ch_13,ch_14,ch_15,ch_16,ch_17,ch_11;       


  23. union  adhc
  24. {
  25.         unsigned long  mr;
  26.         unsigned char  mr1[4];
  27. }ad;

  28. ////////////////////////////
  29. void InitFilter (void)//滤波参数初始化           
  30. {
  31.         ch_13=1;
  32.         ch_14=1;
  33.         ch_17=wtime2;
  34. }
  35. void load_adbuff(void)
  36. {
  37.         uchar i;
  38.         for(i=0;i<50;i++)
  39.         {
  40.                 adbuff[i]=ad_out;
  41.         }
  42. }

  43. unsigned long int madd(unsigned char n1,unsigned char n2)//累计数据
  44. {
  45.         unsigned char loop;
  46.         ls_lei = 0;
  47.         for (loop = 0; loop<n2; loop++)
  48.         {
  49.                 ls_lei= ls_lei + adbuff[n1];
  50.                 n1++;
  51.         }
  52.         return(ls_lei);
  53. }

  54. void move(unsigned char dest,unsigned char num)//数值向右移位
  55. {
  56.         unsigned char loop,sour;
  57.         sour = dest + 1;
  58.         for (loop = 0; loop < num; loop++)
  59.         {
  60.                 adbuff[dest] = adbuff[sour];
  61.                 dest++;
  62.                 sour++;
  63.         }
  64. }

  65. ////////////////////////////
  66. void  maic( void )     
  67. {
  68.         move(0,fash1);//移位,去掉最低位的数据,从第一参数开始移第一参数个数据
  69.         adbuff[fash1-1] =ad.mr;        //加入新数据
  70.         ad.mr = madd(0,fash1);//累加数据,从数据0开始,
  71.         ad.mr=ad.mr/fash1;//求平均
  72.         ls_li = ad.mr;
  73.         ls_li = ls_li - i21;
  74.         if (ls_li > 0x80000000)
  75.         {
  76.                 ls_li = -ls_li;
  77.         }
  78.     if(ls_li > mer1)
  79.         {
  80.                 ch_13--;                       
  81.                 if (ch_13!=0)
  82.                 {
  83.                         return;         
  84.                 }
  85.                 else
  86.                 {
  87.                         ch_13 = 1;
  88.                         ch_14 = 1;
  89.                         ch_15 = 1;
  90.                         ch_16 = 1;                       
  91.                         ch_11 = 1;       
  92.                         ch_12=1;
  93.                         ch_17=1;
  94.                 }
  95.         }
  96.         else
  97.         {               
  98.                 if ( (ch_14 ^ fash2) !=0 )
  99.                 {
  100.                         ch_14++;
  101.                 }
  102.                 else
  103.                 {
  104.                         ch_13 = wtime0;
  105.                 }               
  106.         }

  107.         move(fash1,fash2);
  108.         adbuff[fash1+fash2-1] = ad.mr;       
  109.         ad.mr = madd(fash1+fash2-ch_14,ch_14);
  110.         ad.mr= ad.mr / ch_14;
  111.         ls_li = ad.mr;
  112.         f_bit6=0;
  113.         ls_li = ls_li - i21;
  114.         if ( ls_li > 0x80000000 )
  115.         {
  116.                 ls_li = -ls_li;
  117.                 f_bit6=1;       
  118.         }
  119.         i21 = ad.mr;
  120. //////////////////////
  121.         if (ls_li>mer2)
  122.         {
  123.                 ch_15--;
  124.                 if (ch_15 != 0)
  125.                 {
  126.                         return;
  127.                 }
  128.                 else
  129.                 {
  130.                         ch_15 = 1;
  131.                         ch_16 = 1;
  132.                         ch_11 = 1;       
  133.                         ch_12=1;
  134.                         ch_17=1;                       
  135.                 }               
  136.         }
  137.         else
  138.         {                                       
  139.                 if ( (ch_14 ^ fash2) == 0)
  140.                 {       
  141.                         ls_li = ls_li >> 1;
  142.                         if ( f_bit6 != 0)
  143.                         {
  144.                                 ad.mr = ad.mr - ls_li;
  145.                         }
  146.                         else  
  147.                         {
  148.                                 ad.mr = ad.mr + ls_li;
  149.                         }               
  150.                         if ((ch_16 ^ fash3) !=0)
  151.                         {
  152.                                 ch_16++;
  153.                         }
  154.                 }
  155.         }
  156.         move(fash1+fash2, fash3);
  157.         adbuff[fash1+fash2+fash3-1] = ad.mr;
  158.         ad.mr = madd(fash1+fash2+fash3-ch_16,ch_16);
  159.         ad.mr =ad.mr / ch_16;
  160.         i21 = ad.mr;
  161.         ls_li =ad.mr;       
  162.         ls_li = ls_li - adw_li;
  163.         if (ls_li > 0x80000000)   
  164.                 ls_li = -ls_li;
  165.         if (ls_li > mer3)
  166.         {               
  167.                 goto  cal16;
  168.         }
  169.         else
  170.         {       
  171.                 goto  cal17;
  172.         }
  173. cal16:
  174.         ch_11--;
  175.         stab2=0;
  176.         if (ch_11!=0)
  177.         {
  178.                 return;  
  179.         }
  180.         else
  181.         {
  182.                 ch_11=1;                       
  183.                 ch_12=1;       
  184.                 ch_17=1;               
  185.                 goto  cal18;       
  186.         }
  187. cal17:
  188.         if ((ch_16^fash3) !=0)
  189.         {               
  190.                 goto cal16;
  191.         }
  192.         ch_15 = wtime1;
  193.         ch_11 = wtime4;
  194.         ch_12++;
  195.         stab2 = 1;
  196.         if ( (ch_12 ^wdtm) !=0 )
  197.         {
  198.                 goto  cal18;
  199.         }       
  200.         ch_12 =wdtm;
  201.         i1c = i1c + ad.mr;
  202.         ch_17--;
  203.         if (ch_17!=0)
  204.         {               
  205.                 return;
  206.         }
  207.         ad.mr = i1c / wtime2;
  208.         adw_li = adw_li +ad.mr;
  209.         adw_li = adw_li >> 1;
  210.         i21 = adw_li;
  211. cal18:               
  212.         adw_li=i21;              
  213.         ad_out = adw_li;
  214.         i1c = 0;
  215.         pick = 1;            
  216.         ch_17 = wtime2;           
  217. }

  218. void read_ad(void)
  219. {
  220.     HX_OUT1=1;
  221.     HX_CLK1=0;
  222.     if (HX_OUT1==0)
  223.         {
  224.                 ad.mr =hx711_ad();//AD采样
  225.                 maic();//滤波
  226.         }               
  227. }


  228. //楼主,应用场景说一下呗   或许原作者就在论坛哦
复制代码



出0入0汤圆

 楼主| 发表于 2020-6-25 18:19:59 | 显示全部楼层
称重仪表滤波程序

出0入0汤圆

发表于 2020-6-25 19:39:48 | 显示全部楼层
三次滑动平均,后两次平均数长度可变。

出0入10汤圆

发表于 2020-6-25 19:42:54 | 显示全部楼层
看起来不错

出5入14汤圆

发表于 2020-6-25 19:47:29 来自手机 | 显示全部楼层
这种滤波算法的理论是什么?

出0入0汤圆

发表于 2020-6-25 20:55:34 | 显示全部楼层
mark,滤波算法。

出0入0汤圆

 楼主| 发表于 2020-6-25 22:33:42 | 显示全部楼层
sandeant 发表于 2020-6-25 19:39
三次滑动平均,后两次平均数长度可变。

3次可变滑动平均我知道,前后怎么关联没看出来,几个参数减来减去,跳来跳去看不懂,还有参数怎么调效果?

出0入0汤圆

发表于 2020-6-25 22:46:47 来自手机 | 显示全部楼层
mark,滤波算法+1

出0入42汤圆

发表于 2020-6-25 23:30:07 来自手机 | 显示全部楼层
滤波算法,mark

出0入0汤圆

发表于 2020-6-25 23:41:26 | 显示全部楼层
是不是使用了低通滤波器的计算手法?如果是的话可以使用相关的仿真软件看下低通滤波器的相关参数和频率响应情况

出0入0汤圆

发表于 2020-6-26 08:44:49 | 显示全部楼层
数据变动大时,滤波长度小。数据平稳时,长度递增,至设定值。兼具数据的快速性,和稳定性。

出0入0汤圆

发表于 2020-6-26 09:38:15 | 显示全部楼层
sandeant 发表于 2020-6-26 08:44
数据变动大时,滤波长度小。数据平稳时,长度递增,至设定值。兼具数据的快速性,和稳定性。 ...

感谢说明,一句话比分析代码强百倍!,提供了思路!

出0入0汤圆

发表于 2020-6-26 09:44:46 | 显示全部楼层

学习了  这个算法可以用在很多地方了

出1310入193汤圆

发表于 2020-6-26 10:03:32 | 显示全部楼层
二楼是开玩笑的  ,其实楼主重点介绍一下使用产品情况   ad采集的量类型是那种  等等  大伙群策群力 或许解决不了问题但是提供很好思路呢

出0入0汤圆

发表于 2020-6-26 10:09:58 | 显示全部楼层
看起来很不错,应该有很多地方能使用到

出0入0汤圆

发表于 2020-6-26 11:12:23 | 显示全部楼层
下载分析一下,看起来很不错。

出0入0汤圆

 楼主| 发表于 2020-6-26 14:32:37 | 显示全部楼层
lb0857 发表于 2020-6-26 10:03
二楼是开玩笑的  ,其实楼主重点介绍一下使用产品情况   ad采集的量类型是那种  等等  大伙群策群力 或许解 ...


称重仪表滤波程序,在晃动,抖动下能快速稳定。大家分析下,可以分享使用

出0入0汤圆

发表于 2020-6-26 15:36:54 | 显示全部楼层
MARK
称重仪表滤波算法,这个是惯性滤波和平滑滤波算法把?

出215入20汤圆

发表于 2020-6-26 17:54:22 | 显示全部楼层
就是个加权滑动平均吧 这个实际使用的时候要根据你的对象调整参数的

出1310入193汤圆

发表于 2020-6-26 19:23:24 | 显示全部楼层
加权递推平均滤波法.不同时刻的数据加以不同的权,通常是,越接近现时刻的资料,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。适用于有较大纯滞后时间常数的对象和采样周期较短的系统。

出0入4汤圆

发表于 2020-6-26 23:48:28 | 显示全部楼层
mark 滤波算法

出0入0汤圆

发表于 2020-6-27 14:37:21 | 显示全部楼层
看了一下,这句似乎是错的.  应该是ch_12--;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-6-27 18:10:54 | 显示全部楼层
学习了~~

出0入0汤圆

 楼主| 发表于 2020-6-27 21:11:20 | 显示全部楼层
sipure 发表于 2020-6-27 14:37
看了一下,这句似乎是错的.  应该是ch_12--;

你看懂了吗?可与我联系。我没看明白,也不知道对错

出0入13汤圆

发表于 2020-6-28 08:58:45 | 显示全部楼层
MARK C语言滤波算法

出0入0汤圆

发表于 2020-6-28 10:51:50 | 显示全部楼层
MARK C语言滤波算法

出0入0汤圆

发表于 2020-6-28 21:00:44 | 显示全部楼层
称重滤波算法,学习一下

出0入0汤圆

发表于 2020-6-28 21:39:39 | 显示全部楼层
期待高手分析下,看起来很不错

出0入0汤圆

发表于 2020-6-29 00:49:11 来自手机 | 显示全部楼层
本帖最后由 waymcu 于 2020-6-29 00:50 编辑

学习,学习!

出0入4汤圆

发表于 2020-7-3 16:37:15 来自手机 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2020-7-23 10:28:40 | 显示全部楼层
顶起来,等高手分析

出0入0汤圆

发表于 2020-7-29 11:27:04 | 显示全部楼层
滤波算法

出0入0汤圆

发表于 2020-7-29 16:34:22 | 显示全部楼层
先收下,有空研究!

出0入0汤圆

发表于 2020-7-29 20:08:15 | 显示全部楼层
高手,过来解释下。

出0入0汤圆

发表于 2020-7-29 23:35:37 | 显示全部楼层
LZ看懂了没有?出来解答下呗

出0入0汤圆

发表于 2020-7-29 23:43:28 | 显示全部楼层
滤波算法 mark

出0入0汤圆

发表于 2020-8-1 17:43:01 | 显示全部楼层
标记下,称重滤波算法,以后也许用到,等大佬回答

出100入101汤圆

发表于 2020-8-2 12:45:29 来自手机 | 显示全部楼层
称重滤波算法

出250入8汤圆

发表于 2020-8-16 15:38:54 | 显示全部楼层
称重滤波算法

出16170入6148汤圆

发表于 2020-8-16 16:00:31 来自手机 | 显示全部楼层
有偿求助”的帖子,请使用论坛的悬赏功能,禁止私下使用微信或支付宝转账【达到1000汤圆悬赏标题置红】
https://www.amobbs.com/forum.php?mod=viewthread&tid=5737448

出16170入6148汤圆

发表于 2020-8-16 16:01:00 来自手机 | 显示全部楼层
帖子上锁。楼主可以重新发悬赏帖子。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 02:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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