#c #arrays #filtering
#c #массивы #фильтрация
Вопрос:
на данный момент я пытаюсь реализовать фильтр нижних частот FIR. Коэффициенты FIR вычисляются в MATLAB. Теперь мне нужно реализовать алгоритм FIR на C .
Я определил класс как фильтр, а функцию FIR как:
double * Filter::FIR (double x[])
{
unsigned int jj;
unsigned int pp;
double sum;
pp = 0;
// input values
memcpy(amp;_x_sign, amp;x, sizeof(x));
for (pp = 0; pp < order 1; pp )
{
sum = 0 ;
for (jj = 0; jj < order 1; jj )
{
sum = _b[jj] * _x_sign[pp - jj];
}
_y_sign[pp] = sum;
}
return (_y_sign);
}
_x_sign как массив не работает, когда в цикле (pp — jj) является отрицательным числом.
Как я могу изменить свой фильтр FIR?
Ответ №1:
Я вижу, что вы пытаетесь выполнить свертку, и если вы хотите избежать ошибки сегментирования путем индексации вне массива, вам нужно изменить выражение. Например, вы можете использовать вместо
_x_sign[pp -jj]
pp>jj? _x_sign[pp - jj] : 0
В этом случае вы избегаете индексации вне памяти с помощью тернарного оператора (если jj больше pp, _x_sign[pp — jj] не будет вычислен)
Вы также можете изменить пределы вашего for с помощью
for (jj = 0; jj < order 1amp;amp; jj< pp 1; jj )
{
sum = _b[jj] * _x_sign[pp - jj];
}
Второе решение лучше, потому что вы избегаете создания большего цикла, когда это бесполезно.