(4) 实践中的问题
实际应用中,计算使用float 类型,可以让程序变得相对简单,而且不必考虑太多, 这是用效率换来的。对于8-bit或者是16-bit的cpu 来说,很多的时候需要追求效率,以减少资源消耗。大部分的时候,滤波器等等运算可以使用16-bit, 32-bit 的运算来取代float 运算。假设,滤波器的 z 变换公式为:
f(z) = (a3*z^3 + a2*z^2 + a1*Z * + a0)/( (b3*z^3 + b2*z^2 + b1*Z * + b0)
我们可以重新构造一个新的函数
g(z) = Ka* (a3*z^3 + a2*z^2 + a1*Z * + a0) / (Kb* (b3*z^3 + b2*z^2 + b1*Z * + b0))
=(c3*z^3 + c2*z^2 + c1*Z * + c0)/( (d3*z^3 + d2*z^2 + d1*Z * + d0)
这么做不会改变滤波器的滤波特性,改变的是最后输出的幅度,即增益。调整系数的目的是为了更好的实现整数运算。比如AD 为 12-bit, 那么
(a) 调整 a3, a2, a1, a0 可以获取输入计算最大精度。把其中最大的值比如 a2调整为c2, 取值在 0.9 – 1.0 之间,比如0.98,这样可以把c2 乘以2^15, d2*32768 = 0.98*32768 = 32112, 这样在运算中只要把a3*x(k) + a2*x(k-1) + a1*x(k-2) +a0*(k-3) 右移15 位,则可以得到正确的结果
(b) 调整 b3, b2, b1, b0 可以获取输出运算最大精度,并可以让参与运算的 y(k), y(k-1)等等 保持为16-bit, 虽然最后的运算结果y(k+1)是32-bit.
(c) 最后的结果 y(k+1) 做增益调整,得到正确的输出。调整增益为
g(1) = (c3+c2+c1+c0)/(d3+d2+d1+d0)
正确的输出为:Yout = y(k+1)/g(1) |