VEC-C滑窗



/*因为vacc0.i16所以滑窗长度为16,每次循环做16次步长为4的滑窗,1次移1位*/
vacc0 = (uint16) vswmpy5(v0, v0, v_coeff, (uint)0);//对v0滑窗,v0后面那个v0只是凑长度,
/*将滑窗的结果向量与向量vacc0做内和
*d[20:16]=4表示coeff偏移4位
*accumulate相当于vacc1 = (uint16) vswmpy5(v1, v1, v_coeff, (uint)4<<16);vacc0=vintrasum(vacc1,vacc0); */
vacc0 = vswmac5(accumulate, v1, v1, v_coeff, (uint)4<<16, vacc0);
/*psl表示结果向量使用逻辑移位,也就是每个元素除以2^n,忽略符号
*d[5:0]=4表示shift=4,element要除以2^4
*d[20:16]=8表示coeff偏移8位 */
v3   = (ushort16) vswmac5(psl, v2, v2, v_coeff, (uint)4|8<<16, vacc0);
//以上3步就一次性做了16位的3X3高斯滤波
vst(sat, v3, (uchar16*)p_out_u8, vprMask);

注意:vswmac3余vswmac5的区别
vswmac3出来的结果vacc的每一个元素都是滑窗2步的值加上vacc0每个元素的值。
vswmac5步长为4
这个很拗口,要好好理解。例如:
vacc0=(uint8)vswmac3(v0,v1,coeff,0);
vacc1= (uint8) vswmac3(v0,v1,coeff, SW_CONFIG(0,0,2,2,0,0), vacc0);
出来的结果是:
vacc0[0]=0*a+1*b   vacc1[0]=2*c+3*d+vacc0[0]=0*a+1*b+2*c+3*d
vacc0[1]=1*a+2*b   vacc1[1]=3*c+4*d+vacc0[1]=1*a+2*b+3*c+4*d
......
所以这2步的操作与 vacc1= (uint8) vswmac5(v0,v1,coeff,0 );这一步操作得到的结果是一样的。
这样做就可以组合成任意步长的滑窗,比如9X9的高斯滤波,就可以4+4+1或者2+2+2+2+1

进一步思考高斯9X9滤波矢量化处理解决方案: