c语言实现的10种软件滤波方法

软件滤波在嵌入式的数据采集和处理中有着很重要的作用,这10种方法各有优劣,根据自己的需要选择。同时提供了C语言的参考代码,希望对各位能有帮助。(以下10种软件滤波方法转自“匠人的百宝箱”,程序由网友OurWay提供,表示感谢。) ### C语言实现的10种软件滤波方法详解 #### 1. 限幅滤波法(程序判断滤波法) **方法概述:** - **原理:** 设定一个允许的最大偏差值`A`,每次采集的新数据若与上一次的数据差值不超过`A`,则认为新数据有效;否则,新数据视为无效,并使用上一次的有效数据作为当前值。 - **应用场景:** 适用于需要过滤偶然因素导致的脉冲干扰的情况。 **特点:** - **优点:** 可以有效排除偶发的脉冲干扰。 - **缺点:** 对于周期性干扰过滤效果不佳,且平滑度相对较低。 **C语言实现示例:** ```c #define A 10 char value; char filter() { char new_value; new_value = get_ad(); // 假设 get_ad() 是获取新数据的函数 if ((new_value - value > A) || (value - new_value > A)) return value; // 使用旧值 else return new_value; // 使用新值 } ``` --- #### 2. 中位值滤波法 **方法概述:** - **原理:** 连续采集`N`次数据,将这些数据按大小顺序排列,取中间值作为有效值。 - **应用场景:** 适合用于排除因偶然因素造成的波动干扰,特别适用于变化较为缓慢的参数如温度和液位。 **特点:** - **优点:** 能够有效过滤波动干扰,对于变化缓慢的参数特别有效。 - **缺点:** 不适用于变化快速的参数如流量和速度。 **C语言实现示例:** ```c #define N 11 char filter() { char value_buf[N]; for (int count = 0; count < N; count++) { value_buf[count] = get_ad(); // 假设 get_ad() 是获取新数据的函数 delay(); // 假设 delay() 用于延时 } // 冒泡排序 for (int j = 0; j < N - 1; j++) { for (int i = 0; i < N - j - 1; i++) { if (value_buf[i] > value_buf[i + 1]) { char temp = value_buf[i]; value_buf[i] = value_buf[i + 1]; value_buf[i + 1] = temp; } } } return value_buf[(N - 1) / 2]; // 返回中间值 } ``` --- #### 3. 算术平均滤波法 **方法概述:** - **原理:** 连续采集`N`次数据,对这`N`次数据求算术平均值作为有效值。 - **应用场景:** 适用于一般的随机干扰,特别是那些具有一个平均值并在某个数值范围内波动的信号。 **特点:** - **优点:** 对一般的随机干扰有很好的过滤效果。 - **缺点:** 对于需要快速响应的实时控制系统不太适用,因为其计算过程相对较慢。 **C语言实现示例:** ```c #define N 12 char filter() { int sum = 0; for (int count = 0; count < N; count++) { sum += get_ad(); // 假设 get_ad() 是获取新数据的函数 delay(); // 假设 delay() 用于延时 } return (char)(sum / N); // 返回平均值 } ``` --- #### 4. 递推平均滤波法(滑动平均滤波法) **方法概述:** - **原理:** 将连续采集的`N`次数据看作一个循环队列,每次新数据到来后,队列尾部加入新数据并移除队列头部的老数据,然后对队列中的`N`个数据求算术平均值作为有效值。 - **应用场景:** 适用于需要过滤周期性干扰的场合,尤其适合高频振荡的系统。 **特点:** - **优点:** 对周期性干扰有很好的抑制作用,平滑度高。 - **缺点:** 对于偶然出现的脉冲干扰过滤效果较差。 **C语言实现示例:** ```c #define N 12 char value_buf[N]; char i = 0; char filter() { char count; int sum = 0; value_buf[i++] = get_ad(); // 假设 get_ad() 是获取新数据的函数 if (i == N) i = 0; for (count = 0; count < N; count++) { sum += value_buf[count]; } return (char)(sum / N); // 返回平均值 } ``` --- #### 5. 中位值平均滤波法(防脉冲干扰平均滤波法) **方法概述:** - **原理:** 结合了中位值滤波法和算术平均滤波法,即先进行中位值滤波去除最大值和最小值,然后对剩余的`N-2`个数据求算术平均值。 - **应用场景:** 适合用于排除偶发的脉冲干扰。 **特点:** - **优点:** 结合了两种滤波法的优点,能够较好地排除脉冲干扰。 - **缺点:** 计算过程较慢,不适合需要快速响应的应用场景。 **C语言实现示例(未完成部分):** ```c #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(); // 假设 get_ad() 是获取新数据的函数 delay(); // 假设 delay() 用于延时 } // 冒泡排序 for (j = 0; j < N - 1; j++) { for (i = 0; i < N - j - 1; i++) { if (value_buf[i] > value_buf[i + 1]) { char temp = value_buf[i]; value_buf[i] = value_buf[i + 1]; value_buf[i + 1] = temp; } } } // 移除最大值和最小值 sum = 0; for (count = 1; count < N - 1; count++) { sum += value_buf[count]; } return (char)(sum / (N - 2)); // 返回平均值 } ``` 以上介绍的五种滤波方法是嵌入式系统中常用的软件滤波手段,每种方法都有其独特的适用场景和优缺点。选择合适的滤波方法能够显著提高数据采集的准确性和可靠性。


















剩余6页未读,继续阅读

- 白兰弟2013-03-27简述了一些常见的简单滤波,有用

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 石油化工企业设计防火规范》(2009版).doc
- 大厦简介2.0修改状态(0次).doc
- 合同副经理与合同部长责任书(样本).docx
- 2015年全国研究生数学建模竞赛B题《数据的多流形结构分析》论文及附件。.zip
- 高气压对机体的影响(1).pptx
- 9衡重式下挡墙施工技术交底(000).doc
- 城市地下综合管廊案例-20151013-培训课件.pptx
- 新疆柯坪县群众文化中心工程建设监理月报.doc
- 公路造价确定与控制200道练习题.doc
- mpvue框架仿滴滴出行微信小程序.zip
- 房屋入住流程图.docx
- S-工程建设标准强制性条文.doc
- 【风险预案】血液透析风险预案完整版.pdf
- 小学语文作业布置出题网站源码简单方便的作业练习册随机出题网站源码支持打印
- 两个做给健身房预约课程的微信小程序.zip
- [江苏]商住综合体项目可行性分析报告(97页-图文结合详述)1.doc


