Как я могу применить несколько фильтров одновременно? - PullRequest
1 голос
/ 01 мая 2011

Мне нужно применить 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;
    }

1 Ответ

1 голос
/ 01 мая 2011

Проблема с несколькими сложенными сверточными фильтрами (как предполагает реализация подпрограммы фильтра) заключается в том, что для каждого прохода вам (теоретически) необходимо получить доступ ко всем значениям, которые влияли на предыдущие проходы фильтра.

Чтобы проиллюстрировать это, рассмотрим следующий пример:

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)
...

Итак, объединяя два фильтра, вы значительно усложняете функцию, поскольку каждый проход зависит отбольше оригинальных входов, чем предыдущий.Вы можете предварительно рассчитать коэффициенты, но это требует некоторой ручной работы.

Редактировать: Я не учел масштабирование.Если коэффициент масштабирования всегда одинаков для одного прохода фильтра, он, конечно, может быть учтен и применен к конечному результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...