在 af_aneuqalizer.c 这个模块中用到这个宏定义 FILTER_ORDER,按照字面理解,可能会被认为是滤波器的阶数,一个滤波器:
b0 + b1*z^-1 + b2*z^-2 + b3*z^-3 + ......
H(z) = -------------------------------------------- (Eq 1)
a0 + a1*z^-1 + a2*z^-2 + a3*z^-3 ......
一般说滤波器的阶数,指的是 b1, b2, ….. 的个数。但是,在这个模块中,含义有些不同,下面逐步说明一下。
这个模块用的最基本的滤波器,是一个双四阶IIR滤波器,即:
b0 + b1*z^-1 + b2*z^-2 + b3*z^-3 + b4*z^-4
H(z) = -------------------------------------------- (Eq 2)
a0 + a1*z^-1 + a2*z^-2 + a3*z^-3+ a4*z^-4
而数字滤波器中,最小的一个IIR滤波器,可以认为是双一阶滤波器,即如下公式:
b0 + b1*z^-1
H(z) = ------------- (Eq 3)
a0 + a1*z^-1
其它双 N 阶滤波器(这里N为偶数),都可以用 N/2个双一阶滤波器级联得到。
所以,FILTER_ORDER 这个宏定义,指的是多少个双一阶IIR滤波器级联。最终等效的滤波器是 ( FILTER_ORDER * 2 ) 阶IIR滤波器。例如 FILTER_ORDER = 4, 则最终等效的是一个双八阶IIR滤波器。
但是,在实现中,这个模块用的最基本滤波器又是双四阶滤波器,所以,相当于用 ( FILTER_ORDER * 2 / 4 ) 个双四阶滤波器级联。,
最后 FILTER_ORDER * 2 / 4 = FILTER_ORDER / 2 , 也就是代码中用到 FILTER_ORDER / 2 .
static void draw_curves(AVFilterContext *ctx,