文章的标题起的有点大了,其实也没有太高深的理论,就是一些简单的转化。事情的起因是这样的,一位同事在网上看到了程序匠人写的一份关于一阶滤波算法的文章(文章链接:http://www.docin.com/p-745334438.html),对里面的一个推导过程不太理解,我就一时热心帮忙看了一下,顺便把推导过程记录在这里,和大家分享一下,也许会有人需要吧。公式如下图蓝色字体。
在推导之前我们先做一些符号定义:
N-----> 新采样值
O-----> 上次滤波结果
R-----> 本次滤波结果
A-----> (一级滤波系数÷256)
按照以上定义,公式原型为:R = N*A+O*(256-滤波系数)÷256
将上面的括号打开: R = N*A+O*256÷256 -O* 滤波系数÷256
进一步化简得到: R = N*A+O -O* A
将上式提公因式:R =O +(N-O)*A
分类讨论:
当N > O 时:R =O +(N-O)*A
当N < O 时:R =O-(O-N)*A
将讨论结果中的符号替换成文字,就得到了图片中化简后的公式。
其实这一化简过程并没有什么难度,但是经过化简以后可以减轻CPU的计算负担,尤其是对做嵌入式系统来说,就想程序匠人说的可大大提高效率。
其实我觉得作为程序开发者不单单要只盯着编程语言,还要掌握一些数学的方法,数学可以帮之我们提高逻辑思维用于解决问题的能力,尤其是当我们遇到较为复杂的逻辑时除了在纸上画一画流程图缕清思路以外,也可是尝试一下数学的方法,帮我们把问题简化。