DSP

VEC-C滑窗

2019-07-13 15:16发布



/*因为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滤波矢量化处理解决方案: