数字滤波器

在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动检测系统中,为了提高采样的可靠性,减少虚假信息的影响,常常采用数字滤波的方法。
    数字滤波的方法有很多种,可以根据不同的测量参数进行选择。下面给出几种常用的数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo C 2.0编制而成,在研华IPC-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次采样值存储在数组middle_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<count; i++)
        data += data_buf[i];
    sample_value = data/count;
    return(sample_value);
}
    函数假设顺序存放5次采样数据的数据缓冲区data_buf[5],对于多于5次的滑动算术平均滤波,只需对该函数稍作修改即可,其中sample_value表示本次采样的有效数据,count表示数据有样次数。
4、滑动加权平均值滤波滑动加权平均滤波是设一个数据缓冲区依顺序存放N次采样数据,每采进一个新数据,就将最先采集的数据丢掉,而后求包括新数据在内的N个数据的加权平均值,便得到该次采样的有效数据。该方法对脉冲性干扰的平滑作用尚不理想,不适用于脉冲性干扰比较严重的场合。
    滑动加权平均值滤波的C程序函数如下:
float 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[0];
    min_value = x_buffer[0];
    for(i=1; i<number; i++){
        sample_value += x_buffer[i];
        if(x_buffer[i]>max_value)
            max_value=x_buffer[i];
        if(x_buffer[i]<min_value)
            min_value=x_buffer[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()
{
    float 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第l章 数字信号处理引言 1.1 引言 1.2 数字信号处理起源 1.3 信号域 1.4 信号分类 1.5 DSP:一个学科 第2章 采样原理 2.1 引言 2.2 香农采样原理 2.3 信号重构 2.4 香农插值 2.5 采样方法 2.6 多通道采样 2.7 MATLAB音频选项 第3章 混叠 3.1 引言 3.2 混叠 3.3 圆判据 3.4 IF采样 第4章 数据转换和量化 4.1 域的转换 4.2 ADC分类 4.3 ADC增强技术 4.4 DSP数据表示方法 4.5 量化误差 4.6 MAC单元 4.7 MATLAB支持工具 第5章 z变换 5.1 引言 5.2 z变换 5.3 原始信号 5.4 线性系统的z变换 5.5 z变换特性 5.6 MATLAB z变换设计工具 5.7 系统稳定性 5.8 逆z变换 5.9 赫维赛德展开法 5.10 逆z变换MATLAB设计工具 第6章 有限冲激响应滤波器 6.1 引言 6.2 FIR滤波器 6.3 理想低通FIR滤波器 6.4 FIR滤波器设计 6.5 稳定性 6.6 线性相位 6.7 群延迟 6.8 FIR滤波器零点位置 6.9 零相位FIR滤波器 6.10 最小相位滤波器 第7章 窗函数设计法 7.1 有限冲激响应综述 7.2 基于窗函数的FIR滤波器设计 7.3 确定性设计 7.4 数据窗 7.5 基于MATLAB窗函数的FIR滤波器设计 7.6 Kaiser窗函数 7.7 截尾型傅里叶变换设计方法 7.8 频率采样设计法 第8章 最小均方设计方法 8.1 有限冲激响应综述 8.2 最小二乘法 8.3 最小二乘FIR滤波器设计 8.4 MATIAB最小均方设计 8.5 MATLAB设计对比 8.6 PRONY方法 第9章 等波纹设计方法 9.1 等波纹准则 9.2 雷米兹交换算法 9.3 加权等波纹FIR滤波器设计 9.4 希尔伯特等波纹FIR滤波器 9.5 等波纹滤波器阶次估计 9.6 MATLAB等波纹FIR滤波器实现 9.7 LpFIR滤波器设计 9.8 基于Lp范数的MATLAB滤波器设计 第10章 FIR滤波器特例 10.1 引言 10.2 滑动平均FIR滤波器 10.3 梳状FIR滤波器 10.4 L波段FIR滤波器 10.5 镜像FIR滤波器 10.6 补码FIR滤波器 10.7 频率抽样滤波器组 10.8 卷积平滑FIR滤波器 10.9 非线性相位FIR滤波器 10.10 Farrow FIR滤波器 第11章 FIR的实现 11.1 概述 11.2 直接型FIR滤波器 11.3 转置结构 11.4 对称FIR滤波器结构 11.5 格型FIR滤波器结构 11.6 分布式算法 11.7 正则符号数 11.8 简化加法器图 11.9 FIR有限字长效应 11.10 计算误差 11.11 缩放 11.12 多重MAC结构 第12章 经典滤波器设计 12.1 引言 12.2 经典模拟滤波器 12.3 模拟原型滤波器 12.4 巴特沃斯原型滤波器 12.5 切比雪夫原型滤波器 12.6 椭圆原型滤波器 12.7 原型滤波器到最终形式的转换 12.8 其他IIR滤波器形式 12.9 PRONY(PADE)法 12.10 尤尔—沃尔 第13章 无限冲激响应滤波器设计 13.1 引言 13.2 冲激响应不变法 13.3 冲激响应不变滤波器设计 13.4 双线性z变换法 13.5 翘曲 13.6 MATLAB IIR滤波器设计 13.7 冲激响应不变与双线性z变换IIR对比 13.8 最优化 第14章 状态变量滤波器模型 14.1 状态空间系统 14.2 状态变量 14.3 模拟仿真 14.4 MATLAB仿真 14.5 状态变量模型 14.6 基变换 14.7 MATLAB状态空间 14.8 转置系统 14.9 MATLAB状态空间算法结构 第15章 数字滤波器结构 15.1 滤波器结构 15.2 直Ⅰ、Ⅱ型结构 15.3 直Ⅰ、Ⅱ型IIR滤波器的MATLAB相关函数 15.4 直Ⅰ、Ⅱ型结构的MATLAB实现 15.5 级联型结构 15.6 一阶、二阶子滤波器 15.7 一阶、二阶子滤波器的MATLAB实现 15.8 并联型结构 15.9 级联/并联型结构的MATLAB实现 15.10 梯型/格型IIR滤波器 第16章 定点效应 16.1 背景 16.2 定点系统 16.3 溢出(饱和)效应 16.4 算法误差 16.5 系数敏感度 16.6 二阶子滤波器 16.7 标准IIR滤波器 16.8 缩放 16.9 极限环振荡 第17章 IIR结构分析 17.1 溢出范 17.2 Lp范数界 17.3 L2溢出预 17.4 L2范数测定 17.5 L2范数的附加说明 17.6 L∞范数界 17.7 L1范数界 17.8 噪声功率增益 17.9 基于状态空间的噪声分析 17.10 相似变换 第18章 多采样率系统简介 18.1 背景 18.2 抽取 18.3 插值 18.4 采样率转换 18.5 多相表示法 18.6 子带滤波器 18.7 MATLAB 第19章 多采样率滤波器 19.1 引言 19.2 离散傅里叶变换(DFI)滤波器组 19.3 L波段滤波器 19.4 正交镜像滤波器 19.5 多相表达式 19.6 掩频滤波器 19.7 级联积分梳状滤波器(CIC) 附录一 MATLAB 附录二 词汇表 附录三 中英文对照 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值