数据滤波处理

时间:2021-10-30 16:13:12

转载:以下内容转自论文,出处太多,不详。

在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动检测系统中,为了提高采样的可靠性,减少虚假信息的影响,常常采用数字滤波的方法。 数字滤波的方法有很多种,可以根据不同的测量参数进行选择。

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

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

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

4、滑动加权平均值滤波滑动加权平均滤波是设一个数据缓冲区依顺序存放N次采样数据,每采进一个新数据,就将最先采集的数据丢掉,而后求包括新数据在内的N个数据的加权平均值,便得到该次采样的有效数据。该方法对脉冲性干扰的平滑作用尚不理想,不适用于脉冲性干扰比较严重的场合---加权递推平均滤波法。

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

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

 

 以上方法很多专家发表过,并有很多书籍有这方面的讲解。很常识的基本应用方法。

总结:

其实实际应用中,大多都是算术平均滤波,即连续取N个采样值进行平均运算,或者再混合以上的软件滤波处理方法。


在音视频方面的应用技术

数字高通滤波

数字离通滤波digital high passing filtering用数字电路或数字算法(时间离散算法)实现,只容许输人信号中高频分量通过,而将低频分量除去的方法或过程。

http://blog.jobbole.com/58246理解快速傅里叶变换(FFT)算法

http://blog.csdn.net/goodchoes/article/details/48622795一幅图弄清DFT与DTFT,DFS的关系

http://blog.csdn.net/syrchina/article/details/11731325FIR数字滤波器C语言

http://blog.csdn.net/xiao2yizhizai/article/details/51026151/

滤波软件算法主要是求平均值,常用方式是设置联合体与移位运算进行快捷明了的编程。

移位运算的应用

转载:http://peter8015.iteye.com/blog/2080397 

五、应用举例

     1、判断int型变量a是奇数还是偶数           

        a&1 = 0 偶数

        a&1 = 1 奇数

     2、取int型变量a的第k (k=0,1,2……sizeof(int)),即a>>k&1

     3、将int型变量a的第k位清0,即a=a&~(1<<k)

     4、将int型变量a的第k位置1 a=a|(1<<k)

     5int型变量循环左移k次,即a=a<<k|a>>16-k   (sizeof(int)=16)

     6int型变量a循环右移k次,即a=a>>k|a<<16-k   (sizeof(int)=16)

     7、整数的平均值

        对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

        int average(int x, int y)   //返回X,Y 的平均值

        {   

              return (x&y)+((x^y)>>1);

        }

     8、判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

        boolean power2(int x)

        {

            return ((x&(x-1))==0)&&(x!=0)

        }

     9、不用temp交换两个整数

        void swap(int x , int y)

        {

             x ^= y;

             y ^= x;

             x ^= y;

        }

    10、计算绝对值

        int abs( int x )

        {

             int y ;

             y = x >> 31 ;

             return (x^y)-y ;        //or: (x+y)^y

         }

    11、取模运算转化成位运算 (在不产生溢出的情况下)

            a % (2^n) 等价于 a & (2^n - 1)

    12、乘法运算转化成位运算 (在不产生溢出的情况下)

            a * (2^n) 等价于 a<< n

    13、除法运算转化成位运算 (在不产生溢出的情况下)

            a / (2^n) 等价于 a>> n

            : 12/8 == 12>>3

    14a % 2 等价于 a & 1       

    15if (x == a) x= b;

          else x= a;

      等价于 x= a ^ b ^ x;

    16的相反数表示为 (~x+1)