OpenEdv-开源电子网

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

滤波算法怎么设计,C语言的数据块、数组吗?完全晕 几乎搜不到滤波算法实例

[复制链接]

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-4-5
在线时间
0 小时
发表于 2015-6-8 16:40:35 | 显示全部楼层 |阅读模式
5金钱
求大神指点如何设计滤波算法的思想和实例,多谢

最佳答案

查看完整内容[请看2#楼]

论坛搜索,我发过
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-6-8 16:40:36 | 显示全部楼层
博观而约取,厚积而薄发。
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2015-6-9 04:54:22 | 显示全部楼层
在网上买一本【感悟设计】这本书,来看一下,上面有关于10种软件滤波的算法详解,我也是从上面学到的,以下是我用于工程中的一段代码,希望对你有用

/********************************************************************************************
函数名:GlideValueFilter() 8次递推(滑动)平均滤波法+一阶滞后滤波法
调  用:GlideValueFilter()
参  数:当前ADC转换的结果值
返回值:滤波后的ADC采样值
说  明: ADC_POWRE[]当前函数用来保存数据的数组,属于全局变量
        OLD_DATA 前一次采样的结果(全局变量)
        一阶滞后滤波系数取64
        result 本次采样的新数据
/*******************************************************************************************/
void GlideValueFilter(unsigned char ch)
     {
     unsigned int Sum,NEW_DATA;
     unsigned char FX,i,ChaZhi;
     ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch | ADC_START;
     _nop_();    //等待4个NOP
     _nop_();
     _nop_();
     _nop_();
     while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成
     ADC_CONTR &= ~ADC_FLAG; //Close ADC
     ADC_Dat[8] = ADC_RES; //采样数据,放到数组的最高位
     Sum = 0;
     for(i = 0; i < 8; i++)
        {
        ADC_Dat=ADC_Dat[i+1];//所有数据左移,低位去掉
        Sum += ADC_Dat; //求和
        }
     NEW_DATA = Sum/8; //求平均值
     if(NEW_DATA < OLD_DATA) //如果新采样值小于前次采样值
       {
       FX = 0; //记录数据变化方向
       ChaZhi = OLD_DATA - NEW_DATA;
       OLD_DATA -= (ChaZhi*XiShu +128)/256; //+128是为了四舍五入
       }
     else{
         if(NEW_DATA > OLD_DATA) //如果新采样值大于前次采样值
           {
           FX = 1; //记录数据变化方向
           ChaZhi = NEW_DATA - OLD_DATA;
           OLD_DATA += (ChaZhi*XiShu +128)/256; //+128是为了四舍五入
           }
         }
     //动态调节滤波系数
     if(FX != FangXiang){JiShuQi = 0; XiShu = 0;}//两次变化的方向不同,清零计数器及滤波系数
     else{
         if(ChaZhi > ZUIDACHAZHI)JiShuQi += 3;  //差值1大于阈值,计数器加3
         else JiShuQi++;  //计数器加1
         if(JiShuQi >JISHUZUIDAZHI) //计数器已达最大值
           {
           XiShu += ZENGLIANG; //调整一阶滤波系数
           if(XiShu > 255)XiShu = 255; //如果已达最大值,则取最大值
           JiShuQi = 0; //消抖计数器清零
           }
         }
     FangXiang = FX; //保存当前次的变化方向
     }

滤波后的值在【OLD_DATA】中

程序中还需三个全局变量

unsigned char data FangXiang = 0;         //方向(静态变量)
unsigned char data JiShuQi = 0;              //计数器(静态变量)
unsigned char data XiShu = 128;            //滤波系数(静态变量)

#define ZENGLIANG      15u                   //动态一阶滤波系数增量值
#define JISHUZUIDAZHI  10u                 //动态一阶滤波消抖动计数器最大值
#define ZUIDACHAZHI    10u                 //两次结果的差值
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-7-13
在线时间
10 小时
发表于 2015-6-9 14:39:48 | 显示全部楼层
新值=旧值*(1-系数)+采样值*系数
系数为采样值对结果的作用强度在0~1之间
回复

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-4-5
在线时间
0 小时
 楼主| 发表于 2015-6-9 17:06:02 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
没搜到 请问搜什么合适
回复

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-4-5
在线时间
0 小时
 楼主| 发表于 2015-6-9 17:06:21 | 显示全部楼层
回复【3楼】likunxue:
---------------------------------
非常感谢
回复

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-4-5
在线时间
0 小时
 楼主| 发表于 2015-6-9 17:06:54 | 显示全部楼层
回复【4楼】害羞的大象:
---------------------------------
谢谢 有说明吗  没看懂
回复

使用道具 举报

3

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-20
在线时间
7 小时
发表于 2015-6-9 17:13:40 | 显示全部楼层
点进去看二楼的主题贴就好了
http://blog.csdn.net/kiti1013 人都有梦 在遥远的未来
回复

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-4-5
在线时间
0 小时
 楼主| 发表于 2015-6-9 22:36:15 | 显示全部楼层
回复【8楼】kiti1013:
---------------------------------
嗯  谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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