БИХ-фильтр является рекурсивным, что означает, что он принимает прошлые значения вывода (эквивалентно, что он может быть выражен как бесконечная последовательность ввода).
Предположим, у вас есть фильтр
y[n] = b*x[n]-a*y[n-1]
Обычно первый выход инициализируется заданным значением, например 0.
Предположим, что вы хотите отфильтровать сигнал x длины N
, тогда вы должны сделать что-то вроде:
double out[N]; //output vector
double a = 0.3, b=0.5; //assign the coefficients a value
out[0] = 0; //initialize the first element
for (int i=1; i<N; i++)
{
out[i] = b*x[i] -a*[i-1];
}
В случае вашего кода я не могу знать, что вы делаете в строке inputp = &insamp[filterLength - 1 + n];
, и это может быть проблемой.
Я предполагаю, что inputp
- это сигнал, который вы хотите отфильтровать.
Другая проблема: вы использовали фильтр filterLength
, чтобы указать длину как входных, так и выходных элементов:обычно отсутствует в БИХ-фильтре.
Элементы вывода от 0 до filterlength
должны быть как-то инициализированы, предположим, к 0. Затем во втором цикле вы сделали индекс цикла, начиная с 1, но массив коэффициентов должен начинаться с 0.
(DOUBT: Если самый старый элемент y[5]
, как длина может быть 7?)
Используя индекс вместо разыменования массива, ваш код должен выглядеть примерно так:
void IIRFloat(double *coeffs_B, double *coeffs_A, double *input, double *output, int length, int filterLength)
{
double bcc, acc;
double *inputp;
int n,k;
for (int ii=0; ii<filterLength; ii++)
{
output[ii] = 0;
}
//filter length =7
for (n = 0; n < length; n++) {
inputp = &insamp[filterLength - 1 + n]; //insamp[6]~insamp[85]
acc = 0;
bcc = 0;
for (k = 0; k < filterLength; k++)
{
bcc += coeffb[k] * inputp[filterLength-k-1]; //b[0] * x[6] + b[1] * x[5]...+b[6] * x[0]
}
for (k = 0; k < filterLength; k++)
{
acc += coeffa[k] * output[filterLength-k-1]; //a[1] * y[5] + a[2] * y[4]...+a[6] * y[0]
}
output[n] = bcc-acc;
}
}
РЕДАКТИРОВАТЬ Я думаю, что два for
, имеющие одинаковую длину, могут быть объединены вместе:
for (k = 0; k < filterLength; k++)
{
output[n] += (coeffb[k] * inputp[filterLength-k-1] - coeffa[k] * output[filterLength-k-1]);
}