基于AVR单片机的数字滤波器滤除工频干扰的快速算法
工频干扰广泛存在各种工业现场中,其产生的途径主要包括输电馈线、照明设备、发动机以及各种电子仪器设备等。一般可以通过滤波电路消除工频干扰,但这必将增加硬件结构的复杂程度。实际上,还可以采用数字信号处理的相关算法,通过软件滤波器滤除工频干扰。软件滤波算法的采用,无疑会在简化电路结构的同时,使系统的硬件资源得到更加充分的利用,并达到降低产品成本的要求。
AVR 单片机是Atmel 公司生产的8位精简指令集(RISC)单片机。与同类单片机相比,在运算速度、外设资源、灵活性等方面性能均衡,性价比较高。 AVR 单片机适合C语言开发,Mega 系列AVR 单片机还有一个内部硬件乘法器单元。这些特点都为软件滤波器的实现提供了极大的便利。
1 滤波算法
常用的单片机滤波算法包括中值滤波、均值滤波、滑动平均以及复合滤波算法等。工频干扰的频率范围在50Hz附近,可以采用一个截止频率远低于50Hz的低通滤波器来滤除工频干扰。
假设输入信号为x(t),输出信号为y(t),则一个RC低通滤波器表达式为:,其中t为时间常数。
连续时间信号经过采样后成为离散时间信号,低通滤波器的表达式也变为:
为采样时间间隔,k为归一化时间。
由(1)式可得:
所以系统的传递函数为:
假设采样频率Fs=500Hz,a分别取0.8, 0.85, 0.9, 0.95, 代入(4)式,利用matlab 画出频率响应曲线,如图1。其中50Hz频率对应的幅度衰减见表1。
2 定点小数表达方式
为了精确构造数字滤波器,经常要用到浮点数据和系数。在进行浮点数乘法运算时,针对AVR 单片机设计的C编译器例如AVR-GCC,需要加入额外的数学库函数进行编译。而这会使编译后程序的代码量增加、处理时间加长、处理器的开销也随之增加。为了更大限度地降低系统开销,提高程序效率,采用定点小数表示形式进行乘法运算是最佳选择。
AVR 单片机是一种8位精简指令集(RISC)单片机。其中megaAVR 系列内部都带有一个硬件乘法器,计算一次8位乘8位的定点乘法只需2个时钟周期。因此采用8位定点采样数据乘以8位系数的定点乘法方式完成滤波算法是最高效的。
低通滤波处理涉及的运算形式为一个纯小数系数和一个已知数据相乘再相加。因此将系数采用定点小数的表示形式,对于提高算法速度是至关重要的,可以定义一种8 位定点小数表示形式--Q8 数,其各位权系数如下:
Q8 数的表示范围从0到1-2-8=0.99609375,每两个数之间的间隔是2-8(0.00390625),其所能表达的纯小数共有28=256个。例如11011000就表示2-1+2-2+2-4+2-5=0.84375,而11011001 就是表示2-1+2-2+2-4+2-5+2-8=0.84765625 ,因此0.84375 和0.84765625 之间的纯小数只能用这两个数中的一个近似表示了。这对于乘法计算的精度有一定的影响,但是由于滤波公式(3)中的系数a和(1-a)都是常数,在整体性能稳定的情况下,系数微小的不确定性对滤波器整体性能并没有太大的影响。
3 分配系数法原理
从(3)式可知,滤波算法可以用迭代计算实现,为保证每个新的输出值都可以作为下次计算的输入值,必须使输出值和输入值的位宽度一致。 AVR单片机内部硬件乘法器的输出结果为16 位,两次乘法运算的结果还要进行加法运算,其结果很有可能超过16 位宽度。如果要进行迭代计算,就要将乘加运算的结果转化成8 位表示方式。一种解决方法是用查表法实现乘法计算,这样运算结果就直接表达成8 位定点数形式,不用进行表示方式的转化,但是这种方案要占用额外的硬件存储空间构造一张查找表。
可以从逆向进行思考:由(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语言代码为:
y(k)=(char)(y(k)>>8)
在C语言编程处理中,并不需要建立一个数组来储存y(k)的值,而只需定义两个unsigned char型的变量分别储存y(k-1)和x(k) 。当乘加计算a×y(k-1)+(1-a)×x(k),将结果转化成8 位定点数形式,再将其赋
- 锁相环控制及初始化简析(08-27)
- 基于AVR单片机的串口转FSK的通信模块设计(01-23)
- 基于AVR单片机的服装压力检测系统设计(05-03)
- 基于Atmel AVR单片机的无线图像侦检系统(10-19)
- avr单片机串口多机通讯及实例(12-03)
- AVR单片机入门系列(25)AVR PWM OC0(12-03)