Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM霓虹灯简单低通滤波器矢量化_Arm_Signal Processing_Simd_Neon - Fatal编程技术网

ARM霓虹灯简单低通滤波器矢量化

ARM霓虹灯简单低通滤波器矢量化,arm,signal-processing,simd,neon,Arm,Signal Processing,Simd,Neon,我有一个简单的单极低通滤波器(用于参数平滑),可以用以下公式解释: y[n] = (1-a) * y[n-1] + a * x[n] 如何在ARM霓虹灯上有效地矢量化此案例-使用内部函数?可能吗? 问题是,每次计算都需要一个先前的结果。如果您有多个信号要应用相同的滤波器,则只能真正将其矢量化,例如,如果它是立体声音频信号,则可以并行处理左声道和右声道。四个或八个并行通道显然会更好。通常,您只能对完全独立的计算集进行矢量化。但在IIR低通中,每个输出都依赖于另一个(第一个除外),因此矢量化是不可

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

y[n] = (1-a) * y[n-1] + a * x[n]
如何在ARM霓虹灯上有效地矢量化此案例-使用内部函数?可能吗?
问题是,每次计算都需要一个先前的结果。

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

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


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

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

假设您一次执行向量运算
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
的值,这可能会影响数字精度。此外,使用这种方法不会得到
M
倍的加速比:最终计算
y[n+k]
的是
k
抽头FIR滤波器。虽然您并行计算
M
输出,您必须执行
k
乘法累加运算而不是简单的一阶递归实现,这一事实削弱了矢量化的一些好处。

我下面的回答专门讨论了如何重新构造问题,以允许并行计算,但是对于任何包含NEON实现细节的更具体的答案,我们需要知道您使用的是什么数字格式,等等。具有9个操作的矢量化版本是否比仅具有3个操作的原始标量版本更有效?好的,但总的来说,标量1的运算量是4*3=12,所以可能比向量稍慢,对吧?是的,这就是我在上一段中的意思;在操作计数方面没有您希望的那么大的好处,只有50%的好处,而不是
1/M
,更多地关注问题结构和操作计数,而不是任何特定的问题。这里还有一些额外的细节。