void Scale_sig( Word16 x[], /* (i/o) : signal to scale */ Word16 lg, /* (i) : size of x[] */ Word16 exp /* (i) : exponent: x = round(x << exp) */ ) { Word32 i; Word32 L_tmp; if(exp > 0) { for (i = lg - 1 ; i >= 0; i--) { L_tmp = L_shl2(x[i], 16 + exp); x[i] = extract_h(L_add(L_tmp, 0x8000)); } } else { exp = -exp; for (i = lg - 1; i >= 0; i--) { L_tmp = x[i] << 16; L_tmp >>= exp; x[i] = (L_tmp + 0x8000)>>16; } } return; }
void Updt_tar( Word16 * x, /* (i) Q0 : old target (for pitch search) */ Word16 * x2, /* (o) Q0 : new target (for codebook search) */ Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ Word16 gain, /* (i) Q14 : adaptive codebook gain */ Word16 L /* (i) : subframe size */ ) { Word32 i; Word32 L_tmp; for (i = 0; i < L; i++) { L_tmp = x[i] << 15; L_tmp -= (y[i] * gain)<<1; x2[i] = extract_h(L_shl2(L_tmp, 1)); } 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; }