这是一个FIR滤波器实现,演示了如何使用Q6_P_vrmpyhacc_PP
乘法半字/累加。该指令在 PRM 中被描述为“巨无霸”
该指令位于标量内核中,因此不需要 HVX 矢量协处理器。
void FIR08(short_8B_align Input[],
short_8B_align Coeff[],
short_8B_align Output[],
int unused, int ntaps,
int nsamples)
{
Word64 * vInput = (Word64*)Input;
Word64 * vCoeff = (Word64*)Coeff;
Word64 *__restrict vOutput = (Word64*)Output;
int i, j;
Word64 sum0, sum1, sum2, sum3;
for (i = 0; i < nsamples/4; i++)
{
sum0 = sum1 = sum2 = sum3 = 0;
for (j = 0; j < ntaps/4; j++)
{
Word64 vIn1 = vInput[i+j];
Word64 vIn2 = vInput[i+j+1];
Word64 curCoeff = vCoeff[j];
Word64 curIn;
curIn = vIn1;
sum0 = Q6_P_vrmpyhacc_PP(sum0, curIn, curCoeff);
curIn = Q6_P_valignb_PPI(vIn2, vIn1, 2);
sum1 = Q6_P_vrmpyhacc_PP(sum1, curIn, curCoeff);
curIn = Q6_P_valignb_PPI(vIn2, vIn1, 4);
sum2 = Q6_P_vrmpyhacc_PP(sum2, curIn, curCoeff);
curIn = Q6_P_valignb_PPI(vIn2, vIn1, 6);
sum3 = Q6_P_vrmpyhacc_PP(sum3, curIn, curCoeff);
}
Word64 curOut = Q6_P_combine_RR(Q6_R_combine_RhRh(sum3, sum2), Q6_R_combine_RhRh(sum1, sum0));
vOutput[i + 1] = Q6_P_vasrh_PI(curOut, 2);
}
}