OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18926|回复: 31

[转]10种简单的数字滤波算法(C语言源程序)

  [复制链接]

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-3-18 12:51:02 | 显示全部楼层 |阅读模式
其他地方看到的,感觉闲暇时可以看看、、论坛留一份



假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();  

1、限副滤波
/* A值可根据实际情况调整
value为有效值,new_value为当前采样值 
滤波程序返回有效的实际值 */

#define A 10
char value;
char filter()
{
        char new_value;
        new_value = get_ad();
        if ( ( new_value - value > A ) || ( value - new_value > A )
        return value;
        return new_value;

}

2、中位值滤波法
/* N值可根据实际情况调整
排序采用冒泡法*/

#define N 11
char filter()
{
        char value_buf[N];
        char count,i,j,temp;
        for ( count=0;count<N;count++)
        {
                value_buf[count] = get_ad();
                delay();
        }
        for (j=0;j<N-1;j++)
        {
                for (i=0;i<N-j;i++)
                {
                        if ( value_buf>value_buf[i+1] )
                        {
                                temp = value_buf;
                                value_buf = value_buf[i+1]; 
                                value_buf[i+1] = temp;
                        }
                }
        }
return value_buf[(N-1)/2];


3、算术平均滤波法
/*
*/

#define N 12
char filter()
{
        int sum = 0;
        for ( count=0;count<N;count++)
        {
                sum + = get_ad();
                delay();
        }
        return (char)(sum/N);
}

4、递推平均滤波法(又称滑动平均滤波法)
/*
*/

#define N 12 
char value_buf[N];
char i=0;
char filter()
{
        char count;
        int sum=0;
        value_buf[i++] = get_ad();
        if ( i == N ) i = 0;
        for ( count=0;count<N,count++)
        sum = value_buf[count];
        return (char)(sum/N);
}

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
/*
*/

#define N 12
char filter()
{
        char count,i,j;
        char value_buf[N];
        int sum=0;
        for (count=0;count<N;count++)
        {
                value_buf[count] = get_ad();
                delay();
        }
        for (j=0;j<N-1;j++)
        {
                for (i=0;i<N-j;i++)
                {
                        if ( value_buf>value_buf[i+1] )
                        {
                                temp = value_buf;
                                value_buf = value_buf[i+1]; 
                                value_buf[i+1] = temp;
                        }
                }
        }
        for(count=1;count<N-1;count++)
        sum += value[count];
        return (char)(sum/(N-2));
}

6、限幅平均滤波法
/*
*/ 
略 参考子程序1、3


7、一阶滞后滤波法
/* 为加快程序处理速度假定基数为100,a=0~100 */

#define a 50
char value;
char filter()
{
        char new_value;
        new_value = get_ad();
        return (100-a)*value + a*new_value; 
}


8、加权递推平均滤波法
/* coe数组为加权系数表,存在程序存储区。*/

#define N 12
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
        char count;
        char value_buf[N];
        int sum=0;
        for (count=0,count<N;count++)
        {
                value_buf[count] = get_ad();
                delay();
        }
        for (count=0,count<N;count++)
        sum += value_buf[count]*coe[count];
        return (char)(sum/sum_coe);
}


9、消抖滤波法

#define N 12
char filter()
{
        char count=0;
        char new_value;
        new_value = get_ad();
        while (value !=new_value);
        {
                count++;
                if (count>=N) return new_value;
                delay();
                new_value = get_ad();
        }
        return value; 
}

10、限幅消抖滤波法
/*
*/
略 参考子程序1、9
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-3-18 13:36:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-3-19 09:08:01 | 显示全部楼层
謝謝分享
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-10-27
在线时间
0 小时
发表于 2013-4-26 14:45:14 | 显示全部楼层
谢谢分享!哪一种用得多点?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2013-4-27 12:38:15 | 显示全部楼层
回复【4楼】简万樟:
---------------------------------
我通常用中值限幅滤波法,可以较好的抑制随机误差和毛刺干扰信号,但是这个方法的实时性较差,只能用于测一些最高频率较低、变化缓慢的信号。(关于原因,可以查看下相关的嵌入式算法)

如果对实时性要求比较高,可以使用一阶滞后滤波,调节比例,往往可以得到比较好的效果。O(∩_∩)O~
回复 支持 反对

使用道具 举报

68

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2013-5-7
在线时间
28 小时
发表于 2013-6-1 16:39:11 | 显示全部楼层
这对加速度计陀螺仪啥的很有用啊
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2013-6-1 17:34:53 | 显示全部楼层
回复【6楼】maxuejia:
---------------------------------
到处都有用。

如果是说
对加速度计最好进行窗口滤波,
对陀螺仪最好不滤波,不然有滞后现象,陀螺仪短时准确性还是很高的。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2013-6-17 15:17:08 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2612
金钱
2612
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-18 11:05:44 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

16

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2013-12-18
在线时间
64 小时
发表于 2014-8-9 18:43:28 | 显示全部楼层
问一下,那个上面的 》》》value为有效值《《《在单片机里怎么给啊,不是有new_value = get_ad();

那value 等于什么
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2612
金钱
2612
注册时间
2011-1-25
在线时间
176 小时
发表于 2014-11-24 18:14:56 | 显示全部楼层
不错,谢谢分享。
一直努力就很好。
回复 支持 反对

使用道具 举报

5

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2014-7-27
在线时间
1 小时
发表于 2015-6-3 03:17:54 | 显示全部楼层
谢谢分享~!
灯下黑
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-9-25 15:55:42 | 显示全部楼层
不错!谢谢分享!
过你就像过马路!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-18
在线时间
0 小时
发表于 2015-12-28 16:00:42 | 显示全部楼层
不错,谢谢分享
回复 支持 反对

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-6-1
在线时间
21 小时
发表于 2015-12-28 17:32:27 | 显示全部楼层
谢谢分享...
回复 支持 反对

使用道具 举报

2

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2015-12-22
在线时间
85 小时
发表于 2016-1-13 22:00:40 | 显示全部楼层
mark。。
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-18 14:54:09 | 显示全部楼层
nice,cool!
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

12

主题

132

帖子

1

精华

高级会员

Rank: 4

积分
798
金钱
798
注册时间
2015-8-3
在线时间
184 小时
发表于 2016-3-29 14:55:39 | 显示全部楼层
赞!今晚研究下!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-4-1
在线时间
11 小时
发表于 2016-4-2 00:01:22 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2016-1-16
在线时间
15 小时
发表于 2016-5-4 11:43:43 | 显示全部楼层
可以看看匠人日记,写的很详细
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2014-5-12
在线时间
79 小时
发表于 2016-6-24 16:36:35 | 显示全部楼层
有用,谢谢!
回复 支持 反对

使用道具 举报

28

主题

176

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2014-7-1
在线时间
180 小时
发表于 2016-7-26 13:40:49 | 显示全部楼层
mark!
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-5-4
在线时间
15 小时
发表于 2016-9-8 16:47:56 | 显示全部楼层
mark,谢谢楼主!
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2018-9-30
在线时间
45 小时
发表于 2018-10-18 13:52:41 | 显示全部楼层
   第四个   递推平均滤波法(又称滑动平均滤波法)这里sum = value_buf[count]; 应该是sum += value_buf[count]; 吧?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-8
在线时间
6 小时
发表于 2018-10-19 10:13:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-11-2
在线时间
14 小时
发表于 2018-11-9 18:43:52 | 显示全部楼层
65232323
回复 支持 反对

使用道具 举报

0

主题

53

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5921
金钱
5921
注册时间
2017-7-18
在线时间
353 小时
发表于 2019-5-23 09:37:58 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-5-30
在线时间
5 小时
发表于 2020-5-30 11:56:57 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2021-9-8
在线时间
13 小时
发表于 2021-12-20 16:35:29 | 显示全部楼层
6666666666
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2022-3-5
在线时间
3 小时
发表于 2022-3-6 10:24:25 | 显示全部楼层
颇有收获
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2022-3-28
在线时间
3 小时
发表于 2022-3-28 09:12:41 | 显示全部楼层

謝謝分享
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2024-1-22
在线时间
30 小时
发表于 2024-5-28 14:43:37 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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