【问题标题】:ARM NEON simple low pass filter vectorizationARM NEON 简单低通滤波器矢量化
【发布时间】:2023-03-08 04:22:01
【问题描述】:

我有一个简单的单极低通滤波器(用于参数平滑),可以用以下公式解释:

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

如何在 ARM Neon 上有效地矢量化这种情况 - 使用内在函数?可能吗? 问题是每次计算都需要一个先前的结果。

【问题讨论】:

  • 我在下面的回答专门讨论了如何重组问题以允许并行计算,但对于包含 NEON 实现细节的任何更具体的答案,您需要知道您使用的是什么数字格式等。

标签: arm signal-processing simd neon


【解决方案1】:

只有当您有多个信号要应用相同的过滤器时,您才能真正将其矢量化,例如如果它是立体声音频信号,那么您可以并行处理左右声道。四个或八个通道并行显然会更好。

【讨论】:

    【解决方案2】:

    通常,您只能对完全独立的计算集进行矢量化。但是在您的 IIR 低通中,每个输出都依赖于另一个(第一个除外),因此无法进行矢量化。

    如果您的变量“a”足够大,以至于 (1-a)^n 迅速衰减到您所需的本底噪声或允许的误差以下,您可以用一个短的 FIR 滤波器近似值代替您的 IIR,然后将该卷积向量化。但这不可能更快。

    【讨论】:

      【解决方案3】:

      如何将方程扩展为 4 步并使用矩阵乘法? a 是常数,因此可以预先计算一个矩阵

      【讨论】:

        【解决方案4】:

        假设您一次执行向量运算 M 元素(我认为 NEON 是 128 位宽,所以这将是 M=4 32 位元素),您可以将差分方程展开 @987654325 的因子@ 对于简单的单极滤波器很容易。假设您已经计算了直到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]
        

        我知道上面的内容很难阅读(也许我们可以将此问题迁移到Signal Processing,然后我可以在 LaTeX 中重新排版)。但是,给定一个初始条件y[n](假设它是上一个计算的最后一个输出) 矢量化迭代),您可以并行计算下一个M 输出,因为展开的滤波器的其余部分具有类似 FIR 的结构。

        这种方法有一些注意事项:如果M 变大,那么您最终会将一堆数字相乘,以获得展开滤波器的有效 FIR 系数。根据您的数字格式和a 的值,这可能会影响数字精度。此外,您不会通过这种方法获得M-fold 加速:您最终会计算y[n+k],相当于k-tap FIR 滤波器。尽管您正在并行计算 M 输出,但您必须执行 k 乘法累加操作而不是简单的一阶递归实现这一事实削弱了向量化的一些好处。

        【讨论】:

        • 9 个操作的矢量化版本是否比使用只有三个操作的原始标量版本更有效?好的,但总体而言,标量的运算次数为 4*3=12,所以可能比向量稍慢,对吧?
        • 是的,这就是我在上一段中的意思;就操作计数而言,没有您想要的那么大的好处,最多只有 50%,而不是 1/MA very similar version of this question is cross-posted at Signal Processing,更多地关注问题结构和操作数量,而不是任何特定于 NEON 的内容。那里还有一些额外的细节。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 2014-07-29
        • 2014-05-18
        • 2012-12-02
        • 1970-01-01
        相关资源
        最近更新 更多