void Convolve ( Word16 x[], /* (i) : input vector */ Word16 h[], /* (i) : impulse response */ Word16 y[], /* (o) : output vector */ Word16 L /* (i) : vector size */ ) { Word32 i, n; Word16 *tmpH,*tmpX; Word32 s; for (n = 0; n < 64;) { tmpH = h+n; tmpX = x; i=n+1; s = vo_mult32((*tmpX++), (*tmpH--));i--; while(i>0) { s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } y[n] = ((s<<1) + 0x8000)>>16; n++; tmpH = h+n; tmpX = x; i=n+1; s = vo_mult32((*tmpX++), (*tmpH--));i--; s += vo_mult32((*tmpX++), (*tmpH--));i--; while(i>0) { s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } y[n] = ((s<<1) + 0x8000)>>16; n++; tmpH = h+n; tmpX = x; i=n+1; s = vo_mult32((*tmpX++), (*tmpH--));i--; s += vo_mult32((*tmpX++), (*tmpH--));i--; s += vo_mult32((*tmpX++), (*tmpH--));i--; while(i>0) { s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } y[n] = ((s<<1) + 0x8000)>>16; n++; s = 0; tmpH = h+n; tmpX = x; i=n+1; while(i>0) { s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } y[n] = ((s<<1) + 0x8000)>>16; n++; } return; }
void Residu( Word16 a[], /* (i) Q12 : prediction coefficients */ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ Word16 y[], /* (o) x2 : residual signal */ Word16 lg /* (i) : size of filtering */ ) { Word16 i,*p1, *p2; Word32 s; for (i = 0; i < lg; i++) { p1 = a; p2 = &x[i]; s = vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1), (*p2)); s = L_shl2(s, 5); y[i] = extract_h(L_add(s, 0x8000)); } return; }
void Pred_lt4( Word16 exc[], /* in/out: excitation buffer */ Word16 T0, /* input : integer pitch lag */ Word16 frac, /* input : fraction of lag */ Word16 L_subfr /* input : subframe size */ ) { Word16 j, k, *x; Word32 L_sum; Word16 *ptr, *ptr1; Word16 *ptr2; x = exc - T0; frac = -frac; if (frac < 0) { frac += UP_SAMP; x--; } x -= 15; /* x = L_INTERPOL2 - 1 */ k = 3 - frac; /* k = UP_SAMP - 1 - frac */ ptr2 = &(inter4_2[k][0]); for (j = 0; j < L_subfr; j++) { ptr = ptr2; ptr1 = x; L_sum = vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum += vo_mult32((*ptr1++), (*ptr++)); L_sum = L_shl2(L_sum, 2); exc[j] = extract_h(L_add(L_sum, 0x8000)); x++; } return; }