| /****************************************************************************** |
| * * |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| #include <string.h> |
| |
| #include "ixheaacd_sbr_common.h" |
| #include <ixheaacd_type_def.h> |
| |
| #include "ixheaacd_constants.h" |
| #include "ixheaacd_basic_ops32.h" |
| #include "ixheaacd_basic_ops16.h" |
| #include "ixheaacd_basic_ops40.h" |
| #include "ixheaacd_basic_ops.h" |
| |
| #include "ixheaacd_intrinsics.h" |
| #include "ixheaacd_common_rom.h" |
| #include "ixheaacd_bitbuffer.h" |
| #include "ixheaacd_sbrdecsettings.h" |
| #include "ixheaacd_sbr_scale.h" |
| #include "ixheaacd_lpp_tran.h" |
| #include "ixheaacd_env_extr_part.h" |
| #include "ixheaacd_sbr_rom.h" |
| #include "ixheaacd_hybrid.h" |
| #include "ixheaacd_ps_dec.h" |
| #include "ixheaacd_env_extr.h" |
| #include "ixheaacd_qmf_dec.h" |
| |
| #include <ixheaacd_basic_op.h> |
| #include "ixheaacd_env_calc.h" |
| |
| #include "ixheaacd_interface.h" |
| |
| #include "ixheaacd_function_selector.h" |
| #include "ixheaacd_audioobjtypes.h" |
| #if !__ARM_NEON__ |
| |
| #define DCT3_LEN (32) |
| #define DCT2_LEN (64) |
| |
| #define LP_SHIFT_VAL 7 |
| #define HQ_SHIFT_64 4 |
| #define RADIXSHIFT 1 |
| #define HQ_SHIFT_VAL 4 |
| |
| VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, |
| const WORD16 *main_twidle_fwd, const WORD16 *post_tbl, |
| const WORD16 *w_16, const WORD32 *p_table) { |
| WORD32 n, k; |
| |
| WORD32 temp1[6]; |
| WORD32 temp2[4]; |
| WORD16 twid_re, twid_im; |
| WORD32 *ptr_reverse, *ptr_forward, *p_out, *ptr_out1; |
| const WORD16 *twidle_fwd, *twidle_rev; |
| |
| ptr_forward = &input[49]; |
| ptr_reverse = &input[47]; |
| |
| p_out = output; |
| twidle_fwd = main_twidle_fwd; |
| twidle_fwd += 4; |
| |
| *p_out++ = input[48] >> LP_SHIFT_VAL; |
| *p_out++ = 0; |
| |
| for (n = 1; n < DCT3_LEN / 2; n++) { |
| temp1[0] = *ptr_forward++; |
| temp1[1] = *ptr_reverse--; |
| temp1[0] = ixheaacd_add32_sat(ixheaacd_shr32(temp1[0], LP_SHIFT_VAL), |
| ixheaacd_shr32(temp1[1], LP_SHIFT_VAL)); |
| |
| temp1[2] = *(ptr_forward - 33); |
| temp1[3] = *(ptr_reverse - 31); |
| temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[2], LP_SHIFT_VAL), |
| ixheaacd_shr32(temp1[3], LP_SHIFT_VAL)); |
| twid_re = *twidle_fwd++; |
| |
| twid_im = *twidle_fwd; |
| twidle_fwd += 3; |
| |
| *p_out++ = ixheaacd_mult32x16in32(temp1[0], twid_re) + |
| ixheaacd_mult32x16in32(temp1[1], twid_im); |
| *p_out++ = -ixheaacd_mult32x16in32(temp1[1], twid_re) + |
| ixheaacd_mult32x16in32(temp1[0], twid_im); |
| } |
| |
| twid_re = *twidle_fwd++; |
| |
| twid_im = *twidle_fwd; |
| twidle_fwd += 3; |
| |
| temp1[1] = *ptr_reverse--; |
| temp1[0] = *(ptr_reverse - 31); |
| temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[1], LP_SHIFT_VAL), |
| ixheaacd_shr32(temp1[0], LP_SHIFT_VAL)); |
| |
| temp1[0] = temp1[1]; |
| |
| temp2[2] = ixheaacd_mult32x16in32(temp1[0], twid_re) + |
| ixheaacd_mult32x16in32(temp1[1], twid_im); |
| temp2[3] = -ixheaacd_mult32x16in32(temp1[1], twid_re) + |
| ixheaacd_mult32x16in32(temp1[0], twid_im); |
| |
| ptr_forward = output; |
| ptr_reverse = &output[DCT3_LEN - 1]; |
| |
| temp2[0] = *ptr_forward++; |
| temp2[1] = *ptr_forward--; |
| |
| temp1[0] = -temp2[1] - temp2[3]; |
| temp1[1] = temp2[0] - temp2[2]; |
| temp2[0] = (temp2[0] + temp2[2] + temp1[0]); |
| temp2[1] = (temp2[1] - temp2[3] + temp1[1]); |
| |
| temp2[0] >>= 1; |
| temp2[1] >>= 1; |
| |
| *ptr_forward++ = temp2[0]; |
| *ptr_forward++ = temp2[1]; |
| |
| twidle_fwd = post_tbl + 2; |
| twidle_rev = post_tbl + 14; |
| |
| for (n = 1; n < DCT3_LEN / 4; n++) { |
| temp2[0] = *ptr_forward++; |
| temp2[1] = *ptr_forward--; |
| temp2[3] = *ptr_reverse--; |
| temp2[2] = *ptr_reverse++; |
| |
| twid_re = *twidle_rev; |
| twidle_rev -= 2; |
| twid_im = *twidle_fwd; |
| twidle_fwd += 2; |
| |
| temp1[0] = temp2[0] - temp2[2]; |
| temp1[1] = (temp2[0] + temp2[2]); |
| |
| temp1[2] = temp2[1] + temp2[3]; |
| temp1[3] = (temp2[1] - temp2[3]); |
| |
| temp1[4] = ixheaacd_mult32x16in32(temp1[0], twid_re) + |
| ixheaacd_mult32x16in32(temp1[2], twid_im); |
| temp1[5] = -ixheaacd_mult32x16in32(temp1[2], twid_re) + |
| ixheaacd_mult32x16in32(temp1[0], twid_im); |
| |
| temp1[1] >>= 1; |
| temp1[3] >>= 1; |
| |
| *ptr_forward++ = temp1[1] - temp1[4]; |
| *ptr_forward++ = temp1[3] + temp1[5]; |
| |
| *ptr_reverse-- = -temp1[3] + temp1[5]; |
| *ptr_reverse-- = temp1[1] + temp1[4]; |
| } |
| temp2[0] = *ptr_forward++; |
| temp2[1] = *ptr_forward--; |
| temp2[3] = *ptr_reverse--; |
| temp2[2] = *ptr_reverse++; |
| |
| twid_re = -*twidle_rev; |
| twidle_rev -= 2; |
| twid_im = *twidle_fwd; |
| twidle_fwd += 2; |
| |
| temp1[0] = temp2[0] - temp2[2]; |
| temp1[1] = (temp2[0] + temp2[2]); |
| |
| temp1[2] = temp2[1] + temp2[3]; |
| temp1[3] = (temp2[1] - temp2[3]); |
| |
| temp1[4] = ixheaacd_mult32x16in32(temp1[0], twid_re) - |
| ixheaacd_mult32x16in32(temp1[2], twid_im); |
| temp1[5] = ixheaacd_mult32x16in32(temp1[2], twid_re) + |
| ixheaacd_mult32x16in32(temp1[0], twid_im); |
| |
| temp1[1] >>= 1; |
| temp1[3] >>= 1; |
| *ptr_forward++ = temp1[1] + temp1[4]; |
| *ptr_forward++ = temp1[3] + temp1[5]; |
| |
| ixheaacd_radix4bfly(w_16, output, 1, 4); |
| ixheaacd_postradixcompute4(input, output, p_table, 16); |
| |
| output[0] = input[0]; |
| output[2] = input[1]; |
| |
| p_out = input + 2; |
| ptr_forward = output + 1; |
| ptr_reverse = output + 30; |
| ptr_out1 = input + 18; |
| |
| for (k = (DCT3_LEN / 4) - 1; k != 0; k--) { |
| WORD32 tempre, tempim; |
| |
| tempre = *p_out++; |
| tempim = *p_out++; |
| *ptr_forward = (tempim); |
| ptr_forward += 2; |
| *ptr_forward = (tempre); |
| ptr_forward += 2; |
| |
| tempre = *ptr_out1++; |
| tempim = *ptr_out1++; |
| *ptr_reverse = (tempim); |
| ptr_reverse -= 2; |
| *ptr_reverse = (tempre); |
| ptr_reverse -= 2; |
| } |
| |
| { |
| WORD32 tempre, tempim; |
| tempre = *p_out++; |
| tempim = *p_out++; |
| *ptr_forward = (tempim); |
| ptr_forward += 2; |
| *ptr_forward = (tempre); |
| ptr_forward += 2; |
| } |
| |
| return; |
| } |
| |
| VOID ixheaacd_dct2_64(WORD32 *x, WORD32 *X, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, |
| WORD16 *filter_states) { |
| ixheaacd_pretwdct2(x, X); |
| |
| ixheaacd_radix4bfly(qmf_dec_tables_ptr->w_32, X, 1, 8); |
| |
| ixheaacd_radix4bfly(qmf_dec_tables_ptr->w_32 + 48, X, 4, 2); |
| |
| ixheaacd_postradixcompute2(x, X, qmf_dec_tables_ptr->dig_rev_table2_32, 32); |
| |
| ixheaacd_fftposttw(x, qmf_dec_tables_ptr); |
| |
| ixheaacd_posttwdct2(x, filter_states, qmf_dec_tables_ptr); |
| |
| return; |
| } |
| |
| VOID ixheaacd_cos_sin_mod(WORD32 *subband, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, |
| WORD16 *p_twiddle, WORD32 *p_dig_rev_tbl) { |
| WORD32 re2, re3; |
| WORD16 wim, wre; |
| |
| WORD32 i, M_2; |
| WORD32 M = ixheaacd_shr32(qmf_bank->no_channels, 1); |
| |
| const WORD16 *p_sin; |
| const WORD16 *p_sin_cos = &qmf_bank->cos_twiddle[0]; |
| WORD32 subband_tmp[128]; |
| WORD32 re; |
| WORD32 im; |
| WORD32 *psubband, *psubband1; |
| WORD32 *psubband_t, *psubband1_t; |
| WORD32 *psubband2, *psubband12; |
| WORD32 *psubband_t2, *psubband1_t2; |
| |
| M_2 = ixheaacd_shr32(M, 1); |
| |
| psubband = &subband[0]; |
| psubband1 = &subband[2 * M - 1]; |
| psubband_t = subband_tmp; |
| psubband1_t = &subband_tmp[2 * M - 1]; |
| |
| psubband2 = &subband[64]; |
| psubband12 = &subband[2 * M - 1 + 64]; |
| psubband_t2 = &subband_tmp[64]; |
| psubband1_t2 = &subband_tmp[2 * M - 1 + 64]; |
| |
| for (i = (M_2 >> 1) - 1; i >= 0; i--) { |
| re = *psubband++; |
| im = *psubband1--; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband_t++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| *psubband_t++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re, wim)); |
| |
| re = *psubband2++; |
| im = *psubband12--; |
| |
| *psubband_t2++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim), |
| ixheaacd_mult32x16in32(re, wre)); |
| *psubband_t2++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| |
| re = *psubband1--; |
| im = *psubband++; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband1_t-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re, wim)); |
| *psubband1_t-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| |
| re = *psubband12--; |
| im = *psubband2++; |
| |
| *psubband1_t2-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| *psubband1_t2-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim), |
| ixheaacd_mult32x16in32(re, wre)); |
| |
| re = *psubband++; |
| im = *psubband1--; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband_t++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| *psubband_t++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re, wim)); |
| |
| re = *psubband2++; |
| im = *psubband12--; |
| |
| *psubband_t2++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim), |
| ixheaacd_mult32x16in32(re, wre)); |
| *psubband_t2++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| |
| re = *psubband1--; |
| im = *psubband++; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband1_t-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re, wim)); |
| *psubband1_t-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| |
| re = *psubband12--; |
| im = *psubband2++; |
| ; |
| |
| *psubband1_t2-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| *psubband1_t2-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim), |
| ixheaacd_mult32x16in32(re, wre)); |
| } |
| |
| if (M == 32) { |
| ixheaacd_radix4bfly(p_twiddle, subband_tmp, 1, 8); |
| ixheaacd_radix4bfly(p_twiddle + 48, subband_tmp, 4, 2); |
| ixheaacd_postradixcompute2(subband, subband_tmp, p_dig_rev_tbl, 32); |
| |
| ixheaacd_radix4bfly(p_twiddle, &subband_tmp[64], 1, 8); |
| ixheaacd_radix4bfly(p_twiddle + 48, &subband_tmp[64], 4, 2); |
| ixheaacd_postradixcompute2(&subband[64], &subband_tmp[64], p_dig_rev_tbl, |
| 32); |
| |
| } else { |
| ixheaacd_radix4bfly(p_twiddle, subband_tmp, 1, 4); |
| ixheaacd_postradixcompute4(subband, subband_tmp, p_dig_rev_tbl, 16); |
| |
| ixheaacd_radix4bfly(p_twiddle, &subband_tmp[64], 1, 4); |
| ixheaacd_postradixcompute4(&subband[64], &subband_tmp[64], p_dig_rev_tbl, |
| 16); |
| } |
| |
| psubband = &subband[0]; |
| psubband1 = &subband[2 * M - 1]; |
| |
| re = *psubband1; |
| |
| *psubband = *psubband >> 1; |
| psubband++; |
| *psubband1 = ixheaacd_negate32(*psubband >> 1); |
| psubband1--; |
| |
| p_sin = &qmf_bank->alt_sin_twiddle[0]; |
| wim = *p_sin++; |
| wre = *p_sin++; |
| |
| im = *psubband1; |
| |
| *psubband1-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| *psubband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re, wim)); |
| |
| psubband2 = &subband[64]; |
| psubband12 = &subband[2 * M - 1 + 64]; |
| |
| re = *psubband12; |
| |
| *psubband12-- = ixheaacd_negate32_sat(*psubband2 >> 1); |
| |
| *psubband2 = psubband2[1] >> 1; |
| |
| psubband2++; |
| |
| im = *psubband12; |
| |
| *psubband2++ = ixheaacd_negate32_sat(ixheaacd_add32_sat( |
| ixheaacd_mult32x16in32(re, wre), ixheaacd_mult32x16in32(im, wim))); |
| *psubband12-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| |
| for (i = (M_2 - 2); i >= 0; i--) { |
| im = psubband[0]; |
| |
| re = psubband[1]; |
| |
| re2 = *psubband1; |
| |
| *psubband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| *psubband1-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim), |
| ixheaacd_mult32x16in32(re, wre)); |
| |
| im = psubband2[0]; |
| |
| re = psubband2[1]; |
| |
| re3 = *psubband12; |
| |
| *psubband12-- = ixheaacd_negate32_sat(ixheaacd_add32_sat( |
| ixheaacd_mult32x16in32(re, wim), ixheaacd_mult32x16in32(im, wre))); |
| *psubband2++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(re, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| |
| wim = *p_sin++; |
| wre = *p_sin++; |
| im = psubband1[0]; |
| |
| *psubband1-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re2, wre), |
| ixheaacd_mult32x16in32(im, wim)); |
| *psubband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre), |
| ixheaacd_mult32x16in32(re2, wim)); |
| |
| im = psubband12[0]; |
| |
| *psubband2++ = ixheaacd_negate32_sat(ixheaacd_add32_sat( |
| ixheaacd_mult32x16in32(re3, wre), ixheaacd_mult32x16in32(im, wim))); |
| *psubband12-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(re3, wim), |
| ixheaacd_mult32x16in32(im, wre)); |
| } |
| } |
| |
| VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband, |
| WORD32 *imag_subband, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| WORD32 i; |
| const WORD32 *p_time_in2 = &p_time_in1[2 * NO_ANALYSIS_CHANNELS - 1]; |
| WORD32 temp1, temp2; |
| WORD32 *t_real_subband = real_subband; |
| WORD32 *t_imag_subband = imag_subband; |
| const WORD16 *tcos; |
| |
| for (i = NO_ANALYSIS_CHANNELS - 1; i >= 0; i--) { |
| temp1 = ixheaacd_shr32(*p_time_in1++, HQ_SHIFT_VAL); |
| temp2 = ixheaacd_shr32(*p_time_in2--, HQ_SHIFT_VAL); |
| |
| *t_real_subband++ = ixheaacd_sub32_sat(temp1, temp2); |
| |
| *t_imag_subband++ = ixheaacd_add32_sat(temp1, temp2); |
| } |
| |
| ixheaacd_cos_sin_mod(real_subband, qmf_bank, qmf_dec_tables_ptr->w_16, |
| qmf_dec_tables_ptr->dig_rev_table4_16); |
| |
| tcos = qmf_bank->t_cos; |
| |
| for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) { |
| WORD16 cosh, sinh; |
| WORD32 re, im; |
| |
| re = *real_subband; |
| im = *imag_subband; |
| cosh = *tcos++; |
| sinh = *tcos++; |
| *real_subband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh), |
| ixheaacd_mult32x16in32_shl(im, sinh)); |
| *imag_subband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh), |
| ixheaacd_mult32x16in32_shl(re, sinh)); |
| } |
| } |
| |
| VOID ixheaacd_sbr_qmfanal32_winadd(WORD16 *inp1, WORD16 *inp2, WORD16 *p_qmf1, |
| WORD16 *p_qmf2, WORD32 *p_out) { |
| WORD32 n; |
| |
| for (n = 0; n < 32; n += 2) { |
| WORD32 accu; |
| |
| accu = ixheaacd_mult16x16in32(inp1[n + 0], p_qmf1[2 * (n + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 64], p_qmf1[2 * (n + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 128], p_qmf1[2 * (n + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 192], p_qmf1[2 * (n + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 256], p_qmf1[2 * (n + 256)])); |
| p_out[n] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp1[n + 1 + 0], p_qmf1[2 * (n + 1 + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp1[n + 1 + 64], p_qmf1[2 * (n + 1 + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp1[n + 1 + 128], p_qmf1[2 * (n + 1 + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp1[n + 1 + 192], p_qmf1[2 * (n + 1 + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp1[n + 1 + 256], p_qmf1[2 * (n + 1 + 256)])); |
| p_out[n + 1] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp2[n + 0], p_qmf2[2 * (n + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 64], p_qmf2[2 * (n + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 128], p_qmf2[2 * (n + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 192], p_qmf2[2 * (n + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 256], p_qmf2[2 * (n + 256)])); |
| p_out[n + 32] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp2[n + 1 + 0], p_qmf2[2 * (n + 1 + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp2[n + 1 + 64], p_qmf2[2 * (n + 1 + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp2[n + 1 + 128], p_qmf2[2 * (n + 1 + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp2[n + 1 + 192], p_qmf2[2 * (n + 1 + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, |
| ixheaacd_mult16x16in32(inp2[n + 1 + 256], p_qmf2[2 * (n + 1 + 256)])); |
| p_out[n + 1 + 32] = accu; |
| } |
| } |
| |
| VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_sample_buf, |
| ia_sbr_scale_fact_struct *sbr_scale_factor, |
| WORD32 **qmf_real, WORD32 **qmf_imag, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, |
| WORD32 ch_fac, WORD32 low_pow_flag, |
| WORD audio_object_type) { |
| WORD32 i, k; |
| WORD32 num_time_slots = qmf_bank->num_time_slots; |
| |
| WORD32 analysis_buffer[4 * NO_ANALYSIS_CHANNELS]; |
| WORD16 *filter_states = qmf_bank->core_samples_buffer; |
| |
| WORD16 *fp1, *fp2, *tmp; |
| |
| WORD16 *filter_1; |
| WORD16 *filter_2; |
| WORD16 *filt_ptr; |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| qmf_bank->filter_pos += |
| (qmf_dec_tables_ptr->qmf_c - qmf_bank->analy_win_coeff); |
| qmf_bank->analy_win_coeff = qmf_dec_tables_ptr->qmf_c; |
| } else { |
| qmf_bank->filter_pos += |
| (qmf_dec_tables_ptr->qmf_c_eld3 - qmf_bank->analy_win_coeff); |
| qmf_bank->analy_win_coeff = qmf_dec_tables_ptr->qmf_c_eld3; |
| } |
| |
| filter_1 = qmf_bank->filter_pos; |
| |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| filter_2 = filter_1 + 64; |
| } else { |
| filter_2 = filter_1 + 32; |
| } |
| |
| sbr_scale_factor->st_lb_scale = 0; |
| sbr_scale_factor->lb_scale = -10; |
| if (!low_pow_flag) { |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| sbr_scale_factor->lb_scale = -8; |
| } else { |
| sbr_scale_factor->lb_scale = -9; |
| } |
| qmf_bank->cos_twiddle = |
| (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32; |
| qmf_bank->alt_sin_twiddle = |
| (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32; |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| qmf_bank->t_cos = (WORD16 *)qmf_dec_tables_ptr->sbr_t_cos_sin_l32; |
| } else { |
| qmf_bank->t_cos = |
| (WORD16 *)qmf_dec_tables_ptr->ixheaacd_sbr_t_cos_sin_l32_eld; |
| } |
| } |
| |
| fp1 = qmf_bank->anal_filter_states; |
| fp2 = qmf_bank->anal_filter_states + NO_ANALYSIS_CHANNELS; |
| |
| if (audio_object_type == AOT_ER_AAC_ELD || |
| audio_object_type == AOT_ER_AAC_LD) { |
| filter_2 = qmf_bank->filter_2; |
| fp1 = qmf_bank->fp1_anal; |
| fp2 = qmf_bank->fp2_anal; |
| } |
| |
| for (i = 0; i < num_time_slots; i++) { |
| for (k = 0; k < NO_ANALYSIS_CHANNELS; k++) |
| filter_states[NO_ANALYSIS_CHANNELS - 1 - k] = time_sample_buf[ch_fac * k]; |
| |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| ixheaacd_sbr_qmfanal32_winadd(fp1, fp2, filter_1, filter_2, |
| analysis_buffer); |
| } else { |
| ixheaacd_sbr_qmfanal32_winadd_eld(fp1, fp2, filter_1, filter_2, |
| analysis_buffer); |
| } |
| |
| time_sample_buf += NO_ANALYSIS_CHANNELS * ch_fac; |
| |
| filter_states -= NO_ANALYSIS_CHANNELS; |
| if (filter_states < qmf_bank->anal_filter_states) { |
| filter_states = qmf_bank->anal_filter_states + 288; |
| } |
| |
| tmp = fp1; |
| fp1 = fp2; |
| fp2 = tmp; |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| filter_1 += 64; |
| filter_2 += 64; |
| } else { |
| filter_1 += 32; |
| filter_2 += 32; |
| } |
| |
| filt_ptr = filter_1; |
| filter_1 = filter_2; |
| filter_2 = filt_ptr; |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| if (filter_2 > (qmf_bank->analy_win_coeff + 640)) { |
| filter_1 = (WORD16 *)qmf_bank->analy_win_coeff; |
| filter_2 = (WORD16 *)qmf_bank->analy_win_coeff + 64; |
| } |
| } else { |
| if (filter_2 > (qmf_bank->analy_win_coeff + 320)) { |
| filter_1 = (WORD16 *)qmf_bank->analy_win_coeff; |
| filter_2 = (WORD16 *)qmf_bank->analy_win_coeff + 32; |
| } |
| } |
| |
| if (!low_pow_flag) { |
| ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i], |
| qmf_bank, qmf_dec_tables_ptr); |
| } else { |
| ixheaacd_dct3_32( |
| (WORD32 *)analysis_buffer, qmf_real[i], qmf_dec_tables_ptr->dct23_tw, |
| qmf_dec_tables_ptr->post_fft_tbl, qmf_dec_tables_ptr->w_16, |
| qmf_dec_tables_ptr->dig_rev_table4_16); |
| } |
| } |
| |
| qmf_bank->filter_pos = filter_1; |
| qmf_bank->core_samples_buffer = filter_states; |
| |
| if (audio_object_type == AOT_ER_AAC_ELD || audio_object_type == AOT_ER_AAC_LD) |
| |
| { |
| qmf_bank->fp1_anal = fp1; |
| qmf_bank->fp2_anal = fp2; |
| qmf_bank->filter_2 = filter_2; |
| } |
| } |
| |
| VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, |
| ia_sbr_qmf_filter_bank_struct *syn_qmf, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| WORD32 L = syn_qmf->no_channels; |
| const WORD32 M = (L >> 1); |
| WORD32 *dct_in = qmf_real; |
| WORD32 time_out[2 * NO_SYNTHESIS_CHANNELS]; |
| |
| WORD32 *ptime_out = &time_out[0]; |
| |
| if (L == 64) |
| ixheaacd_dct2_64(dct_in, ptime_out, qmf_dec_tables_ptr, filter_states + M); |
| else |
| ixheaacd_dct2_32(dct_in, time_out, qmf_dec_tables_ptr, filter_states); |
| |
| filter_states[3 * M] = 0; |
| } |
| |
| VOID ixheaacd_inv_emodulation(WORD32 *qmf_real, |
| ia_sbr_qmf_filter_bank_struct *syn_qmf, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| if (syn_qmf->no_channels == 64) |
| ixheaacd_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->w_32, |
| qmf_dec_tables_ptr->dig_rev_table2_32); |
| else |
| ixheaacd_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->w_16, |
| qmf_dec_tables_ptr->dig_rev_table4_16); |
| } |
| |
| VOID ixheaacd_esbr_radix4bfly(const WORD32 *w, WORD32 *x, WORD32 index1, |
| WORD32 index) { |
| int i; |
| WORD32 l1, l2, h2, fft_jmp; |
| WORD32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0; |
| WORD32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0; |
| WORD32 x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1; |
| WORD32 x_h2_0, x_h2_1; |
| WORD32 si10, si20, si30, co10, co20, co30; |
| |
| WORD64 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6; |
| WORD64 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12; |
| WORD32 *x_l1; |
| WORD32 *x_l2; |
| WORD32 *x_h2; |
| const WORD32 *w_ptr = w; |
| WORD32 i1; |
| |
| h2 = index << 1; |
| l1 = index << 2; |
| l2 = (index << 2) + (index << 1); |
| |
| x_l1 = &(x[l1]); |
| x_l2 = &(x[l2]); |
| x_h2 = &(x[h2]); |
| |
| fft_jmp = 6 * (index); |
| |
| for (i1 = 0; i1 < index1; i1++) { |
| for (i = 0; i < index; i++) { |
| si10 = (*w_ptr++); |
| co10 = (*w_ptr++); |
| si20 = (*w_ptr++); |
| co20 = (*w_ptr++); |
| si30 = (*w_ptr++); |
| co30 = (*w_ptr++); |
| |
| x_0 = x[0]; |
| x_h2_0 = x[h2]; |
| x_l1_0 = x[l1]; |
| x_l2_0 = x[l2]; |
| |
| xh0_0 = ixheaacd_add32_sat(x_0, x_l1_0); |
| xl0_0 = ixheaacd_sub32_sat(x_0, x_l1_0); |
| |
| xh20_0 = ixheaacd_add32_sat(x_h2_0, x_l2_0); |
| xl20_0 = ixheaacd_sub32_sat(x_h2_0, x_l2_0); |
| |
| x[0] = ixheaacd_add32_sat(xh0_0, xh20_0); |
| xt0_0 = ixheaacd_sub32_sat(xh0_0, xh20_0); |
| |
| x_1 = x[1]; |
| x_h2_1 = x[h2 + 1]; |
| x_l1_1 = x[l1 + 1]; |
| x_l2_1 = x[l2 + 1]; |
| |
| xh1_0 = ixheaacd_add32_sat(x_1, x_l1_1); |
| xl1_0 = ixheaacd_sub32_sat(x_1, x_l1_1); |
| |
| xh21_0 = ixheaacd_add32_sat(x_h2_1, x_l2_1); |
| xl21_0 = ixheaacd_sub32_sat(x_h2_1, x_l2_1); |
| |
| x[1] = ixheaacd_add32_sat(xh1_0, xh21_0); |
| yt0_0 = ixheaacd_sub32_sat(xh1_0, xh21_0); |
| |
| xt1_0 = ixheaacd_add32_sat(xl0_0, xl21_0); |
| xt2_0 = ixheaacd_sub32_sat(xl0_0, xl21_0); |
| |
| yt2_0 = ixheaacd_add32_sat(xl1_0, xl20_0); |
| yt1_0 = ixheaacd_sub32_sat(xl1_0, xl20_0); |
| |
| mul_11 = ixheaacd_mult64(xt2_0, co30); |
| mul_3 = ixheaacd_mult64(yt2_0, si30); |
| x[l2] = (WORD32)((mul_3 + mul_11) >> 32) << RADIXSHIFT; |
| |
| mul_5 = ixheaacd_mult64(xt2_0, si30); |
| mul_9 = ixheaacd_mult64(yt2_0, co30); |
| x[l2 + 1] = (WORD32)((mul_9 - mul_5) >> 32) << RADIXSHIFT; |
| |
| mul_12 = ixheaacd_mult64(xt0_0, co20); |
| mul_2 = ixheaacd_mult64(yt0_0, si20); |
| x[l1] = (WORD32)((mul_2 + mul_12) >> 32) << RADIXSHIFT; |
| |
| mul_6 = ixheaacd_mult64(xt0_0, si20); |
| mul_8 = ixheaacd_mult64(yt0_0, co20); |
| x[l1 + 1] = (WORD32)((mul_8 - mul_6) >> 32) << RADIXSHIFT; |
| |
| mul_4 = ixheaacd_mult64(xt1_0, co10); |
| mul_1 = ixheaacd_mult64(yt1_0, si10); |
| x[h2] = (WORD32)((mul_1 + mul_4) >> 32) << RADIXSHIFT; |
| |
| mul_10 = ixheaacd_mult64(xt1_0, si10); |
| mul_7 = ixheaacd_mult64(yt1_0, co10); |
| x[h2 + 1] = (WORD32)((mul_7 - mul_10) >> 32) << RADIXSHIFT; |
| |
| x += 2; |
| } |
| x += fft_jmp; |
| w_ptr = w_ptr - fft_jmp; |
| } |
| } |
| |
| VOID ixheaacd_esbr_postradixcompute2(WORD32 *ptr_y, WORD32 *ptr_x, |
| const WORD32 *pdig_rev_tbl, |
| WORD32 npoints) { |
| WORD32 i, k; |
| WORD32 h2; |
| WORD32 x_0, x_1, x_2, x_3; |
| WORD32 x_4, x_5, x_6, x_7; |
| WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
| WORD32 n00, n10, n20, n30, n01, n11, n21, n31; |
| WORD32 n02, n12, n22, n32, n03, n13, n23, n33; |
| WORD32 n0, j0; |
| WORD32 *x2, *x0; |
| WORD32 *y0, *y1, *y2, *y3; |
| |
| y0 = ptr_y; |
| y2 = ptr_y + (WORD32)npoints; |
| x0 = ptr_x; |
| x2 = ptr_x + (WORD32)(npoints >> 1); |
| |
| y1 = y0 + (WORD32)(npoints >> 2); |
| y3 = y2 + (WORD32)(npoints >> 2); |
| j0 = 8; |
| n0 = npoints >> 1; |
| |
| for (k = 0; k < 2; k++) { |
| for (i = 0; i<npoints>> 1; i += 8) { |
| h2 = *pdig_rev_tbl++ >> 2; |
| |
| x_0 = *x0++; |
| x_1 = *x0++; |
| x_2 = *x0++; |
| x_3 = *x0++; |
| x_4 = *x0++; |
| x_5 = *x0++; |
| x_6 = *x0++; |
| x_7 = *x0++; |
| |
| n00 = ixheaacd_add32_sat(x_0, x_2); |
| n01 = ixheaacd_add32_sat(x_1, x_3); |
| n20 = ixheaacd_sub32_sat(x_0, x_2); |
| n21 = ixheaacd_sub32_sat(x_1, x_3); |
| n10 = ixheaacd_add32_sat(x_4, x_6); |
| n11 = ixheaacd_add32_sat(x_5, x_7); |
| n30 = ixheaacd_sub32_sat(x_4, x_6); |
| n31 = ixheaacd_sub32_sat(x_5, x_7); |
| |
| y0[h2] = n00; |
| y0[h2 + 1] = n01; |
| y1[h2] = n10; |
| y1[h2 + 1] = n11; |
| y2[h2] = n20; |
| y2[h2 + 1] = n21; |
| y3[h2] = n30; |
| y3[h2 + 1] = n31; |
| |
| x_8 = *x2++; |
| x_9 = *x2++; |
| x_a = *x2++; |
| x_b = *x2++; |
| x_c = *x2++; |
| x_d = *x2++; |
| x_e = *x2++; |
| x_f = *x2++; |
| |
| n02 = ixheaacd_add32_sat(x_8, x_a); |
| n03 = ixheaacd_add32_sat(x_9, x_b); |
| n22 = ixheaacd_sub32_sat(x_8, x_a); |
| n23 = ixheaacd_sub32_sat(x_9, x_b); |
| n12 = ixheaacd_add32_sat(x_c, x_e); |
| n13 = ixheaacd_add32_sat(x_d, x_f); |
| n32 = ixheaacd_sub32_sat(x_c, x_e); |
| n33 = ixheaacd_sub32_sat(x_d, x_f); |
| |
| y0[h2 + 2] = n02; |
| y0[h2 + 3] = n03; |
| y1[h2 + 2] = n12; |
| y1[h2 + 3] = n13; |
| y2[h2 + 2] = n22; |
| y2[h2 + 3] = n23; |
| y3[h2 + 2] = n32; |
| y3[h2 + 3] = n33; |
| } |
| x0 += (WORD32)npoints >> 1; |
| x2 += (WORD32)npoints >> 1; |
| } |
| } |
| |
| VOID ixheaacd_esbr_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, |
| const WORD32 *p_dig_rev_tbl, |
| WORD32 npoints) { |
| WORD32 i, k; |
| WORD32 h2; |
| WORD32 xh0_0, xh1_0, xl0_0, xl1_0; |
| WORD32 xh0_1, xh1_1, xl0_1, xl1_1; |
| WORD32 x_0, x_1, x_2, x_3; |
| WORD32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3; |
| WORD32 x_4, x_5, x_6, x_7; |
| WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
| WORD32 n00, n10, n20, n30, n01, n11, n21, n31; |
| WORD32 n02, n12, n22, n32, n03, n13, n23, n33; |
| WORD32 n0, j0; |
| WORD32 *x2, *x0; |
| WORD32 *y0, *y1, *y2, *y3; |
| |
| y0 = ptr_y; |
| y2 = ptr_y + (WORD32)npoints; |
| x0 = ptr_x; |
| x2 = ptr_x + (WORD32)(npoints >> 1); |
| |
| y1 = y0 + (WORD32)(npoints >> 1); |
| y3 = y2 + (WORD32)(npoints >> 1); |
| |
| j0 = 4; |
| n0 = npoints >> 2; |
| |
| for (k = 0; k < 2; k++) { |
| for (i = 0; i<npoints>> 1; i += 8) { |
| h2 = *p_dig_rev_tbl++ >> 2; |
| x_0 = *x0++; |
| x_1 = *x0++; |
| x_2 = *x0++; |
| x_3 = *x0++; |
| x_4 = *x0++; |
| x_5 = *x0++; |
| x_6 = *x0++; |
| x_7 = *x0++; |
| |
| xh0_0 = ixheaacd_add32_sat(x_0, x_4); |
| xh1_0 = ixheaacd_add32_sat(x_1, x_5); |
| xl0_0 = ixheaacd_sub32_sat(x_0, x_4); |
| xl1_0 = ixheaacd_sub32_sat(x_1, x_5); |
| xh0_1 = ixheaacd_add32_sat(x_2, x_6); |
| xh1_1 = ixheaacd_add32_sat(x_3, x_7); |
| xl0_1 = ixheaacd_sub32_sat(x_2, x_6); |
| xl1_1 = ixheaacd_sub32_sat(x_3, x_7); |
| |
| n00 = ixheaacd_add32_sat(xh0_0, xh0_1); |
| n01 = ixheaacd_add32_sat(xh1_0, xh1_1); |
| n10 = ixheaacd_add32_sat(xl0_0, xl1_1); |
| n11 = ixheaacd_sub32_sat(xl1_0, xl0_1); |
| n20 = ixheaacd_sub32_sat(xh0_0, xh0_1); |
| n21 = ixheaacd_sub32_sat(xh1_0, xh1_1); |
| n30 = ixheaacd_sub32_sat(xl0_0, xl1_1); |
| n31 = ixheaacd_add32_sat(xl1_0, xl0_1); |
| |
| y0[h2] = n00; |
| y0[h2 + 1] = n01; |
| y1[h2] = n10; |
| y1[h2 + 1] = n11; |
| y2[h2] = n20; |
| y2[h2 + 1] = n21; |
| y3[h2] = n30; |
| y3[h2 + 1] = n31; |
| |
| x_8 = *x2++; |
| x_9 = *x2++; |
| x_a = *x2++; |
| x_b = *x2++; |
| x_c = *x2++; |
| x_d = *x2++; |
| x_e = *x2++; |
| x_f = *x2++; |
| |
| xh0_2 = ixheaacd_add32_sat(x_8, x_c); |
| xh1_2 = ixheaacd_add32_sat(x_9, x_d); |
| xl0_2 = ixheaacd_sub32_sat(x_8, x_c); |
| xl1_2 = ixheaacd_sub32_sat(x_9, x_d); |
| xh0_3 = ixheaacd_add32_sat(x_a, x_e); |
| xh1_3 = ixheaacd_add32_sat(x_b, x_f); |
| xl0_3 = ixheaacd_sub32_sat(x_a, x_e); |
| xl1_3 = ixheaacd_sub32_sat(x_b, x_f); |
| |
| n02 = ixheaacd_add32_sat(xh0_2, xh0_3); |
| n03 = ixheaacd_add32_sat(xh1_2, xh1_3); |
| n12 = ixheaacd_add32_sat(xl0_2, xl1_3); |
| n13 = ixheaacd_sub32_sat(xl1_2, xl0_3); |
| n22 = ixheaacd_sub32_sat(xh0_2, xh0_3); |
| n23 = ixheaacd_sub32_sat(xh1_2, xh1_3); |
| n32 = ixheaacd_sub32_sat(xl0_2, xl1_3); |
| n33 = ixheaacd_add32_sat(xl1_2, xl0_3); |
| |
| y0[h2 + 2] = n02; |
| y0[h2 + 3] = n03; |
| y1[h2 + 2] = n12; |
| y1[h2 + 3] = n13; |
| y2[h2 + 2] = n22; |
| y2[h2 + 3] = n23; |
| y3[h2 + 2] = n32; |
| y3[h2 + 3] = n33; |
| } |
| x0 += (WORD32)npoints >> 1; |
| x2 += (WORD32)npoints >> 1; |
| } |
| } |
| |
| VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, |
| WORD32 *p_twiddle, WORD32 *p_dig_rev_tbl) { |
| WORD32 z; |
| WORD32 temp[128]; |
| WORD32 scaleshift = 0; |
| |
| WORD32 re2, re3; |
| WORD32 wim, wre; |
| |
| WORD32 i, M_2; |
| WORD32 M = ixheaacd_shr32(qmf_bank->no_channels, 1); |
| |
| const WORD32 *p_sin; |
| const WORD32 *p_sin_cos; |
| |
| WORD32 subband_tmp[128]; |
| WORD32 re; |
| WORD32 im; |
| WORD32 *psubband, *psubband1; |
| WORD32 *psubband_t, *psubband1_t; |
| WORD32 *psubband2, *psubband12; |
| WORD32 *psubband_t2, *psubband1_t2; |
| |
| M_2 = ixheaacd_shr32(M, 1); |
| |
| p_sin_cos = qmf_bank->esbr_cos_twiddle; |
| |
| psubband = &subband[0]; |
| psubband1 = &subband[2 * M - 1]; |
| psubband_t = subband_tmp; |
| psubband1_t = &subband_tmp[2 * M - 1]; |
| |
| psubband2 = &subband[64]; |
| psubband12 = &subband[2 * M - 1 + 64]; |
| psubband_t2 = &subband_tmp[64]; |
| psubband1_t2 = &subband_tmp[2 * M - 1 + 64]; |
| |
| for (i = (M_2 >> 1) - 1; i >= 0; i--) { |
| re = *psubband++; |
| im = *psubband1--; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband_t++ = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| *psubband_t++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re, wim))) >> |
| 32); |
| |
| re = *psubband2++; |
| im = *psubband12--; |
| |
| *psubband_t2++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wim), |
| ixheaacd_mult64(re, wre))) >> |
| 32); |
| *psubband_t2++ = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32); |
| |
| re = *psubband1--; |
| im = *psubband++; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband1_t-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re, wim))) >> |
| 32); |
| *psubband1_t-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| |
| re = *psubband12--; |
| im = *psubband2++; |
| |
| *psubband1_t2-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32); |
| *psubband1_t2-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wim), |
| ixheaacd_mult64(re, wre))) >> |
| 32); |
| |
| re = *psubband++; |
| im = *psubband1--; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband_t++ = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| *psubband_t++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re, wim))) >> |
| 32); |
| |
| re = *psubband2++; |
| im = *psubband12--; |
| |
| *psubband_t2++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wim), |
| ixheaacd_mult64(re, wre))) >> |
| 32); |
| *psubband_t2++ = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32); |
| |
| re = *psubband1--; |
| im = *psubband++; |
| |
| wim = *p_sin_cos++; |
| wre = *p_sin_cos++; |
| |
| *psubband1_t-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re, wim))) >> |
| 32); |
| *psubband1_t-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| |
| re = *psubband12--; |
| im = *psubband2++; |
| |
| *psubband1_t2-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32); |
| *psubband1_t2-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wim), |
| ixheaacd_mult64(re, wre))) >> |
| 32); |
| } |
| |
| if (M == 32) { |
| ixheaacd_esbr_radix4bfly(p_twiddle, subband_tmp, 1, 8); |
| ixheaacd_esbr_radix4bfly(p_twiddle + 48, subband_tmp, 4, 2); |
| ixheaacd_esbr_postradixcompute2(subband, subband_tmp, p_dig_rev_tbl, 32); |
| |
| ixheaacd_esbr_radix4bfly(p_twiddle, &subband_tmp[64], 1, 8); |
| ixheaacd_esbr_radix4bfly(p_twiddle + 48, &subband_tmp[64], 4, 2); |
| ixheaacd_esbr_postradixcompute2(&subband[64], &subband_tmp[64], |
| p_dig_rev_tbl, 32); |
| |
| } |
| |
| else if (M == 16) { |
| ixheaacd_esbr_radix4bfly(p_twiddle, subband_tmp, 1, 4); |
| ixheaacd_esbr_postradixcompute4(subband, subband_tmp, p_dig_rev_tbl, 16); |
| |
| ixheaacd_esbr_radix4bfly(p_twiddle, &subband_tmp[64], 1, 4); |
| ixheaacd_esbr_postradixcompute4(&subband[64], &subband_tmp[64], |
| p_dig_rev_tbl, 16); |
| |
| } |
| |
| else if (M == 12) { |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| temp[z] = subband_tmp[2 * z]; |
| temp[12 + z] = subband_tmp[2 * z + 1]; |
| } |
| |
| ixheaacd_complex_fft_p3(temp, &temp[12], 12, -1, &scaleshift); |
| |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| subband[2 * z] = temp[z]; |
| subband[2 * z + 1] = temp[z + 12]; |
| } |
| scaleshift = 0; |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| temp[z] = subband_tmp[64 + 2 * z]; |
| temp[12 + z] = subband_tmp[64 + 2 * z + 1]; |
| } |
| |
| ixheaacd_complex_fft_p3(temp, &temp[12], 12, -1, &scaleshift); |
| |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| subband[64 + 2 * z] = temp[z]; |
| subband[64 + 2 * z + 1] = temp[z + 12]; |
| } |
| |
| } |
| |
| else { |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| temp[z] = subband_tmp[2 * z]; |
| temp[8 + z] = subband_tmp[2 * z + 1]; |
| } |
| |
| (*ixheaacd_complex_fft_p2)(temp, &temp[8], 8, -1, &scaleshift); |
| |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| subband[2 * z] = temp[z] << scaleshift; |
| subband[2 * z + 1] = temp[z + 8] << scaleshift; |
| } |
| scaleshift = 0; |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| temp[z] = subband_tmp[64 + 2 * z]; |
| temp[8 + z] = subband_tmp[64 + 2 * z + 1]; |
| } |
| |
| (*ixheaacd_complex_fft_p2)(temp, &temp[8], 8, -1, &scaleshift); |
| |
| for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { |
| subband[64 + 2 * z] = temp[z] << scaleshift; |
| subband[64 + 2 * z + 1] = temp[8 + z] << scaleshift; |
| } |
| } |
| |
| psubband = &subband[0]; |
| psubband1 = &subband[2 * M - 1]; |
| |
| re = *psubband1; |
| |
| *psubband = *psubband >> 1; |
| psubband++; |
| *psubband1 = ixheaacd_negate32(*psubband >> 1); |
| psubband1--; |
| |
| p_sin = qmf_bank->esbr_alt_sin_twiddle; |
| |
| wim = *p_sin++; |
| wre = *p_sin++; |
| |
| im = *psubband1; |
| |
| *psubband1-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| *psubband++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re, wim))) >> |
| 32); |
| |
| psubband2 = &subband[64]; |
| psubband12 = &subband[2 * M - 1 + 64]; |
| |
| re = *psubband12; |
| |
| *psubband12-- = ixheaacd_negate32_sat(*psubband2 >> 1); |
| |
| *psubband2 = psubband2[1] >> 1; |
| |
| psubband2++; |
| |
| im = *psubband12; |
| |
| *psubband2++ = ixheaacd_negate32_sat((WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wre), ixheaacd_mult64(im, wim))) >> |
| 32)); |
| *psubband12-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(re, wim), |
| ixheaacd_mult64(im, wre))) >> |
| 32); |
| |
| for (i = (M_2 - 2); i >= 0; i--) { |
| im = psubband[0]; |
| |
| re = psubband[1]; |
| |
| re2 = *psubband1; |
| |
| *psubband++ = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32); |
| *psubband1-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wim), |
| ixheaacd_mult64(re, wre))) >> |
| 32); |
| |
| im = psubband2[0]; |
| |
| re = psubband2[1]; |
| |
| re3 = *psubband12; |
| |
| *psubband12-- = ixheaacd_negate32_sat((WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re, wim), ixheaacd_mult64(im, wre))) >> |
| 32)); |
| *psubband2++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(re, wre), |
| ixheaacd_mult64(im, wim))) >> |
| 32); |
| |
| wim = *p_sin++; |
| wre = *p_sin++; |
| im = psubband1[0]; |
| |
| *psubband1-- = (WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re2, wre), ixheaacd_mult64(im, wim))) >> |
| 32); |
| *psubband++ = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, wre), |
| ixheaacd_mult64(re2, wim))) >> |
| 32); |
| |
| im = psubband12[0]; |
| |
| *psubband2++ = ixheaacd_negate32_sat((WORD32)( |
| (ixheaacd_add64(ixheaacd_mult64(re3, wre), ixheaacd_mult64(im, wim))) >> |
| 32)); |
| *psubband12-- = (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(re3, wim), |
| ixheaacd_mult64(im, wre))) >> |
| 32); |
| } |
| } |
| |
| VOID ixheaacd_esbr_fwd_modulation( |
| const WORD32 *time_sample_buf, WORD32 *real_subband, WORD32 *imag_subband, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| WORD32 i; |
| const WORD32 *time_sample_buf1 = |
| &time_sample_buf[2 * qmf_bank->no_channels - 1]; |
| WORD32 temp1, temp2; |
| WORD32 *t_real_subband = real_subband; |
| WORD32 *t_imag_subband = imag_subband; |
| const WORD32 *tcos; |
| |
| for (i = qmf_bank->no_channels - 1; i >= 0; i--) { |
| temp1 = ixheaacd_shr32(*time_sample_buf++, HQ_SHIFT_64); |
| temp2 = ixheaacd_shr32(*time_sample_buf1--, HQ_SHIFT_64); |
| |
| *t_real_subband++ = ixheaacd_sub32_sat(temp1, temp2); |
| |
| *t_imag_subband++ = ixheaacd_add32_sat(temp1, temp2); |
| } |
| |
| ixheaacd_esbr_cos_sin_mod(real_subband, qmf_bank, |
| qmf_dec_tables_ptr->esbr_w_16, |
| qmf_dec_tables_ptr->dig_rev_table4_16); |
| |
| tcos = qmf_bank->esbr_t_cos; |
| |
| for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) { |
| WORD32 cosh, sinh; |
| WORD32 re, im; |
| |
| re = *real_subband; |
| im = *imag_subband; |
| cosh = *tcos++; |
| sinh = *tcos++; |
| *real_subband++ = (WORD32)((ixheaacd_add64(ixheaacd_mult64(re, cosh), |
| ixheaacd_mult64(im, sinh))) >> |
| 31); |
| *imag_subband++ = |
| (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, cosh), |
| ixheaacd_mult64(re, sinh))) >> |
| 31); |
| } |
| } |
| |
| VOID ixheaacd_sbr_qmfsyn64_winadd(WORD16 *tmp1, WORD16 *tmp2, WORD16 *inp1, |
| WORD16 *sample_buffer, FLAG shift, |
| WORD32 ch_fac) { |
| WORD32 k; |
| WORD32 rounding_fac = 0x8000; |
| rounding_fac = rounding_fac >> shift; |
| |
| for (k = 0; k < 64; k++) { |
| WORD32 syn_out = rounding_fac; |
| |
| syn_out = ixheaacd_add32_sat(syn_out, |
| ixheaacd_mult16x16in32(tmp1[0 + k], inp1[k + 0])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp1[256 + k], inp1[k + 128])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp1[512 + k], inp1[k + 256])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp1[768 + k], inp1[k + 384])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp1[1024 + k], inp1[k + 512])); |
| |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp2[128 + k], inp1[k + 64])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp2[384 + k], inp1[k + 192])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp2[640 + k], inp1[k + 320])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp2[896 + k], inp1[k + 448])); |
| syn_out = ixheaacd_add32_sat( |
| syn_out, ixheaacd_mult16x16in32(tmp2[1152 + k], inp1[k + 576])); |
| |
| sample_buffer[ch_fac * k] = (ixheaacd_shl32_sat(syn_out, shift) >> 16); |
| } |
| } |
| |
| VOID ixheaacd_esbr_qmfsyn64_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1, |
| WORD32 *sample_buffer, WORD32 ch_fac) { |
| WORD32 k; |
| |
| for (k = 0; k < 64; k++) { |
| WORD64 syn_out = 0; |
| |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[0 + k], inp1[k + 0])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[256 + k], inp1[k + 128])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[512 + k], inp1[k + 256])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[768 + k], inp1[k + 384])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[1024 + k], inp1[k + 512])); |
| |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[128 + k], inp1[k + 64])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[384 + k], inp1[k + 192])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[640 + k], inp1[k + 320])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[896 + k], inp1[k + 448])); |
| syn_out = |
| ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[1152 + k], inp1[k + 576])); |
| |
| sample_buffer[ch_fac * k] = (WORD32)(syn_out >> 31); |
| } |
| } |
| |
| VOID ixheaacd_shiftrountine(WORD32 *qmf_real, WORD32 *qmf_imag, WORD32 len, |
| WORD32 common_shift) { |
| WORD32 treal, timag; |
| WORD32 j; |
| |
| if (common_shift < 0) { |
| WORD32 cshift = -common_shift; |
| cshift = ixheaacd_min32(cshift, 31); |
| for (j = len - 1; j >= 0; j--) { |
| treal = *qmf_real; |
| timag = *qmf_imag; |
| |
| treal = (ixheaacd_shr32(treal, cshift)); |
| timag = (ixheaacd_shr32(timag, cshift)); |
| |
| *qmf_real++ = treal; |
| *qmf_imag++ = timag; |
| } |
| } else { |
| for (j = len - 1; j >= 0; j--) { |
| treal = (ixheaacd_shl32_sat(*qmf_real, common_shift)); |
| timag = (ixheaacd_shl32_sat(*qmf_imag, common_shift)); |
| *qmf_real++ = treal; |
| *qmf_imag++ = timag; |
| } |
| } |
| } |
| |
| VOID ixheaacd_shiftrountine_with_rnd(WORD32 *qmf_real, WORD32 *qmf_imag, |
| WORD16 *filter_states, WORD32 len, |
| WORD32 shift) { |
| WORD16 *filter_states_rev = filter_states + len; |
| WORD32 treal, timag; |
| WORD32 j; |
| |
| for (j = (len - 1); j >= 0; j -= 2) { |
| WORD32 r1, r2, i1, i2; |
| i2 = qmf_imag[j]; |
| r2 = qmf_real[j]; |
| |
| r1 = *qmf_real++; |
| i1 = *qmf_imag++; |
| |
| timag = ixheaacd_add32_sat(i1, r1); |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| filter_states_rev[j] = ixheaacd_round16(timag); |
| |
| treal = ixheaacd_sub32_sat(i2, r2); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| filter_states[j] = ixheaacd_round16(treal); |
| |
| treal = ixheaacd_sub32_sat(i1, r1); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| *filter_states++ = ixheaacd_round16(treal); |
| |
| timag = ixheaacd_add32_sat(i2, r2); |
| ; |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| *filter_states_rev++ = ixheaacd_round16(timag); |
| } |
| } |
| |
| VOID ixheaacd_shiftrountine_with_rnd_eld(WORD32 *qmf_real, WORD32 *qmf_imag, |
| WORD16 *filter_states, WORD32 len, |
| WORD32 shift) { |
| WORD16 *filter_states_rev = filter_states + len; |
| WORD32 treal, timag; |
| WORD32 j; |
| |
| for (j = (len - 1); j >= 0; j -= 2) { |
| WORD32 r1, r2, i1, i2; |
| i2 = qmf_imag[j]; |
| r2 = qmf_real[j]; |
| r1 = *qmf_real++; |
| i1 = *qmf_imag++; |
| |
| timag = ixheaacd_negate32(ixheaacd_add32_sat(i1, r1)); |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| filter_states_rev[j] = ixheaacd_round16(timag); |
| |
| treal = ixheaacd_sub32_sat(r2, i2); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| filter_states[j] = ixheaacd_round16(treal); |
| |
| treal = ixheaacd_sub32_sat(r1, i1); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| *filter_states++ = ixheaacd_round16(treal); |
| |
| timag = ixheaacd_negate32(ixheaacd_add32_sat(i2, r2)); |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| *filter_states_rev++ = ixheaacd_round16(timag); |
| } |
| } |
| |
| VOID ixheaacd_shiftrountine_with_rnd_hq(WORD32 *qmf_real, WORD32 *qmf_imag, |
| WORD32 *filter_states, WORD32 len, |
| WORD32 shift) { |
| WORD32 *filter_states_rev = filter_states + len; |
| WORD32 treal, timag; |
| WORD32 j; |
| |
| for (j = (len - 1); j >= 0; j -= 2) { |
| WORD32 r1, r2, i1, i2; |
| i2 = qmf_imag[j]; |
| r2 = qmf_real[j]; |
| r1 = *qmf_real++; |
| i1 = *qmf_imag++; |
| |
| timag = ixheaacd_add32_sat(i1, r1); |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| filter_states_rev[j] = timag; |
| |
| treal = ixheaacd_sub32_sat(i2, r2); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| filter_states[j] = treal; |
| |
| treal = ixheaacd_sub32_sat(i1, r1); |
| treal = (ixheaacd_shl32_sat(treal, shift)); |
| *filter_states++ = treal; |
| |
| timag = ixheaacd_add32_sat(i2, r2); |
| timag = (ixheaacd_shl32_sat(timag, shift)); |
| *filter_states_rev++ = timag; |
| } |
| } |
| |
| VOID ixheaacd_radix4bfly(const WORD16 *w, WORD32 *x, WORD32 index1, |
| WORD32 index) { |
| int i; |
| WORD32 l1, l2, h2, fft_jmp; |
| WORD32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0; |
| WORD32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0; |
| WORD32 x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1; |
| WORD32 x_h2_0, x_h2_1; |
| WORD16 si10, si20, si30, co10, co20, co30; |
| |
| WORD32 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6; |
| WORD32 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12; |
| WORD32 *x_l1; |
| WORD32 *x_l2; |
| WORD32 *x_h2; |
| const WORD16 *w_ptr = w; |
| WORD32 i1; |
| |
| h2 = index << 1; |
| l1 = index << 2; |
| l2 = (index << 2) + (index << 1); |
| |
| x_l1 = &(x[l1]); |
| x_l2 = &(x[l2]); |
| x_h2 = &(x[h2]); |
| |
| fft_jmp = 6 * (index); |
| |
| for (i1 = 0; i1 < index1; i1++) { |
| for (i = 0; i < index; i++) { |
| si10 = (*w_ptr++); |
| co10 = (*w_ptr++); |
| si20 = (*w_ptr++); |
| co20 = (*w_ptr++); |
| si30 = (*w_ptr++); |
| co30 = (*w_ptr++); |
| |
| x_0 = x[0]; |
| x_h2_0 = x[h2]; |
| x_l1_0 = x[l1]; |
| x_l2_0 = x[l2]; |
| |
| xh0_0 = ixheaacd_add32_sat(x_0, x_l1_0); |
| xl0_0 = ixheaacd_sub32_sat(x_0, x_l1_0); |
| |
| xh20_0 = ixheaacd_add32_sat(x_h2_0, x_l2_0); |
| xl20_0 = ixheaacd_sub32_sat(x_h2_0, x_l2_0); |
| |
| x[0] = ixheaacd_add32_sat(xh0_0, xh20_0); |
| xt0_0 = ixheaacd_sub32_sat(xh0_0, xh20_0); |
| |
| x_1 = x[1]; |
| x_h2_1 = x[h2 + 1]; |
| x_l1_1 = x[l1 + 1]; |
| x_l2_1 = x[l2 + 1]; |
| |
| xh1_0 = ixheaacd_add32_sat(x_1, x_l1_1); |
| xl1_0 = ixheaacd_sub32_sat(x_1, x_l1_1); |
| |
| xh21_0 = ixheaacd_add32_sat(x_h2_1, x_l2_1); |
| xl21_0 = ixheaacd_sub32_sat(x_h2_1, x_l2_1); |
| |
| x[1] = ixheaacd_add32_sat(xh1_0, xh21_0); |
| yt0_0 = ixheaacd_sub32_sat(xh1_0, xh21_0); |
| |
| xt1_0 = ixheaacd_add32_sat(xl0_0, xl21_0); |
| xt2_0 = ixheaacd_sub32_sat(xl0_0, xl21_0); |
| |
| yt2_0 = ixheaacd_add32_sat(xl1_0, xl20_0); |
| yt1_0 = ixheaacd_sub32_sat(xl1_0, xl20_0); |
| |
| mul_11 = ixheaacd_mult32x16in32(xt2_0, co30); |
| mul_3 = ixheaacd_mult32x16in32(yt2_0, si30); |
| x[l2] = (mul_3 + mul_11) << RADIXSHIFT; |
| |
| mul_5 = ixheaacd_mult32x16in32(xt2_0, si30); |
| mul_9 = ixheaacd_mult32x16in32(yt2_0, co30); |
| x[l2 + 1] = (mul_9 - mul_5) << RADIXSHIFT; |
| |
| mul_12 = ixheaacd_mult32x16in32(xt0_0, co20); |
| mul_2 = ixheaacd_mult32x16in32(yt0_0, si20); |
| x[l1] = (mul_2 + mul_12) << RADIXSHIFT; |
| |
| mul_6 = ixheaacd_mult32x16in32(xt0_0, si20); |
| mul_8 = ixheaacd_mult32x16in32(yt0_0, co20); |
| x[l1 + 1] = (mul_8 - mul_6) << RADIXSHIFT; |
| |
| mul_4 = ixheaacd_mult32x16in32(xt1_0, co10); |
| mul_1 = ixheaacd_mult32x16in32(yt1_0, si10); |
| x[h2] = (mul_1 + mul_4) << RADIXSHIFT; |
| |
| mul_10 = ixheaacd_mult32x16in32(xt1_0, si10); |
| mul_7 = ixheaacd_mult32x16in32(yt1_0, co10); |
| x[h2 + 1] = (mul_7 - mul_10) << RADIXSHIFT; |
| |
| x += 2; |
| } |
| x += fft_jmp; |
| w_ptr = w_ptr - fft_jmp; |
| } |
| } |
| |
| VOID ixheaacd_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, |
| const WORD32 *p_dig_rev_tbl, WORD32 npoints) { |
| WORD32 i, k; |
| WORD32 h2; |
| WORD32 xh0_0, xh1_0, xl0_0, xl1_0; |
| WORD32 xh0_1, xh1_1, xl0_1, xl1_1; |
| WORD32 x_0, x_1, x_2, x_3; |
| WORD32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3; |
| WORD32 x_4, x_5, x_6, x_7; |
| WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
| WORD32 n00, n10, n20, n30, n01, n11, n21, n31; |
| WORD32 n02, n12, n22, n32, n03, n13, n23, n33; |
| WORD32 n0, j0; |
| WORD32 *x2, *x0; |
| WORD32 *y0, *y1, *y2, *y3; |
| |
| y0 = ptr_y; |
| y2 = ptr_y + (WORD32)npoints; |
| x0 = ptr_x; |
| x2 = ptr_x + (WORD32)(npoints >> 1); |
| |
| y1 = y0 + (WORD32)(npoints >> 1); |
| y3 = y2 + (WORD32)(npoints >> 1); |
| |
| j0 = 4; |
| n0 = npoints >> 2; |
| |
| for (k = 0; k < 2; k++) { |
| for (i = 0; i<npoints>> 1; i += 8) { |
| h2 = *p_dig_rev_tbl++ >> 2; |
| x_0 = *x0++; |
| x_1 = *x0++; |
| x_2 = *x0++; |
| x_3 = *x0++; |
| x_4 = *x0++; |
| x_5 = *x0++; |
| x_6 = *x0++; |
| x_7 = *x0++; |
| |
| xh0_0 = ixheaacd_add32_sat(x_0, x_4); |
| xh1_0 = ixheaacd_add32_sat(x_1, x_5); |
| xl0_0 = ixheaacd_sub32_sat(x_0, x_4); |
| xl1_0 = ixheaacd_sub32_sat(x_1, x_5); |
| xh0_1 = ixheaacd_add32_sat(x_2, x_6); |
| xh1_1 = ixheaacd_add32_sat(x_3, x_7); |
| xl0_1 = ixheaacd_sub32_sat(x_2, x_6); |
| xl1_1 = ixheaacd_sub32_sat(x_3, x_7); |
| |
| n00 = ixheaacd_add32_sat(xh0_0, xh0_1); |
| n01 = ixheaacd_add32_sat(xh1_0, xh1_1); |
| n10 = ixheaacd_add32_sat(xl0_0, xl1_1); |
| n11 = ixheaacd_sub32_sat(xl1_0, xl0_1); |
| n20 = ixheaacd_sub32_sat(xh0_0, xh0_1); |
| n21 = ixheaacd_sub32_sat(xh1_0, xh1_1); |
| n30 = ixheaacd_sub32_sat(xl0_0, xl1_1); |
| n31 = ixheaacd_add32_sat(xl1_0, xl0_1); |
| |
| y0[h2] = n00; |
| y0[h2 + 1] = n01; |
| y1[h2] = n10; |
| y1[h2 + 1] = n11; |
| y2[h2] = n20; |
| y2[h2 + 1] = n21; |
| y3[h2] = n30; |
| y3[h2 + 1] = n31; |
| |
| x_8 = *x2++; |
| x_9 = *x2++; |
| x_a = *x2++; |
| x_b = *x2++; |
| x_c = *x2++; |
| x_d = *x2++; |
| x_e = *x2++; |
| x_f = *x2++; |
| |
| xh0_2 = ixheaacd_add32_sat(x_8, x_c); |
| xh1_2 = ixheaacd_add32_sat(x_9, x_d); |
| xl0_2 = ixheaacd_sub32_sat(x_8, x_c); |
| xl1_2 = ixheaacd_sub32_sat(x_9, x_d); |
| xh0_3 = ixheaacd_add32_sat(x_a, x_e); |
| xh1_3 = ixheaacd_add32_sat(x_b, x_f); |
| xl0_3 = ixheaacd_sub32_sat(x_a, x_e); |
| xl1_3 = ixheaacd_sub32_sat(x_b, x_f); |
| |
| n02 = ixheaacd_add32_sat(xh0_2, xh0_3); |
| n03 = ixheaacd_add32_sat(xh1_2, xh1_3); |
| n12 = ixheaacd_add32_sat(xl0_2, xl1_3); |
| n13 = ixheaacd_sub32_sat(xl1_2, xl0_3); |
| n22 = ixheaacd_sub32_sat(xh0_2, xh0_3); |
| n23 = ixheaacd_sub32_sat(xh1_2, xh1_3); |
| n32 = ixheaacd_sub32_sat(xl0_2, xl1_3); |
| n33 = ixheaacd_add32_sat(xl1_2, xl0_3); |
| |
| y0[h2 + 2] = n02; |
| y0[h2 + 3] = n03; |
| y1[h2 + 2] = n12; |
| y1[h2 + 3] = n13; |
| y2[h2 + 2] = n22; |
| y2[h2 + 3] = n23; |
| y3[h2 + 2] = n32; |
| y3[h2 + 3] = n33; |
| } |
| x0 += (WORD32)npoints >> 1; |
| x2 += (WORD32)npoints >> 1; |
| } |
| } |
| |
| VOID ixheaacd_postradixcompute2(WORD32 *ptr_y, WORD32 *ptr_x, |
| const WORD32 *pdig_rev_tbl, WORD32 npoints) { |
| WORD32 i, k; |
| WORD32 h2; |
| WORD32 x_0, x_1, x_2, x_3; |
| WORD32 x_4, x_5, x_6, x_7; |
| WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
| WORD32 n00, n10, n20, n30, n01, n11, n21, n31; |
| WORD32 n02, n12, n22, n32, n03, n13, n23, n33; |
| WORD32 n0, j0; |
| WORD32 *x2, *x0; |
| WORD32 *y0, *y1, *y2, *y3; |
| |
| y0 = ptr_y; |
| y2 = ptr_y + (WORD32)npoints; |
| x0 = ptr_x; |
| x2 = ptr_x + (WORD32)(npoints >> 1); |
| |
| y1 = y0 + (WORD32)(npoints >> 2); |
| y3 = y2 + (WORD32)(npoints >> 2); |
| j0 = 8; |
| n0 = npoints >> 1; |
| |
| for (k = 0; k < 2; k++) { |
| for (i = 0; i<npoints>> 1; i += 8) { |
| h2 = *pdig_rev_tbl++ >> 2; |
| |
| x_0 = *x0++; |
| x_1 = *x0++; |
| x_2 = *x0++; |
| x_3 = *x0++; |
| x_4 = *x0++; |
| x_5 = *x0++; |
| x_6 = *x0++; |
| x_7 = *x0++; |
| |
| n00 = ixheaacd_add32_sat(x_0, x_2); |
| n01 = ixheaacd_add32_sat(x_1, x_3); |
| n20 = ixheaacd_sub32_sat(x_0, x_2); |
| n21 = ixheaacd_sub32_sat(x_1, x_3); |
| n10 = ixheaacd_add32_sat(x_4, x_6); |
| n11 = ixheaacd_add32_sat(x_5, x_7); |
| n30 = ixheaacd_sub32_sat(x_4, x_6); |
| n31 = ixheaacd_sub32_sat(x_5, x_7); |
| |
| y0[h2] = n00; |
| y0[h2 + 1] = n01; |
| y1[h2] = n10; |
| y1[h2 + 1] = n11; |
| y2[h2] = n20; |
| y2[h2 + 1] = n21; |
| y3[h2] = n30; |
| y3[h2 + 1] = n31; |
| |
| x_8 = *x2++; |
| x_9 = *x2++; |
| x_a = *x2++; |
| x_b = *x2++; |
| x_c = *x2++; |
| x_d = *x2++; |
| x_e = *x2++; |
| x_f = *x2++; |
| |
| n02 = ixheaacd_add32_sat(x_8, x_a); |
| n03 = ixheaacd_add32_sat(x_9, x_b); |
| n22 = ixheaacd_sub32_sat(x_8, x_a); |
| n23 = ixheaacd_sub32_sat(x_9, x_b); |
| n12 = ixheaacd_add32_sat(x_c, x_e); |
| n13 = ixheaacd_add32_sat(x_d, x_f); |
| n32 = ixheaacd_sub32_sat(x_c, x_e); |
| n33 = ixheaacd_sub32_sat(x_d, x_f); |
| |
| y0[h2 + 2] = n02; |
| y0[h2 + 3] = n03; |
| y1[h2 + 2] = n12; |
| y1[h2 + 3] = n13; |
| y2[h2 + 2] = n22; |
| y2[h2 + 3] = n23; |
| y3[h2 + 2] = n32; |
| y3[h2 + 3] = n33; |
| } |
| x0 += (WORD32)npoints >> 1; |
| x2 += (WORD32)npoints >> 1; |
| } |
| } |
| #endif |