Фильтр FIR в c

#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];
    }
 

Второе решение лучше, потому что вы избегаете создания большего цикла, когда это бесполезно.