无论您使用哪种语言,直接形式 II 转置结构都非常简单。
例如,在 C 中,它可能类似于:
float myFilter( float u)
{
static float[nb] x = {0,0,0,...,0); // initialize x
static float[na] y = {0,0,0,...,0); // initialize y
static float b1 = ....; // put b(1) here
static float[nb] b = {...,...,...,...,...}; // put b(2) to b(nb+1) here
static float[na] a = {...,...,...,...,...}; // put a(2) to a(na+1) values here
// initialization
float sum = 0;
int i=0;
// compute the value
for(i=0;i<nb;i++)
sum += b[i]*x[i];
for(i=0;i<na;i++)
sum -= a[i]*y[i];
sum += b1*u;
// prepare the values for the next time
for(i=1;i<nb;i++)
x[i] = x[i-1];
x[0] = u;
for(i=1;i<na;i++)
y[i] = y[i-1];
y[0] = sum;
// return the value
return sum;
}
我没有测试代码,但它是这样的。
直接形式 II 转置是实现 FIR 滤波器的最简单形式(在数值上,特别是在定点中,它不是最好的,但它是需要较少操作的形式)。
当然,可以有更好的实现(例如,使用循环数组)。如果需要,我也可以提供。
编辑:我回答得太快了。您提供的算法
y(n) = b(1)x(n) + b(2)x(n-1) + ... + b(nb+1)x(n-nb) - a(2)y(n-1) - ... - a(na+1)*y(n-na)
不是直接形式 II,而是直接形式 I。它需要存储 na+nb 值(n 是您的过滤器的顺序),而直接形式 II 只需要 max(na,nb)。用于直接形式 II 的算法是
e(n) = u(n) - a(1)*e(n-1) - a(2)*e(n-2) - ... - a(na)*e(n-na)
y(n) = b(1)*e(n-1) + b(2)*e(n-2) + ... + b(nb)*e(n-nb)
告诉我你是否需要这个表格。