我需要同时应用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;
}
答案 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)
...
因此,通过组合两个滤镜,您可以使函数更加复杂,因为每次传递都依赖于比前一个更原始的输入。您可以预先计算系数,但需要一些手动工作。
编辑:我没有考虑任何扩展。如果单个过滤器通过的比例因子总是相同的,那么它当然可以被排除并应用于最终结果。