1
以下是IIR code。我需要矢量化代码,以便我可以高效地编写NEON代码。矢量化高效实现向量化代码
例 非量化代码
for(i=0;i<100;i++)
a[i] =a[i]*b[i]; //only one independent multiplication cannot take
//advantage of multiple multiplication units
量化代码
for(i=0;i<25;i++)
{
a[i*4] =a[i*4]*b[i*4]; //four independent multiplications can use
a[(i+1)*4] =a[(i+1)*4]*b[(i+1)*4]; // multiple multiplication units to perform the
a[(i+2)*4] =a[(i+2)*4]*b[(i+2)*4]; //operation in parallel
a[(i+3)*4] =a[(i+3)*4]*b[(i+3)*4];
}
请帮我在矢量化for循环的下方,通过有效的实现代码硬件矢量功能(我的硬件可以同时执行4次乘法)。
main()
{
for(j=0;j<NUMBQUAD;j++)
{
for(i=2;i<SAMPLES+2 ;i++)
{
w[i] = x[i-2] + a1[j]* w[i-1] + a2[j]*w[i-2];
y[i-2] = w[i] + b1[j]* w[i-1] + b2[j]*w[i-2];
}
w[0]=0;
w[1] =0;
}
}
首先让它工作。我可能会误解,但通常IIR在前馈循环中访问多个元素。这只能访问x [i-2]。 – 2013-04-05 09:20:27
@Aki说什么 - 尝试优化破损代码没有意义。对于IIR滤波器,存在有问题的依赖性 - 实际上,与4路SIMD并行实现4个独立的IIR滤波器实际上更容易,而不是尝试将SIMD应用于单个IIR滤波器。 – 2013-04-05 09:23:15
这是一种不同形式的双二阶IIR,方程采取http://en.wikipedia.org/wiki/Digital_biquad_filter#Direct_Form_2 – Wolfrum 2013-04-05 09:23:55