Word16 samples_to_rmlt_coefs(const Word16 *new_samples,Word16 *old_samples,Word16 *coefs,Word16 dct_length) { Word16 index, vals_left,mag_shift,n; Word16 windowed_data[MAX_DCT_LENGTH]; Word16 *old_ptr; const Word16 *new_ptr, *sam_low, *sam_high; Word16 *win_low, *win_high; Word16 *dst_ptr; Word16 neg_win_low; Word16 samp_high; Word16 half_dct_size; Word32 acca; Word32 accb; Word16 temp; Word16 temp1; Word16 temp2; Word16 temp5; half_dct_size = shr_nocheck(dct_length,1); /*++++++++++++++++++++++++++++++++++++++++++++*/ /* Get the first half of the windowed samples */ /*++++++++++++++++++++++++++++++++++++++++++++*/ dst_ptr = windowed_data; move16(); /* address arithmetic */ test(); if (dct_length==DCT_LENGTH) { win_high = samples_to_rmlt_window + half_dct_size; } else { win_high = max_samples_to_rmlt_window + half_dct_size; } win_low = win_high; move16(); /* address arithmetic */ sam_high = old_samples + half_dct_size; sam_low = sam_high; move16(); for (vals_left = half_dct_size;vals_left > 0;vals_left--) { acca = 0L; move32(); acca = L_mac(acca,*--win_low, *--sam_low); acca = L_mac(acca,*win_high++, *sam_high++); temp = itu_round(acca); *dst_ptr++ = temp; move16(); } /*+++++++++++++++++++++++++++++++++++++++++++++*/ /* Get the second half of the windowed samples */ /*+++++++++++++++++++++++++++++++++++++++++++++*/ sam_low = new_samples; move16(); /* address arithmetic */ sam_high = new_samples + dct_length; for (vals_left = half_dct_size; vals_left > 0; vals_left--) { acca = 0L; move32(); acca = L_mac(acca,*--win_high, *sam_low++); neg_win_low = negate(*win_low++); samp_high = *--sam_high; acca = L_mac(acca, neg_win_low, samp_high); temp = itu_round(acca); *dst_ptr++=temp; move16(); } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Save the new samples for next time, when they will be the old samples */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ new_ptr = new_samples; move16(); old_ptr = old_samples; move16(); for (vals_left = dct_length;vals_left > 0;vals_left--) { *old_ptr++ = *new_ptr++; move16(); } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Calculate how many bits to shift up the input to the DCT. */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ temp1=0; move16(); for(index=0;index<dct_length;index++) { temp2 = abs_s(windowed_data[index]); temp = sub(temp2,temp1); test(); if(temp > 0) { move16(); temp1 = temp2; } } mag_shift=0; move16(); temp = sub(temp1,14000); test(); if (temp >= 0) { mag_shift = 0; move16(); } else { temp = sub(temp1,438); test(); if(temp < 0) temp = add(temp1,1); else { temp = temp1; move16(); } accb = L_mult(temp,9587); acca = L_shr_nocheck(accb,20); temp5 = extract_l(acca); temp = norm_s(temp5); test(); if (temp == 0) { mag_shift = 9; move16(); } else mag_shift = sub(temp,6); } acca = 0L; move32(); for(index=0; index<dct_length; index++) { temp = abs_s( windowed_data[index]); acca = L_add(acca,temp); } acca = L_shr_nocheck(acca,7); test(); if (temp1 < acca) { mag_shift = sub(mag_shift,1); } test(); if (mag_shift > 0) { for(index=0;index<dct_length;index++) { windowed_data[index] = shl_nocheck(windowed_data[index],mag_shift); } } else { test(); if (mag_shift < 0) { n = negate(mag_shift); for(index=0;index<dct_length;index++) { windowed_data[index] = shr_nocheck(windowed_data[index],n); move16(); } } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Perform a Type IV DCT on the windowed data to get the coefficients */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dct_type_iv_a(windowed_data, coefs, dct_length); return(mag_shift); }
int16_t samples_to_rmlt_coefs(const int16_t new_samples[], int16_t old_samples[], int16_t coefs[], int dct_length) { int i; int half_dct_length; int last; int16_t mag_shift; int16_t n; int16_t windowed_data[MAX_DCT_LENGTH]; const int16_t *win; int32_t acca; int32_t accb; int16_t temp; int16_t temp1; int16_t temp2; half_dct_length = dct_length >> 1; win = (dct_length == DCT_LENGTH) ? samples_to_rmlt_window : max_samples_to_rmlt_window; /* Get the first half of the windowed samples */ last = half_dct_length - 1; for (i = 0; i < half_dct_length; i++) { acca = L_mult(win[last - i], old_samples[last - i]); acca = L_mac(acca, win[half_dct_length + i], old_samples[half_dct_length + i]); windowed_data[i] = xround(acca); } /* Get the second half of the windowed samples */ last = dct_length - 1; for (i = 0; i < half_dct_length; i++) { acca = L_mult(win[last - i], new_samples[i]); acca = L_mac(acca, negate(win[i]), new_samples[last - i]); windowed_data[half_dct_length + i] = xround(acca); } /* Save the new samples for next time, when they will be the old samples. */ vec_copyi16(old_samples, new_samples, dct_length); /* Calculate how many bits to shift up the input to the DCT. */ temp1 = 0; for (i = 0; i < dct_length; i++) { temp2 = abs_s(windowed_data[i]); temp = sub(temp2, temp1); if (temp > 0) temp1 = temp2; } mag_shift = 0; temp = sub(temp1, 14000); if (temp < 0) { temp = sub(temp1, 438); temp = (temp < 0) ? add(temp1, 1) : temp1; accb = L_mult(temp, 9587); acca = L_shr(accb, 20); temp = norm_s((int16_t) acca); mag_shift = (temp == 0) ? 9 : sub(temp, 6); } acca = 0; for (i = 0; i < dct_length; i++) { temp = abs_s(windowed_data[i]); acca = L_add(acca, temp); } acca = L_shr(acca, 7); if (temp1 < acca) mag_shift = sub(mag_shift, 1); if (mag_shift > 0) { for (i = 0; i < dct_length; i++) windowed_data[i] = shl(windowed_data[i], mag_shift); } else if (mag_shift < 0) { n = negate(mag_shift); for (i = 0; i < dct_length; i++) windowed_data[i] = shr(windowed_data[i], n); } /* Perform a Type IV DCT on the windowed data to get the coefficients */ dct_type_iv_a(windowed_data, coefs, dct_length); return mag_shift; }