如何同时应用多个过滤器?

时间:2011-05-01 02:25:48

标签: c filter

我需要同时应用FIR低通,高通和陷波滤波器。每个滤波器都有自己的系数集。全部使用以下算法。我可以添加或平均所有三个的输出还是有更好的方法?

SAMPLE fir_basic(SAMPLE input, int ntaps, const SAMPLE FIRcoefficient[], delay[])       
    {
        int ii;
        SAMPLE accum;

        /* store input at the beginning of the delay line */
        delay[0] = input;

        /* calc FIR */
        accum = 0;
        for (ii = 0; ii < ntaps; ii++) {
            accum += FIRcoefficient[ii] * delay[ii];
        }

        /* shift delay line */
        for (ii = ntaps - 2; ii >= 0; ii--) {
            delay[ii + 1] = delay[ii];
        }

        return accum;
    }

1 个答案:

答案 0 :(得分:1)

多个堆叠卷积滤波器的问题(正如您的滤波器例程实现所示)是,对于每次传递,您(理论上)需要访问对先前滤波器传递有影响的所有值。

为了说明这一点,请考虑以下示例:

Input:    abcdefghijk
Filter 1: 121
Filter 2: 1210121

对于第1遍,您将获得以下输出:

a: 2a+b
b: a+2b+c
c: b+2c+d
d: c+2d+e
e: d+2e+f
...

在第2阶段,您通常使用已通过传递1处理的数据:

a: b+2c+d
b: a+c+2d+e
c: 2a+b+d+2e+f
d: a+2b+c+e+2f+g

如果你把两者结合起来:

a: (a+2b+c)+2(b+2c+d)+(c+2d+e)
b: (2a+b)+(b+2c+d)+2(c+2d+e)+(d+2e+f)
...

因此,通过组合两个滤镜,您可以使函数更加复杂,因为每次传递都依赖于比前一个更原始的输入。您可以预先计算系数,但需要一些手动工作。

编辑:我没有考虑任何扩展。如果单个过滤器通过的比例因子总是相同的,那么它当然可以被排除并应用于最终结果。