热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数字带通滤波器c语言程序,实现数字滤波的C语言程序

在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动

在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的

信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动检测系统中,为了提高采样的可靠性,减少虚假信息的影响,常常采用数字滤波的方法。

数字滤波的方法有很多种,可以根据不同的测量参数进行选择。下面给出几种常用的数

字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo C 2.0编制而成,在研华PC-610/386机上均编译通过,适用于PC机及其兼容机。

1.程序判数滤波

采样的信号,如因常受到随机干扰传感器不稳定而引起严重失真时,可以采用此方法。方法是:根据生产经验确定两交采样允许的最大偏差△×,若先后两次采样的信号相减数值大于△×,表明输入的是干扰信号,应该去掉;用上次采样值作为本次采样值,若小于、等于△×表明没有受到干扰,本次采样值效。该方法适用于慢变化的物理参数的采样,如温度、物理位置等测量系统。

程序判断滤波的C程序函数如下:

float

program_detect_filter(float old_new_value[], float X)

{

float

sample_value;

if

(fabs(old_new_value[1]_old_new_value[0])>X)

sample_value=old_new_value[0];

else

sample_value=old_new_value[1];

retrun(sample_value);

}

函数调用需一个一维的两个元素的数组(old_new_value[2],用于存放上次采样值(old_new_value[0],)和本次采样值(old_new_value[1],),函数中sample_value表示有效采样值,X表示根据根据经验确定的两次采样允许的最大偏差△×。

2、中值滤波

中值滤汉是对某一参数连续输入N次(一般N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。

中值滤波的C程序函数如下:

float

middle_filter(float middle_value [] , intcount)

{

float

sample_value, data;

int i,

j;

for (i=1;

i for(j=count-1; j>=i,--j){

if(middle_value[j-1]=middle_value[j]{

data=middle_value[j-1];

middle_value[j-1]=middle_value[j]

middle_value[j]=data;

}

}

sample_value=middle_value(count-1)/2];

return(sample_value);

}

函数假设对某一参数连续采样3次,若多次采样,可

对该函数稍作修改即可。3次采样值存储在数组mddle_value[3],其中Sample-value表示有效采样值,count表示连续采样次。

3、滑动算术平均值滤波

滑动算术平均值滤波是设一循环队列,依顺序存放N次采样数据,每次数据采集时,先将放在队列中第一个最早采集的数据丢掉,再把新数据放入队尾,然后求包括新数据在内的N个数据的算术平均值,便得到该次采样的有效数据。该方法主要用于对压力、流量等周期脉动的采样值进行平滑加工处理。

滑动算术平均值滤波C程序函数如下:

float

move_average_filtaer(float data_buf[], int count)

{

float

sample_vaue,data=0;

int

i;

for (i=0;i

data+=data_buf[i];

sample_value=data/count;

return(sample_value;

}

函数假设顺序存放5次采样数据的数据缓冲区data_buf[5],对于多于5次的滑动算术平

均滤波,只需对该函数稍作修改即可,其中sample_value表示本次采样的有效数据,count表示数据有样次数。

4.滑动加权平均值滤波

滑动加权平均滤波是设一个数据缓冲区依顺序存放N次采样数据,

每采进一个新数据,就将最先采集的数据丢掉,而后求包括新数据在内的N个数据的加权平均值,便得到该次采样的有效数据。该方法对脉冲性干扰的平滑作用尚不理想,不适用于脉冲性干扰比较严重的场合。

滑动加权平均值滤波的C程序函数如下:

floa

move_times_filter(float data _buf [])

{

float

sample_value;

float

filter_k[3]={0.3,0.2,0.15》;

sample_value=filter_k[0]*data_buf[2]+filter_k[1]*(data_buf[1]

+data_buf[3])+filter_k[2]*(data_buf[0]+data_buf[4;

return(sample_value);

}

函数假设依次存放5次采样数据的数据缓冲区data_buf[5],对于多于5次的滑动加权平均滤波,只需对该函数稍作修改即可,其中数据组filter_k[3]表示加权系数,这三个系数的关系为filter_k[0]+2*filter_k[1]+2*filter_k[2]=1,本次采样的有效数据用sample_value表示。

5、防脉冲干扰平均值滤波

防脉冲干扰平均值滤波是连续进行N次采样,去掉其中最大值和最小值,然后求剩下的N-2个数据的平均值,作为本次采样的有效值。该方法适用于变量跳变比较严重的场合。这种滤波也应用边采样边计算的方法。

float

max_min_chioce(float x_buffer[],int number

{

int

max_value, min_value;

float

sample_value=0.0;

int

i;

max_value,

=x_buffer[o];

min_value=x_buffer[0];

for(i=1;i){

if(x_buffer[i]>max_value)max_value=x_buffer[i];

if(x_buffer[i] }

for(i=0; i

sample_value=(sample_value_max_value_min_value)/(number-2);

return(sample_value);

}

函数假设存放连续进行5次采样的数据缓冲区data_buf[5],对于多于5次的防脉冲干扰平均值滤波,只需对该函数稍作修改即可,其中Sample_value表示本次采样的有效数据,number表示连续进行的采样次数。

6、低通数字滤波

低通滤波也称一阶滞后滤波,方法是第N次采样后滤波结果输出值是(1-a)乘第N次采样值加a乘上次滤波结果输出值。可见a<<1。该方法适用于变化过程比较慢的参数的滤波的C程序函数如下:

float

low_filter(float low_buf[])

{

float

sample_value;

float

X=0.01;

sample_value=(1_X)*low_buf[1]+X*low buf[0];

retrun(sample_value);

}

函数假设求第2次采样后滤波结果输出值sampe_valeu,数组low_buf[2]表示存放上次滤

波结果输出值(low_buf[0])和本次采样值(low_buf[1]),X表示a。

为方便以上几种滤波函数的理解,下面给出调用以上函数的程序例。

#include

#include

#include

main()

{

folat

old_new_buf[2]={1.2,2.6};

float

middle_value[3]={20,12,18};

float

data_average_buf[5]={10,20,20,10,10};

float

data_times_buf[5]={1.4,1.5,1.3,1.2,1.0};

float

data_max_min_buf[5]={1.2,80,1.4,0.2,1.3};

foat

low_buf[2]={1.2,2.0};

float

xx;

xx=program_detect_filter(old_new_buf,1.0};

printf("The program detect filter value

is:%f\n",xx);

xx=middle_filter (middle_value, 3);

printf("The middle filter value is:%f\n:,xx);

xx=move_avergae_filter(data_avergae_buf,5);

printf("the mover average filter value

is:%f\n",xx);

xx=move_times_filter(data_time_fud);

printf("The move times filter value

is:%f\n",xx);

xx=max_min_choice(data_max_min_buf,5);

printf("The max-min filter value is:%f\n",xx);

xx=low_filter(low_buf);

printf("The low filter value is:%f\n",xx);

}

运行执行程序,屏幕显示:

The

program detect filter value is: 1.200000

The middle

filter value is:18.000000

The move

average filter value is:14.000000

The move

times filter value is:1.310000

The

max_min filter value is:1.366666

The low

filter value is:1.992000

zhajisuo

2009-9-05

10:58:25

数字滤波器与模拟滤波器的区别主要在于一个是采用软件(程序)的数值计算(数字滤波器),另外一个是采用硬件电路获得(模拟滤波器)。

数字滤波器的原理有多种,取平均值是其中的一种。取平均值就是滤除任何有具有频率的变化分量的信号。数字滤波器还可根据不同原理编制专门的程序,对采集的信号进行特殊的计算来滤除特定频率的信号。

模拟滤波器的原理主要是利用电容器对高频信号的低阻抗、对低频信号的高阻抗和电感对对低频信号的低阻抗、对高频信号的高阻抗的特性,滤除特定频率的信号。



推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 本文详细探讨了C语言中指针的概念,特别是指针在变量和数组中的应用。通过实例讲解,帮助读者更好地掌握指针的使用方法。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • C语言标准及其GCC编译器版本
    编程语言的发展离不开持续的维护和更新。本文将探讨C语言的标准演变以及GCC编译器如何支持这些标准,确保其与时俱进,满足现代开发需求。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
author-avatar
劳资就是若听_979
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有