ARM NEON простая векторизация фильтра низких частот - PullRequest
2 голосов
/ 05 января 2012

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

y[n] = (1-a) * y[n-1] + a * x[n]

Как эффективно векторизовать этот случай на ARM Neon - используя встроенные функции?Является ли это возможным?Проблема в том, что для каждого вычисления нужен предыдущий результат.

Ответы [ 4 ]

2 голосов
/ 06 января 2012

Предполагая, что вы выполняете векторные операции M элементов за раз (я думаю, что NEON имеет ширину 128 битов, то есть будет M=4 32-битные элементы), вы можете развернуть уравнение разностей с коэффициентом M довольно легко для простого однополюсного фильтра.Предположим, что вы уже рассчитали все выходы до y[n].Затем вы можете рассчитать следующие четыре значения следующим образом:

y[n+1] = (1-a)*y[n] + a*x[n+1]
y[n+2] = (1-a)*y[n+1] + a*x[n+2] = (1-a)*((1-a)*y[n] + a*x[n+1]) + a*x[n+2]
       = (1-a)^2*y[n] + a*(1-a)*x[n+1] + a*x[n+2]
...

В общем, вы можете написать y[n+k] как:

y[n+k] = (1-a)^2*y[n] + sum_{i=1}^k a*(1-a)^{k-i}*x[n+i]

Я знаю, что вышеизложенное трудно читать (возможно,мы можем перенести этот вопрос на Обработка сигналов , и я могу повторно набрать его в LaTeX).Но, учитывая начальное условие y[n] (которое предполагается последним выходом, вычисленным на предыдущей векторизованной итерации), вы можете рассчитать следующие выходные данные M параллельно, так как остальная часть развернутого фильтра имеет FIR-подобныйструктура.

У этого подхода есть несколько предостережений: если M становится большим, то вы умножаете кучу чисел, чтобы получить эффективные коэффициенты FIR для развернутых фильтров.В зависимости от вашего числового формата и значения a, это может иметь значение для числовой точности.Кроме того, при таком подходе вы не получите ускорение в 10 * 10 раз: в итоге вы рассчитываете y[n+k] с учетом того, что равняется КИХ-фильтру k.Несмотря на то, что вы вычисляете M выходных данных параллельно, тот факт, что вместо простой рекурсивной реализации первого порядка вам нужно делать k операций умножения, уменьшает некоторые преимущества векторизации.

0 голосов
/ 06 января 2012

В общем, вы можете векторизовать только полностью независимые наборы вычислений.Но в вашем нижнем проходе IIR каждый выход зависит от другого (кроме 1-го), поэтому векторизация невозможна.

Если ваша переменная "a" достаточно велика, чтобы (1-a) ^ n быстро затухалниже желаемого минимального уровня шума или допустимой ошибки, вы можете заменить короткое приближение КИХ-фильтра для вашего БИХ и вместо этого векторизовать эту свертку.Но это вряд ли будет быстрее.

0 голосов
/ 06 января 2012

Как насчет расширения уравнений до 4 шагов и использования умножения матриц?А является постоянным, поэтому одна матрица может быть рассчитана заранее

0 голосов
/ 06 января 2012

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

...