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

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

我正在使用的体系结构可以访问可以并行执行多个矢量化计算的单指令多数据(SIMD)指令。我想利用此功能,但是我不确定如何为像这样的递归过滤器做到这一点。问题在于每个计算都需要一个先前的结果。

评论

有人可以澄清为什么将其关闭为“主题外”吗?

问题在此处和堆栈溢出之间重叠。最初的问题专门询问如何使用ARM NEON扩展实现它。该问题将同时存在于两个站点上。在这里对其进行了编辑,以使它更多地是关于结构化问题以利用并行性的理论讨论。

@PaulR我昨天要求将其迁移到这里,但是声子强烈地认为它属于SO,而不是这里。我承认,我不太了解ARM NEON,他可能是正确的,我尊重他的判断。看到这个元问题。我删除的答案基本上表示我同意Jason R,并且用户应将此类问题标记为迁移

都感谢您的澄清-为了尽我所能,我一直在尽我最大的努力来解决与DSP有关的问题,以提高我们的知名度,因此,我担心在此问题解决之时这样做是否正确-很高兴看到它现在以更一般的形式再次打开。

#1 楼

假设您一次执行向量运算$ M $个元素,则对于简单的单极点滤波器,可以很容易地将差分方程展开$ M $倍。假设您已经计算了直到$ y [n] $的所有输出。然后,您可以按以下方式计算后续值:
$$
\开始{align}
y [n + 1]&=(1-a)y [n] +轴[n + 1] \\
y [n + 2]&=(1-a)y [n + 1] +轴[n + 2] \\
&=(1-a)((1-a)y [n] + ax [n + 1])+ ax [n + 2] \\
&=(1-a)^ 2y [n] + a(1-a)x [n + 1] + ax [n + 2] \\
&\ vdots
\ end {align}
$$

通常,您可以将$ y [n + k] $编写为:

$$
y [n + k] =(1-a)^ ky [n] + \ sum_ {i = 1} ^ k a(1-a)^ {k-i} x [n + i]
$$

对于每个样本索引$ n + k $,这看起来像是一个FIR滤波器,带有$ k + 1 $个抽头:一个抽头乘以最后一个滤波器输​​出$ y [n] $和其他$ k $抽头将滤波器输入$ x [n + 1],\ ldots,x [n + k] $相乘。令人高兴的是,可以对所有这些抽头使用的系数进行预先计算,从而允许将递归滤波器展开为$ M $ $ M + 1 $抽头并行非递归滤波器(这些滤波器计算输出样本$ y [ [n + 1],\ ldots,y [n + M] $),每$ M $个输出样本更新一次反馈项。因此,给定初始条件$ y [n] $(假定是在上一个
矢量化迭代中计算出的最后一个输出),您可以并行计算下一个$ M $输出。 br />这种方法有一些注意事项:


如果$ M $变大,则最终需要将一堆数字相乘以获得有效的FIR系数。展开的过滤器。根据您的数字格式和$ a $的值,这可能会影响数值精度。

同样,使用这种方法也无法获得$ M $倍的加速:最终您计算出y $ [n + k] $等于$ k $抽头FIR滤波器。尽管您正在并行计算$ M $输出,但是您必须执行$ k $乘累加(MAC)操作而不是简单的一阶递归实现这一事实减少了矢量化的一些好处。非矢量化方法每个输出使用2个MAC,因此您需要$ 2M $运算才能计算$ M $输出。向量化方案立即计算$ M $个输出,在此过程中需要$ M + 1 $个MAC。因此,操作的减少可以表示为$ M $的函数,如下所示:

$$
R = \ frac {M + 1} {2M} = \ frac {1} {2} \ left(1 + \ frac {1} {M} \ right)
$$

因此,即使$ M $非常大,使用此方法也可以最多减少50%的计算量。对于$ M = 4 $和$ M = 8 $的常用值,减少量分别为37.5%和43.75%。但是,除了纯粹减少操作数量之外,由于展开方法采用的内存访问模式不同,您还可以获得其他性能优势。对于更简单的实现,由于每个输出样本$ y [n] $与先前样本$ y [n-1] $的依赖关系,您可能会遇到延迟。这种效果显然非常依赖于平台。



#2 楼

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

如果变量“ a”足够大,则(1-a)^ n如果很快将其衰减到所需的本底噪声或允许的误差以下,则可以用短FIR滤波器近似替代IIR,然后对卷积进行矢量化处理。但这不可能更快。

#3 楼

仅当您希望对同一个滤波器应用多个信号时,您才能真正有效地向量化此信号。如果是立体声音频信号,则可以并行处理左右声道。并联四个或八个通道显然会更好。

#4 楼

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

#5 楼

并行矢量化几个独立流的过滤效率最高。 。

您想要重叠,因为每个流的前几个样本都不正确。您需要丢弃的样本数量将取决于a的值和所需的精度。
您将要丢弃大约n个样本,其中(1 / a)(1-a)** n