版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sac761/article/details/75007701
例
/*因为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*dvacc0[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滤波矢量化处理解决方案: