xiatao1800 发表于 2020-6-25 16:09:25

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

需求高手帮我看一段150行滤波算法,我看得云里雾里,不知道有没有用,谁能帮我理清原理思路,给我结构图和注释,红包500,能提出改进另说

lb0857 发表于 2020-6-25 17:14:23

#include "hx711.c"


#definewtime2               30      
#definewdtm               35      
ucharidata wtime0=6 ;   //默认值5,6,10    震动值
ucharidata wtime1=5 ; //5,5,10
ucharidata wtime4=2 ;//2,2,5
uchar idata   fash1 ;//默认值4,5, 8,10,10,12 缓冲区值
uchar idata   fash2 ;//默认值8,10,12,12,15,18          
uchar idata   fash3 ; //默认值10,12,15,20,15,20
uchar idatamer1 ; //默认值100,150,250   震动值        
uchar idatamer2 ; //默认值80,100,180           
uchar idatamer3 ; //默认值40,50,100

bit   pick;   
bit   f_bit6;   
bit   stab2;         
unsigned long idata   ad_out;
xdata unsigned longadbuff;               
xdata unsigned longadw_li;
idata unsigned longi1c,i21;         
idata unsigned longls_li;
idata unsigned longls_lei;
unsigned char ch_12,ch_13,ch_14,ch_15,ch_16,ch_17,ch_11;       


unionadhc
{
        unsigned longmr;
        unsigned charmr1;
}ad;

////////////////////////////
void InitFilter (void)//滤波参数初始化         
{
        ch_13=1;
        ch_14=1;
        ch_17=wtime2;
}
void load_adbuff(void)
{
        uchar i;
        for(i=0;i<50;i++)
        {
                adbuff=ad_out;
        }
}

unsigned long int madd(unsigned char n1,unsigned char n2)//累计数据
{
        unsigned char loop;
        ls_lei = 0;
        for (loop = 0; loop<n2; loop++)
        {
                ls_lei= ls_lei + adbuff;
                n1++;
        }
        return(ls_lei);
}

void move(unsigned char dest,unsigned char num)//数值向右移位
{
        unsigned char loop,sour;
        sour = dest + 1;
        for (loop = 0; loop < num; loop++)
        {
                adbuff = adbuff;
                dest++;
                sour++;
        }
}

////////////////////////////
voidmaic( void )   
{
        move(0,fash1);//移位,去掉最低位的数据,从第一参数开始移第一参数个数据
        adbuff =ad.mr;        //加入新数据
        ad.mr = madd(0,fash1);//累加数据,从数据0开始,
        ad.mr=ad.mr/fash1;//求平均
        ls_li = ad.mr;
        ls_li = ls_li - i21;
        if (ls_li > 0x80000000)
        {
                ls_li = -ls_li;
        }
    if(ls_li > mer1)
        {
                ch_13--;                       
                if (ch_13!=0)
                {
                        return;       
                }
                else
                {
                        ch_13 = 1;
                        ch_14 = 1;
                        ch_15 = 1;
                        ch_16 = 1;                       
                        ch_11 = 1;       
                        ch_12=1;
                        ch_17=1;
                }
        }
        else
        {               
                if ( (ch_14 ^ fash2) !=0 )
                {
                        ch_14++;
                }
                else
                {
                        ch_13 = wtime0;
                }               
        }

        move(fash1,fash2);
        adbuff = ad.mr;       
        ad.mr = madd(fash1+fash2-ch_14,ch_14);
        ad.mr= ad.mr / ch_14;
        ls_li = ad.mr;
        f_bit6=0;
        ls_li = ls_li - i21;
        if ( ls_li > 0x80000000 )
        {
                ls_li = -ls_li;
                f_bit6=1;       
        }
        i21 = ad.mr;
//////////////////////
        if (ls_li>mer2)
        {
                ch_15--;
                if (ch_15 != 0)
                {
                        return;
                }
                else
                {
                        ch_15 = 1;
                        ch_16 = 1;
                        ch_11 = 1;       
                        ch_12=1;
                        ch_17=1;                       
                }               
        }
        else
        {                                       
                if ( (ch_14 ^ fash2) == 0)
                {       
                        ls_li = ls_li >> 1;
                        if ( f_bit6 != 0)
                        {
                                ad.mr = ad.mr - ls_li;
                        }
                        else
                        {
                                ad.mr = ad.mr + ls_li;
                        }               
                        if ((ch_16 ^ fash3) !=0)
                        {
                                ch_16++;
                        }
                }
        }
        move(fash1+fash2, fash3);
        adbuff = ad.mr;
        ad.mr = madd(fash1+fash2+fash3-ch_16,ch_16);
        ad.mr =ad.mr / ch_16;
        i21 = ad.mr;
        ls_li =ad.mr;       
        ls_li = ls_li - adw_li;
        if (ls_li > 0x80000000)   
                ls_li = -ls_li;
        if (ls_li > mer3)
        {               
                gotocal16;
        }
        else
        {       
                gotocal17;
        }
cal16:
        ch_11--;
        stab2=0;
        if (ch_11!=0)
        {
                return;
        }
        else
        {
                ch_11=1;                       
                ch_12=1;       
                ch_17=1;               
                gotocal18;       
        }
cal17:
        if ((ch_16^fash3) !=0)
        {               
                goto cal16;
        }
        ch_15 = wtime1;
        ch_11 = wtime4;
        ch_12++;
        stab2 = 1;
        if ( (ch_12 ^wdtm) !=0 )
        {
                gotocal18;
        }       
        ch_12 =wdtm;
        i1c = i1c + ad.mr;
        ch_17--;
        if (ch_17!=0)
        {               
                return;
        }
        ad.mr = i1c / wtime2;
        adw_li = adw_li +ad.mr;
        adw_li = adw_li >> 1;
        i21 = adw_li;
cal18:               
        adw_li=i21;            
        ad_out = adw_li;
        i1c = 0;
        pick = 1;            
        ch_17 = wtime2;         
}

void read_ad(void)
{
    HX_OUT1=1;
    HX_CLK1=0;
    if (HX_OUT1==0)
        {
                ad.mr =hx711_ad();//AD采样
                maic();//滤波
        }               
}


//楼主,应用场景说一下呗   或许原作者就在论坛哦



xiatao1800 发表于 2020-6-25 18:19:59

称重仪表滤波程序

sandeant 发表于 2020-6-25 19:39:48

三次滑动平均,后两次平均数长度可变。

jaywen 发表于 2020-6-25 19:42:54

{:lol:}看起来不错

EMC菜鸟 发表于 2020-6-25 19:47:29

这种滤波算法的理论是什么?

simplorer 发表于 2020-6-25 20:55:34

mark,滤波算法。

xiatao1800 发表于 2020-6-25 22:33:42

sandeant 发表于 2020-6-25 19:39
三次滑动平均,后两次平均数长度可变。

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

jetbo 发表于 2020-6-25 22:46:47

mark,滤波算法+1

我是一个大白菜 发表于 2020-6-25 23:30:07

滤波算法,mark

散吧散吧 发表于 2020-6-25 23:41:26

是不是使用了低通滤波器的计算手法?如果是的话可以使用相关的仿真软件看下低通滤波器的相关参数和频率响应情况

sandeant 发表于 2020-6-26 08:44:49

数据变动大时,滤波长度小。数据平稳时,长度递增,至设定值。兼具数据的快速性,和稳定性。

xiaomu 发表于 2020-6-26 09:38:15

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

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

122402902 发表于 2020-6-26 09:44:46

lb0857 发表于 2020-6-25 17:14


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

lb0857 发表于 2020-6-26 10:03:32

二楼是开玩笑的,其实楼主重点介绍一下使用产品情况   ad采集的量类型是那种等等大伙群策群力 或许解决不了问题但是提供很好思路呢

cmy043 发表于 2020-6-26 10:09:58

看起来很不错,应该有很多地方能使用到

BigWolf 发表于 2020-6-26 11:12:23

下载分析一下,看起来很不错。

xiatao1800 发表于 2020-6-26 14:32:37

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

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

hy2515131 发表于 2020-6-26 15:36:54

MARK
称重仪表滤波算法,这个是惯性滤波和平滑滤波算法把?

happymav 发表于 2020-6-26 17:54:22

就是个加权滑动平均吧 这个实际使用的时候要根据你的对象调整参数的

lb0857 发表于 2020-6-26 19:23:24

加权递推平均滤波法.不同时刻的数据加以不同的权,通常是,越接近现时刻的资料,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。适用于有较大纯滞后时间常数的对象和采样周期较短的系统。

yunqing_abc 发表于 2020-6-26 23:48:28

mark 滤波算法

sipure 发表于 2020-6-27 14:37:21

看了一下,这句似乎是错的.应该是ch_12--;

cc1987 发表于 2020-6-27 18:10:54

学习了~~

xiatao1800 发表于 2020-6-27 21:11:20

sipure 发表于 2020-6-27 14:37
看了一下,这句似乎是错的.应该是ch_12--;

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

mculjf 发表于 2020-6-28 08:58:45

MARK C语言滤波算法

ldj7501 发表于 2020-6-28 10:51:50

MARK C语言滤波算法

zzz123456 发表于 2020-6-28 21:00:44

称重滤波算法,学习一下

myrgb 发表于 2020-6-28 21:39:39

期待高手分析下,看起来很不错

waymcu 发表于 2020-6-29 00:49:11

本帖最后由 waymcu 于 2020-6-29 00:50 编辑

学习,学习!

ibichao 发表于 2020-7-3 16:37:15

收藏一下

danfeidie 发表于 2020-7-23 10:28:40

顶起来,等高手分析

smilepppp 发表于 2020-7-29 11:27:04

滤波算法

pcwinner 发表于 2020-7-29 16:34:22

{:smile:}先收下,有空研究!

gao5528 发表于 2020-7-29 20:08:15

高手,过来解释下。

wx85105157 发表于 2020-7-29 23:35:37

LZ看懂了没有?出来解答下呗

honger518 发表于 2020-7-29 23:43:28

滤波算法 mark

maxbang 发表于 2020-8-1 17:43:01

标记下,称重滤波算法,以后也许用到,等大佬回答

fengyunyu 发表于 2020-8-2 12:45:29

称重滤波算法

蛋定 发表于 2020-8-16 15:38:54

称重滤波算法

armok. 发表于 2020-8-16 16:00:31

有偿求助”的帖子,请使用论坛的悬赏功能,禁止私下使用微信或支付宝转账【达到1000汤圆悬赏标题置红】
https://www.amobbs.com/forum.php?mod=viewthread&tid=5737448

armok. 发表于 2020-8-16 16:01:00

帖子上锁。楼主可以重新发悬赏帖子。
页: [1]
查看完整版本: 谁能帮我看一段150行C语言滤波算法,红包酬谢