摘要:提出了一种利用数字滤波器滤除工频干扰的快速算法。这种算法从avr单片机内部硬件乘法器的特点出发,采用分配系统数法进行低通数字滤波器设计。经过vmlab集成开发环境的仿真验证,算法速度快、代码效率高、滤波效果理想。
可以从逆向进行思考:由(3)式可知,每个新的输出值y(k)都与上一次的输出值y(k-1) 和新的输入值x(k)有关。y(k-1)和x(k)都是8位的,因此最大值为0xff。为了使a×y(k-1)+(1-a) ×x(k)不超过0xffff,两个系统a和(1-a)的和不能超过0xffff/0xff=0x101。实际上,a+(1-a)等于"1",因此这里的0x101就可以看作“1”。如果取a=0.9,那么对应地将0x101平均分成10份,取其中的9份,即0x101×0.9近似等于0xe7,相应地0.1就等于0x101-0xe7=0x1a。这里的0xe7可以近似被认为是0.9的一种定点q8数表示形式,而0.1的定点q8数表示形式就是0x1a。由于滤波器系数a和(1-a)采用了q8数的表示形式这种将16位乘加运算结果转化为8定点数表示形式的工作就变得各简单了,只需通过移位运算,取y(k)的高8位即可,对应的c语言代码为:
画出不同a值对应的输出响应,如图4。wWW.133229.COM从图4可以清晰看出不同a值下算法的性能变化的大致走向。