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濾波矢量化處理解決方案: