1595 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1595 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C
		
	
	
	
| /******************************************************************************
 | |
|  *                                                                            *
 | |
|  * 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 <math.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #include "ixheaacd_type_def.h"
 | |
| 
 | |
| #include "ixheaacd_bitbuffer.h"
 | |
| 
 | |
| #include "ixheaacd_interface.h"
 | |
| 
 | |
| #include "ixheaacd_tns_usac.h"
 | |
| #include "ixheaacd_cnst.h"
 | |
| 
 | |
| #include "ixheaacd_acelp_info.h"
 | |
| 
 | |
| #include "ixheaacd_sbrdecsettings.h"
 | |
| #include "ixheaacd_info.h"
 | |
| #include "ixheaacd_sbr_common.h"
 | |
| #include "ixheaacd_drc_data_struct.h"
 | |
| #include "ixheaacd_drc_dec.h"
 | |
| #include "ixheaacd_sbrdecoder.h"
 | |
| #include "ixheaacd_mps_polyphase.h"
 | |
| #include "ixheaacd_sbr_const.h"
 | |
| 
 | |
| #include "ixheaacd_env_extr_part.h"
 | |
| #include "ixheaacd_sbr_rom.h"
 | |
| #include "ixheaacd_common_rom.h"
 | |
| #include "ixheaacd_hybrid.h"
 | |
| #include "ixheaacd_sbr_scale.h"
 | |
| #include "ixheaacd_ps_dec.h"
 | |
| #include "ixheaacd_freq_sca.h"
 | |
| #include "ixheaacd_lpp_tran.h"
 | |
| #include "ixheaacd_bitbuffer.h"
 | |
| #include "ixheaacd_env_extr.h"
 | |
| #include "ixheaacd_qmf_dec.h"
 | |
| #include "ixheaacd_env_calc.h"
 | |
| #include "ixheaacd_pvc_dec.h"
 | |
| 
 | |
| #include "ixheaacd_sbr_dec.h"
 | |
| #include "ixheaacd_error_standards.h"
 | |
| #include "ixheaacd_sbrqmftrans.h"
 | |
| #include "ixheaacd_qmf_poly.h"
 | |
| 
 | |
| #include "ixheaacd_constants.h"
 | |
| #include "ixheaacd_basic_ops32.h"
 | |
| #include "ixheaacd_basic_op.h"
 | |
| 
 | |
| #include "ixheaacd_esbr_rom.h"
 | |
| 
 | |
| #define SBR_CONST_PMIN 1.0f
 | |
| 
 | |
| static FLOAT32 *ixheaacd_map_prot_filter(WORD32 filt_length) {
 | |
|   switch (filt_length) {
 | |
|     case 4:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[0];
 | |
|       break;
 | |
|     case 8:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[40];
 | |
|       break;
 | |
|     case 12:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[120];
 | |
|       break;
 | |
|     case 16:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[240];
 | |
|       break;
 | |
|     case 20:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[400];
 | |
|       break;
 | |
|     case 24:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[600];
 | |
|       break;
 | |
|     case 32:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[840];
 | |
|       break;
 | |
|     case 40:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[1160];
 | |
|       break;
 | |
|     default:
 | |
|       return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[0];
 | |
|   }
 | |
| }
 | |
| 
 | |
| WORD32 ixheaacd_qmf_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                     WORD16 *p_freq_band_tab[2],
 | |
|                                     WORD16 *p_num_sfb, WORD32 upsamp_4_flag) {
 | |
|   WORD32 synth_size, sfb, patch, stop_patch;
 | |
| 
 | |
|   if (ptr_hbe_txposer != NULL) {
 | |
|     ptr_hbe_txposer->start_band = p_freq_band_tab[LOW][0];
 | |
|     ptr_hbe_txposer->end_band = p_freq_band_tab[LOW][p_num_sfb[LOW]];
 | |
| 
 | |
|     ptr_hbe_txposer->synth_size =
 | |
|         4 * ((ptr_hbe_txposer->start_band + 4) / 8 + 1);
 | |
|     ptr_hbe_txposer->k_start =
 | |
|         ixheaacd_start_subband2kL_tbl[ptr_hbe_txposer->start_band];
 | |
| 
 | |
|     ptr_hbe_txposer->upsamp_4_flag = upsamp_4_flag;
 | |
| 
 | |
|     if (upsamp_4_flag) {
 | |
|       if (ptr_hbe_txposer->k_start + ptr_hbe_txposer->synth_size > 16)
 | |
|         ptr_hbe_txposer->k_start = 16 - ptr_hbe_txposer->synth_size;
 | |
|     } else if (ptr_hbe_txposer->core_frame_length == 768) {
 | |
|       if (ptr_hbe_txposer->k_start + ptr_hbe_txposer->synth_size > 24)
 | |
|         ptr_hbe_txposer->k_start = 24 - ptr_hbe_txposer->synth_size;
 | |
|     }
 | |
| 
 | |
|     memset(ptr_hbe_txposer->synth_buf, 0, 1280 * sizeof(FLOAT32));
 | |
|     synth_size = ptr_hbe_txposer->synth_size;
 | |
|     ptr_hbe_txposer->synth_buf_offset = 18 * synth_size;
 | |
|     switch (synth_size) {
 | |
|       case 4:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_4;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_8;
 | |
|         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
 | |
|         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaacd_cmplx_anal_fft_p2;
 | |
|         break;
 | |
|       case 8:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_8;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_16;
 | |
|         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
 | |
|         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaacd_cmplx_anal_fft_p2;
 | |
|         break;
 | |
|       case 12:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_12;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_24;
 | |
|         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p3;
 | |
|         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaacd_cmplx_anal_fft_p3;
 | |
|         break;
 | |
|       case 16:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_16;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_32;
 | |
|         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
 | |
|         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaacd_cmplx_anal_fft_p2;
 | |
|         break;
 | |
|       case 20:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_20;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_40;
 | |
|         break;
 | |
|       default:
 | |
|         ptr_hbe_txposer->synth_cos_tab =
 | |
|             (FLOAT32 *)ixheaacd_synth_cos_table_kl_4;
 | |
|         ptr_hbe_txposer->analy_cos_sin_tab =
 | |
|             (FLOAT32 *)ixheaacd_analy_cos_sin_table_kl_8;
 | |
|         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
 | |
|         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaacd_cmplx_anal_fft_p2;
 | |
|     }
 | |
| 
 | |
|     ptr_hbe_txposer->synth_wind_coeff = ixheaacd_map_prot_filter(synth_size);
 | |
| 
 | |
|     memset(ptr_hbe_txposer->analy_buf, 0, 640 * sizeof(FLOAT32));
 | |
|     synth_size = 2 * ptr_hbe_txposer->synth_size;
 | |
|     ptr_hbe_txposer->analy_wind_coeff = ixheaacd_map_prot_filter(synth_size);
 | |
| 
 | |
|     memset(ptr_hbe_txposer->x_over_qmf, 0, MAX_NUM_PATCHES * sizeof(WORD32));
 | |
|     sfb = 0;
 | |
|     if (upsamp_4_flag) {
 | |
|       stop_patch = MAX_NUM_PATCHES;
 | |
|       ptr_hbe_txposer->max_stretch = MAX_STRETCH;
 | |
|     } else {
 | |
|       stop_patch = MAX_STRETCH;
 | |
|     }
 | |
| 
 | |
|     for (patch = 1; patch <= stop_patch; patch++) {
 | |
|       while (sfb <= p_num_sfb[LOW] &&
 | |
|              p_freq_band_tab[LOW][sfb] <= patch * ptr_hbe_txposer->start_band)
 | |
|         sfb++;
 | |
|       if (sfb <= p_num_sfb[LOW]) {
 | |
|         if ((patch * ptr_hbe_txposer->start_band -
 | |
|              p_freq_band_tab[LOW][sfb - 1]) <= 3) {
 | |
|           ptr_hbe_txposer->x_over_qmf[patch - 1] =
 | |
|               p_freq_band_tab[LOW][sfb - 1];
 | |
|         } else {
 | |
|           WORD32 sfb = 0;
 | |
|           while (sfb <= p_num_sfb[HIGH] &&
 | |
|                  p_freq_band_tab[HIGH][sfb] <=
 | |
|                      patch * ptr_hbe_txposer->start_band)
 | |
|             sfb++;
 | |
|           ptr_hbe_txposer->x_over_qmf[patch - 1] =
 | |
|               p_freq_band_tab[HIGH][sfb - 1];
 | |
|         }
 | |
|       } else {
 | |
|         ptr_hbe_txposer->x_over_qmf[patch - 1] = ptr_hbe_txposer->end_band;
 | |
|         ptr_hbe_txposer->max_stretch = min(patch, MAX_STRETCH);
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|     if (ptr_hbe_txposer->k_start < 0) {
 | |
|       return -1;
 | |
|     }
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                               FLOAT32 qmf_buf_real[][64],
 | |
|                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
 | |
|                               FLOAT32 pv_qmf_buf_real[][64],
 | |
|                               FLOAT32 pv_qmf_buf_imag[][64],
 | |
|                               WORD32 pitch_in_bins) {
 | |
|   WORD32 i, qmf_band_idx;
 | |
|   WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2;
 | |
|   WORD32 err_code = 0;
 | |
| 
 | |
|   memcpy(ptr_hbe_txposer->ptr_input_buf,
 | |
|          ptr_hbe_txposer->ptr_input_buf +
 | |
|              ptr_hbe_txposer->no_bins * ptr_hbe_txposer->synth_size,
 | |
|          ptr_hbe_txposer->synth_size * sizeof(FLOAT32));
 | |
| 
 | |
|   err_code = ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns,
 | |
|                                       qmf_buf_real, qmf_buf_imag);
 | |
|   if (err_code) return err_code;
 | |
| 
 | |
|   for (i = 0; i < HBE_OPER_WIN_LEN - 1; i++) {
 | |
|     memcpy(ptr_hbe_txposer->qmf_in_buf[i],
 | |
|            ptr_hbe_txposer->qmf_in_buf[i + qmf_voc_columns],
 | |
|            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
 | |
|   }
 | |
| 
 | |
|   err_code = ixheaacd_complex_anal_filt(ptr_hbe_txposer);
 | |
|   if (err_code) return err_code;
 | |
| 
 | |
|   for (i = 0; i < (ptr_hbe_txposer->hbe_qmf_out_len - ptr_hbe_txposer->no_bins);
 | |
|        i++) {
 | |
|     memcpy(ptr_hbe_txposer->qmf_out_buf[i],
 | |
|            ptr_hbe_txposer->qmf_out_buf[i + ptr_hbe_txposer->no_bins],
 | |
|            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
 | |
|   }
 | |
| 
 | |
|   for (; i < ptr_hbe_txposer->hbe_qmf_out_len; i++) {
 | |
|     memset(ptr_hbe_txposer->qmf_out_buf[i], 0,
 | |
|            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
 | |
|   }
 | |
| 
 | |
|   err_code = ixheaacd_hbe_post_anal_process(ptr_hbe_txposer, pitch_in_bins,
 | |
|                                             ptr_hbe_txposer->upsamp_4_flag);
 | |
|   if (err_code) return err_code;
 | |
| 
 | |
|   for (i = 0; i < ptr_hbe_txposer->no_bins; i++) {
 | |
|     for (qmf_band_idx = ptr_hbe_txposer->start_band;
 | |
|          qmf_band_idx < ptr_hbe_txposer->end_band; qmf_band_idx++) {
 | |
|       pv_qmf_buf_real[i][qmf_band_idx] =
 | |
|           (FLOAT32)(ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx] *
 | |
|                         ixheaacd_phase_vocoder_cos_table[qmf_band_idx] -
 | |
|                     ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx + 1] *
 | |
|                         ixheaacd_phase_vocoder_sin_table[qmf_band_idx]);
 | |
| 
 | |
|       pv_qmf_buf_imag[i][qmf_band_idx] =
 | |
|           (FLOAT32)(ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx] *
 | |
|                         ixheaacd_phase_vocoder_sin_table[qmf_band_idx] +
 | |
|                     ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx + 1] *
 | |
|                         ixheaacd_phase_vocoder_cos_table[qmf_band_idx]);
 | |
|     }
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_norm_qmf_in_buf_4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                 WORD32 qmf_band_idx) {
 | |
|   WORD32 i;
 | |
|   FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * qmf_band_idx];
 | |
|   FLOAT32 *norm_buf = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * qmf_band_idx];
 | |
| 
 | |
|   for (; qmf_band_idx <= ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
 | |
|     for (i = 0; i < ptr_hbe_txposer->hbe_qmf_in_len; i++) {
 | |
|       FLOAT32 mag_scaling_fac = 0.0f;
 | |
|       FLOAT32 x_r, x_i, temp;
 | |
|       FLOAT64 base = 1e-17;
 | |
|       x_r = in_buf[0];
 | |
|       x_i = in_buf[1];
 | |
| 
 | |
|       temp = x_r * x_r;
 | |
|       base = base + temp;
 | |
|       temp = x_i * x_i;
 | |
|       base = base + temp;
 | |
| 
 | |
|       temp = (FLOAT32)sqrt(sqrt(base));
 | |
|       mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
 | |
| 
 | |
|       mag_scaling_fac = 1 / mag_scaling_fac;
 | |
| 
 | |
|       x_r *= mag_scaling_fac;
 | |
|       x_i *= mag_scaling_fac;
 | |
| 
 | |
|       norm_buf[0] = x_r;
 | |
|       norm_buf[1] = x_i;
 | |
| 
 | |
|       in_buf += 128;
 | |
|       norm_buf += 128;
 | |
|     }
 | |
| 
 | |
|     in_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
 | |
|     norm_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_norm_qmf_in_buf_2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                 WORD32 qmf_band_idx) {
 | |
|   WORD32 i;
 | |
|   FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * qmf_band_idx];
 | |
|   FLOAT32 *norm_buf = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * qmf_band_idx];
 | |
| 
 | |
|   for (; qmf_band_idx <= ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
 | |
|     for (i = 0; i < ptr_hbe_txposer->hbe_qmf_in_len; i++) {
 | |
|       FLOAT32 mag_scaling_fac = 0.0f;
 | |
|       FLOAT32 x_r, x_i, temp;
 | |
|       FLOAT64 base = 1e-17;
 | |
|       x_r = in_buf[0];
 | |
|       x_i = in_buf[1];
 | |
| 
 | |
|       temp = x_r * x_r;
 | |
|       base = base + temp;
 | |
|       temp = x_i * x_i;
 | |
|       base = base + x_i * x_i;
 | |
| 
 | |
|       mag_scaling_fac = (FLOAT32)(1.0f / base);
 | |
|       mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
 | |
| 
 | |
|       x_r *= mag_scaling_fac;
 | |
|       x_i *= mag_scaling_fac;
 | |
| 
 | |
|       norm_buf[0] = x_r;
 | |
|       norm_buf[1] = x_i;
 | |
| 
 | |
|       in_buf += 128;
 | |
|       norm_buf += 128;
 | |
|     }
 | |
| 
 | |
|     in_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
 | |
|     norm_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_xprod_proc_3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                WORD32 qmf_band_idx, WORD32 qmf_col_idx,
 | |
|                                FLOAT32 p, WORD32 pitch_in_bins_idx) {
 | |
|   WORD32 tr, n1, n2, max_trans_fac, max_n1, max_n2;
 | |
|   WORD32 k, addrshift;
 | |
|   WORD32 inp_band_idx = 2 * qmf_band_idx / 3;
 | |
| 
 | |
|   FLOAT64 temp_fac;
 | |
|   FLOAT32 max_mag_value;
 | |
|   FLOAT32 mag_zero_band, mag_n1_band, mag_n2_band, temp;
 | |
|   FLOAT32 temp_r, temp_i;
 | |
|   FLOAT32 mag_cmplx_gain = 1.8856f;
 | |
| 
 | |
|   FLOAT32 *qmf_in_buf_ri =
 | |
|       ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX];
 | |
| 
 | |
|   mag_zero_band =
 | |
|       qmf_in_buf_ri[2 * inp_band_idx] * qmf_in_buf_ri[2 * inp_band_idx] +
 | |
|       qmf_in_buf_ri[2 * inp_band_idx + 1] * qmf_in_buf_ri[2 * inp_band_idx + 1];
 | |
|   max_mag_value = 0;
 | |
|   max_n1 = max_n2 = max_trans_fac = 0;
 | |
| 
 | |
|   for (tr = 1; tr < 3; tr++) {
 | |
|     temp_fac = (2.0f * qmf_band_idx + 1 - tr * p) * 0.3333334;
 | |
| 
 | |
|     n1 = (WORD32)(temp_fac);
 | |
|     n2 = (WORD32)(temp_fac + p);
 | |
| 
 | |
|     mag_n1_band = qmf_in_buf_ri[2 * n1] * qmf_in_buf_ri[2 * n1] +
 | |
|                   qmf_in_buf_ri[2 * n1 + 1] * qmf_in_buf_ri[2 * n1 + 1];
 | |
|     mag_n2_band = qmf_in_buf_ri[2 * n2] * qmf_in_buf_ri[2 * n2] +
 | |
|                   qmf_in_buf_ri[2 * n2 + 1] * qmf_in_buf_ri[2 * n2 + 1];
 | |
|     temp = min(mag_n1_band, mag_n2_band);
 | |
| 
 | |
|     if (temp > max_mag_value) {
 | |
|       max_mag_value = temp;
 | |
|       max_trans_fac = tr;
 | |
|       max_n1 = n1;
 | |
|       max_n2 = n2;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
 | |
|       max_n2 < NO_QMF_SYNTH_CHANNELS) {
 | |
|     FLOAT32 vec_y_r[2], vec_y_i[2], vec_o_r[2], vec_o_i[2];
 | |
|     FLOAT32 coeff_real[2], coeff_imag[2];
 | |
|     FLOAT32 d1, d2;
 | |
|     WORD32 mid_trans_fac, idx;
 | |
|     FLOAT64 base = 1e-17;
 | |
|     FLOAT32 mag_scaling_fac = 0;
 | |
|     FLOAT32 x_zero_band_r;
 | |
|     FLOAT32 x_zero_band_i;
 | |
| 
 | |
|     x_zero_band_r = 0;
 | |
|     x_zero_band_i = 0;
 | |
|     mid_trans_fac = 3 - max_trans_fac;
 | |
|     if (max_trans_fac == 1) {
 | |
|       WORD32 idx;
 | |
|       d1 = 0;
 | |
|       d2 = 1.5;
 | |
|       x_zero_band_r = qmf_in_buf_ri[2 * max_n1];
 | |
|       x_zero_band_i = qmf_in_buf_ri[2 * max_n1 + 1];
 | |
| 
 | |
|       idx = max_n2 & 3;
 | |
|       idx = (idx + 1) & 3;
 | |
|       coeff_real[0] = ixheaacd_hbe_post_anal_proc_interp_coeff[idx][0];
 | |
|       coeff_imag[0] = ixheaacd_hbe_post_anal_proc_interp_coeff[idx][1];
 | |
| 
 | |
|       coeff_real[1] = coeff_real[0];
 | |
|       coeff_imag[1] = -coeff_imag[0];
 | |
| 
 | |
|       vec_y_r[1] = qmf_in_buf_ri[2 * max_n2];
 | |
|       vec_y_i[1] = qmf_in_buf_ri[2 * max_n2 + 1];
 | |
| 
 | |
|       addrshift = -2;
 | |
|       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n2];
 | |
|       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n2 + 1];
 | |
| 
 | |
|       vec_y_r[0] = coeff_real[1] * temp_r - coeff_imag[1] * temp_i;
 | |
|       vec_y_i[0] = coeff_imag[1] * temp_r + coeff_real[1] * temp_i;
 | |
| 
 | |
|       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n2];
 | |
|       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n2 + 1];
 | |
| 
 | |
|       vec_y_r[0] += coeff_real[0] * temp_r - coeff_imag[0] * temp_i;
 | |
|       vec_y_i[0] += coeff_imag[0] * temp_r + coeff_real[0] * temp_i;
 | |
| 
 | |
|     } else {
 | |
|       WORD32 idx;
 | |
|       d1 = 1.5;
 | |
|       d2 = 0;
 | |
|       mid_trans_fac = max_trans_fac;
 | |
|       max_trans_fac = 3 - max_trans_fac;
 | |
| 
 | |
|       x_zero_band_r = qmf_in_buf_ri[2 * max_n2];
 | |
|       x_zero_band_i = qmf_in_buf_ri[2 * max_n2 + 1];
 | |
| 
 | |
|       idx = (max_n1 & 3);
 | |
|       idx = (idx + 1) & 3;
 | |
|       coeff_real[0] = ixheaacd_hbe_post_anal_proc_interp_coeff[idx][0];
 | |
|       coeff_imag[0] = ixheaacd_hbe_post_anal_proc_interp_coeff[idx][1];
 | |
| 
 | |
|       coeff_real[1] = coeff_real[0];
 | |
|       coeff_imag[1] = -coeff_imag[0];
 | |
| 
 | |
|       vec_y_r[1] = qmf_in_buf_ri[2 * max_n1];
 | |
|       vec_y_i[1] = qmf_in_buf_ri[2 * max_n1 + 1];
 | |
| 
 | |
|       addrshift = -2;
 | |
| 
 | |
|       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n1];
 | |
|       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n1 + 1];
 | |
| 
 | |
|       vec_y_r[0] = coeff_real[1] * temp_r - coeff_imag[1] * temp_i;
 | |
|       vec_y_i[0] = coeff_imag[1] * temp_r + coeff_real[1] * temp_i;
 | |
| 
 | |
|       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n1];
 | |
|       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
 | |
|                                            HBE_ZERO_BAND_IDX][2 * max_n1 + 1];
 | |
| 
 | |
|       vec_y_r[0] += coeff_real[0] * temp_r - coeff_imag[0] * temp_i;
 | |
|       vec_y_i[0] += coeff_imag[0] * temp_r + coeff_real[0] * temp_i;
 | |
|     }
 | |
| 
 | |
|     base = 1e-17;
 | |
|     base = base + x_zero_band_r * x_zero_band_r;
 | |
|     base = base + x_zero_band_i * x_zero_band_i;
 | |
|     mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base));
 | |
|     x_zero_band_r *= mag_scaling_fac;
 | |
|     x_zero_band_i *= mag_scaling_fac;
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       base = 1e-17;
 | |
|       base = base + vec_y_r[k] * vec_y_r[k];
 | |
|       base = base + vec_y_i[k] * vec_y_i[k];
 | |
|       mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base));
 | |
|       vec_y_r[k] *= mag_scaling_fac;
 | |
|       vec_y_i[k] *= mag_scaling_fac;
 | |
|     }
 | |
| 
 | |
|     temp_r = x_zero_band_r;
 | |
|     temp_i = x_zero_band_i;
 | |
|     for (idx = 0; idx < mid_trans_fac - 1; idx++) {
 | |
|       FLOAT32 tmp = x_zero_band_r;
 | |
|       x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
 | |
|       x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       temp_r = vec_y_r[k];
 | |
|       temp_i = vec_y_i[k];
 | |
|       for (idx = 0; idx < max_trans_fac - 1; idx++) {
 | |
|         FLOAT32 tmp = vec_y_r[k];
 | |
|         vec_y_r[k] = vec_y_r[k] * temp_r - vec_y_i[k] * temp_i;
 | |
|         vec_y_i[k] = tmp * temp_i + vec_y_i[k] * temp_r;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       vec_o_r[k] = vec_y_r[k] * x_zero_band_r - vec_y_i[k] * x_zero_band_i;
 | |
|       vec_o_i[k] = vec_y_r[k] * x_zero_band_i + vec_y_i[k] * x_zero_band_r;
 | |
|     }
 | |
| 
 | |
|     {
 | |
|       FLOAT32 cos_theta =
 | |
|           ixheaacd_hbe_x_prod_cos_table_trans_3[(pitch_in_bins_idx << 1) + 0];
 | |
|       FLOAT32 sin_theta =
 | |
|           ixheaacd_hbe_x_prod_cos_table_trans_3[(pitch_in_bins_idx << 1) + 1];
 | |
|       if (d2 < d1) {
 | |
|         sin_theta = -sin_theta;
 | |
|       }
 | |
|       temp_r = vec_o_r[0];
 | |
|       temp_i = vec_o_i[0];
 | |
|       vec_o_r[0] = (FLOAT32)(cos_theta * temp_r - sin_theta * temp_i);
 | |
|       vec_o_i[0] = (FLOAT32)(cos_theta * temp_i + sin_theta * temp_r);
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       ptr_hbe_txposer->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX -
 | |
|                                                       1)][2 * qmf_band_idx] +=
 | |
|           (FLOAT32)(mag_cmplx_gain * vec_o_r[k]);
 | |
|       ptr_hbe_txposer
 | |
|           ->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX - 1)]
 | |
|                        [2 * qmf_band_idx + 1] +=
 | |
|           (FLOAT32)(mag_cmplx_gain * vec_o_i[k]);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_xprod_proc_4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                WORD32 qmf_band_idx, WORD32 qmf_col_idx,
 | |
|                                FLOAT32 p, WORD32 pitch_in_bins_idx) {
 | |
|   WORD32 k;
 | |
|   WORD32 inp_band_idx = qmf_band_idx >> 1;
 | |
|   WORD32 tr, n1, n2, max_trans_fac, max_n1, max_n2;
 | |
| 
 | |
|   FLOAT64 temp_fac;
 | |
|   FLOAT32 max_mag_value, mag_zero_band, mag_n1_band, mag_n2_band, temp;
 | |
|   FLOAT32 temp_r, temp_i;
 | |
|   FLOAT32 mag_cmplx_gain = 2.0f;
 | |
| 
 | |
|   FLOAT32 *qmf_in_buf_ri =
 | |
|       ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX];
 | |
| 
 | |
|   mag_zero_band =
 | |
|       qmf_in_buf_ri[2 * inp_band_idx] * qmf_in_buf_ri[2 * inp_band_idx] +
 | |
|       qmf_in_buf_ri[2 * inp_band_idx + 1] * qmf_in_buf_ri[2 * inp_band_idx + 1];
 | |
| 
 | |
|   max_mag_value = 0;
 | |
|   max_n1 = max_n2 = max_trans_fac = 0;
 | |
| 
 | |
|   for (tr = 1; tr < 4; tr++) {
 | |
|     temp_fac = (2.0 * qmf_band_idx + 1 - tr * p) * 0.25;
 | |
|     n1 = ((WORD32)(temp_fac)) << 1;
 | |
|     n2 = ((WORD32)(temp_fac + p)) << 1;
 | |
| 
 | |
|     mag_n1_band = qmf_in_buf_ri[n1] * qmf_in_buf_ri[n1] +
 | |
|                   qmf_in_buf_ri[n1 + 1] * qmf_in_buf_ri[n1 + 1];
 | |
|     mag_n2_band = qmf_in_buf_ri[n2] * qmf_in_buf_ri[n2] +
 | |
|                   qmf_in_buf_ri[n2 + 1] * qmf_in_buf_ri[n2 + 1];
 | |
| 
 | |
|     temp = min(mag_n1_band, mag_n2_band);
 | |
| 
 | |
|     if (temp > max_mag_value) {
 | |
|       max_mag_value = temp;
 | |
|       max_trans_fac = tr;
 | |
|       max_n1 = n1;
 | |
|       max_n2 = n2;
 | |
|     }
 | |
|   }
 | |
|   if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
 | |
|       max_n2 < TWICE_QMF_SYNTH_CHANNELS_NUM) {
 | |
|     FLOAT32 vec_y_r[2], vec_y_i[2], vec_o_r[2], vec_o_i[2];
 | |
|     FLOAT32 d1, d2;
 | |
|     WORD32 mid_trans_fac, idx;
 | |
|     FLOAT32 x_zero_band_r;
 | |
|     FLOAT32 x_zero_band_i;
 | |
|     FLOAT64 base = 1e-17;
 | |
|     FLOAT32 mag_scaling_fac = 0.0f;
 | |
| 
 | |
|     x_zero_band_r = 0;
 | |
|     x_zero_band_i = 0;
 | |
|     mid_trans_fac = 4 - max_trans_fac;
 | |
| 
 | |
|     if (max_trans_fac == 1) {
 | |
|       d1 = 0;
 | |
|       d2 = 2;
 | |
|       x_zero_band_r = qmf_in_buf_ri[max_n1];
 | |
|       x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
 | |
|       for (k = 0; k < 2; k++) {
 | |
|         vec_y_r[k] =
 | |
|             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
 | |
|                                         2 * (k - 1)][max_n2];
 | |
|         vec_y_i[k] =
 | |
|             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
 | |
|                                         2 * (k - 1)][max_n2 + 1];
 | |
|       }
 | |
|     } else if (max_trans_fac == 2) {
 | |
|       d1 = 0;
 | |
|       d2 = 1;
 | |
|       x_zero_band_r = qmf_in_buf_ri[max_n1];
 | |
|       x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
 | |
|       for (k = 0; k < 2; k++) {
 | |
|         vec_y_r[k] =
 | |
|             ptr_hbe_txposer
 | |
|                 ->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX + (k - 1)][max_n2];
 | |
|         vec_y_i[k] =
 | |
|             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
 | |
|                                         (k - 1)][max_n2 + 1];
 | |
|       }
 | |
|     } else {
 | |
|       d1 = 2;
 | |
|       d2 = 0;
 | |
|       mid_trans_fac = max_trans_fac;
 | |
|       max_trans_fac = 4 - max_trans_fac;
 | |
|       x_zero_band_r = qmf_in_buf_ri[max_n2];
 | |
|       x_zero_band_i = qmf_in_buf_ri[max_n2 + 1];
 | |
|       for (k = 0; k < 2; k++) {
 | |
|         vec_y_r[k] =
 | |
|             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
 | |
|                                         2 * (k - 1)][max_n1];
 | |
|         vec_y_i[k] =
 | |
|             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
 | |
|                                         2 * (k - 1)][max_n1 + 1];
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     base = 1e-17;
 | |
|     base = base + x_zero_band_r * x_zero_band_r;
 | |
|     base = base + x_zero_band_i * x_zero_band_i;
 | |
|     {
 | |
|       temp = (FLOAT32)sqrt(sqrt(base));
 | |
|       mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
 | |
|       mag_scaling_fac = 1 / mag_scaling_fac;
 | |
|     }
 | |
| 
 | |
|     x_zero_band_r *= mag_scaling_fac;
 | |
|     x_zero_band_i *= mag_scaling_fac;
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       base = 1e-17;
 | |
|       base = base + vec_y_r[k] * vec_y_r[k];
 | |
|       base = base + vec_y_i[k] * vec_y_i[k];
 | |
|       {
 | |
|         temp = (FLOAT32)sqrt(sqrt(base));
 | |
|         mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
 | |
| 
 | |
|         mag_scaling_fac = 1 / mag_scaling_fac;
 | |
|       }
 | |
|       vec_y_r[k] *= mag_scaling_fac;
 | |
|       vec_y_i[k] *= mag_scaling_fac;
 | |
|     }
 | |
| 
 | |
|     temp_r = x_zero_band_r;
 | |
|     temp_i = x_zero_band_i;
 | |
|     for (idx = 0; idx < mid_trans_fac - 1; idx++) {
 | |
|       FLOAT32 tmp = x_zero_band_r;
 | |
|       x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
 | |
|       x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       temp_r = vec_y_r[k];
 | |
|       temp_i = vec_y_i[k];
 | |
|       for (idx = 0; idx < max_trans_fac - 1; idx++) {
 | |
|         FLOAT32 tmp = vec_y_r[k];
 | |
|         vec_y_r[k] = vec_y_r[k] * temp_r - vec_y_i[k] * temp_i;
 | |
|         vec_y_i[k] = tmp * temp_i + vec_y_i[k] * temp_r;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       vec_o_r[k] = vec_y_r[k] * x_zero_band_r - vec_y_i[k] * x_zero_band_i;
 | |
|       vec_o_i[k] = vec_y_r[k] * x_zero_band_i + vec_y_i[k] * x_zero_band_r;
 | |
|     }
 | |
| 
 | |
|     {
 | |
|       FLOAT32 cos_theta;
 | |
|       FLOAT32 sin_theta;
 | |
| 
 | |
|       if (d2 == 1) {
 | |
|         cos_theta =
 | |
|             ixheaacd_hbe_x_prod_cos_table_trans_4_1[(pitch_in_bins_idx << 1) +
 | |
|                                                     0];
 | |
|         sin_theta =
 | |
|             ixheaacd_hbe_x_prod_cos_table_trans_4_1[(pitch_in_bins_idx << 1) +
 | |
|                                                     1];
 | |
|       } else {
 | |
|         cos_theta =
 | |
|             ixheaacd_hbe_x_prod_cos_table_trans_4[(pitch_in_bins_idx << 1) + 0];
 | |
|         sin_theta =
 | |
|             ixheaacd_hbe_x_prod_cos_table_trans_4[(pitch_in_bins_idx << 1) + 1];
 | |
|         if (d2 < d1) {
 | |
|           sin_theta = -sin_theta;
 | |
|         }
 | |
|       }
 | |
|       temp_r = vec_o_r[0];
 | |
|       temp_i = vec_o_i[0];
 | |
|       vec_o_r[0] = (FLOAT32)(cos_theta * temp_r - sin_theta * temp_i);
 | |
|       vec_o_i[0] = (FLOAT32)(cos_theta * temp_i + sin_theta * temp_r);
 | |
|     }
 | |
| 
 | |
|     for (k = 0; k < 2; k++) {
 | |
|       ptr_hbe_txposer->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX -
 | |
|                                                       1)][2 * qmf_band_idx] +=
 | |
|           (FLOAT32)(mag_cmplx_gain * vec_o_r[k]);
 | |
|       ptr_hbe_txposer
 | |
|           ->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX - 1)]
 | |
|                        [2 * qmf_band_idx + 1] +=
 | |
|           (FLOAT32)(mag_cmplx_gain * vec_o_i[k]);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_prod2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
 | |
|   WORD32 i;
 | |
|   FLOAT32 *norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[1][2 * qmf_band_idx];
 | |
|   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[1][2 * qmf_band_idx];
 | |
|   FLOAT32 *x_norm_ptr =
 | |
|       &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * qmf_band_idx];
 | |
| 
 | |
|   ixheaacd_norm_qmf_in_buf_2(ptr_hbe_txposer, qmf_band_idx);
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
 | |
|     for (i = 0; i < qmf_voc_columns; i++) {
 | |
|       WORD32 k;
 | |
|       FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|       x_zero_band_r = *x_norm_ptr++;
 | |
|       x_zero_band_i = *x_norm_ptr++;
 | |
| 
 | |
|       for (k = 0; k < HBE_OPER_BLK_LEN_2; k++) {
 | |
|         register FLOAT32 tmp_r, tmp_i;
 | |
|         tmp_r = *norm_ptr++;
 | |
|         tmp_i = *norm_ptr++;
 | |
| 
 | |
|         *out_ptr++ +=
 | |
|             ((tmp_r * x_zero_band_r - tmp_i * x_zero_band_i) * 0.3333333f);
 | |
| 
 | |
|         *out_ptr++ +=
 | |
|             ((tmp_r * x_zero_band_i + tmp_i * x_zero_band_r) * 0.3333333f);
 | |
| 
 | |
|         norm_ptr += 126;
 | |
|         out_ptr += 126;
 | |
|       }
 | |
| 
 | |
|       norm_ptr -= 128 * 9;
 | |
|       out_ptr -= 128 * 8;
 | |
|       x_norm_ptr += 126;
 | |
|     }
 | |
|     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
 | |
|     norm_ptr -= (128 * qmf_voc_columns) - 2;
 | |
|     x_norm_ptr -= (128 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_prod3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
 | |
|   WORD32 i, inp_band_idx, rem;
 | |
| 
 | |
|   FLOAT32 *out_buf = &ptr_hbe_txposer->qmf_out_buf[2][2 * qmf_band_idx];
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[2]; qmf_band_idx++) {
 | |
|     FLOAT32 temp_r, temp_i;
 | |
|     FLOAT32 temp_r1, temp_i1;
 | |
|     const FLOAT32 *ptr_sel, *ptr_sel1;
 | |
| 
 | |
|     inp_band_idx = (2 * qmf_band_idx) / 3;
 | |
|     ptr_sel = &ixheaacd_sel_case[(inp_band_idx + 1) & 3][0];
 | |
|     ptr_sel1 = &ixheaacd_sel_case[((inp_band_idx + 1) & 3) + 1][0];
 | |
|     rem = 2 * qmf_band_idx - 3 * inp_band_idx;
 | |
| 
 | |
|     if (rem == 0 || rem == 1) {
 | |
|       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
 | |
| 
 | |
|       for (i = 0; i < qmf_voc_columns; i += 1) {
 | |
|         WORD32 k;
 | |
|         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
 | |
|         FLOAT32 *ptr_vec_x = &vec_x[0];
 | |
|         FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|         FLOAT32 mag_scaling_fac;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
 | |
|           FLOAT64 base1;
 | |
|           FLOAT64 base = 1e-17;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           in_buf += 256;
 | |
| 
 | |
|           base1 = base + temp_r * temp_r;
 | |
|           base1 = base1 + temp_i * temp_i;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[0] = temp_r * mag_scaling_fac;
 | |
|           ptr_vec_x[1] = temp_i * mag_scaling_fac;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           in_buf -= 128;
 | |
| 
 | |
|           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
 | |
|           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           temp_r1 += ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
 | |
|           temp_i1 += ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
 | |
| 
 | |
|           temp_r1 *= 0.3984033437f;
 | |
|           temp_i1 *= 0.3984033437f;
 | |
| 
 | |
|           base1 = base + temp_r1 * temp_r1;
 | |
|           base1 = base1 + temp_i1 * temp_i1;
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[2] = temp_r1 * mag_scaling_fac;
 | |
|           ptr_vec_x[3] = temp_i1 * mag_scaling_fac;
 | |
| 
 | |
|           ptr_vec_x += 4;
 | |
|           in_buf += 256;
 | |
|         }
 | |
|         ptr_vec_x = &vec_x[0];
 | |
|         temp_r = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i = vec_x[(2 * (HBE_ZERO_BAND_IDX - 2)) + 1];
 | |
| 
 | |
|         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
 | |
|         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
 | |
|           temp_r = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
 | |
|           temp_i = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
 | |
| 
 | |
|           out_buf[0] += (temp_r * 0.4714045f);
 | |
|           out_buf[1] += (temp_i * 0.4714045f);
 | |
| 
 | |
|           ptr_vec_x += 2;
 | |
|           out_buf += 128;
 | |
|         }
 | |
| 
 | |
|         in_buf -= 128 * 11;
 | |
|         out_buf -= 128 * 6;
 | |
|       }
 | |
|     } else {
 | |
|       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
 | |
|       FLOAT32 *in_buf1 =
 | |
|           &ptr_hbe_txposer->qmf_in_buf[0][2 * (inp_band_idx + 1)];
 | |
| 
 | |
|       for (i = 0; i < qmf_voc_columns; i++) {
 | |
|         WORD32 k;
 | |
|         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
 | |
|         FLOAT32 vec_x_cap[2 * HBE_OPER_WIN_LEN];
 | |
| 
 | |
|         FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
|         FLOAT32 *ptr_vec_x = &vec_x[0];
 | |
|         FLOAT32 *ptr_vec_x_cap = &vec_x_cap[0];
 | |
| 
 | |
|         FLOAT32 mag_scaling_fac;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
 | |
|           FLOAT32 tmp_vr, tmp_vi;
 | |
|           FLOAT32 tmp_cr, tmp_ci;
 | |
|           FLOAT64 base1;
 | |
|           FLOAT64 base = 1e-17;
 | |
| 
 | |
|           temp_r1 = in_buf[0];
 | |
|           temp_i1 = in_buf[1];
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           base1 = base + temp_r * temp_r;
 | |
|           base1 = base1 + temp_i * temp_i;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[0] = temp_r * mag_scaling_fac;
 | |
|           ptr_vec_x[1] = temp_i * mag_scaling_fac;
 | |
| 
 | |
|           base1 = base + temp_r1 * temp_r1;
 | |
|           base1 = base1 + temp_i1 * temp_i1;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x_cap[0] = temp_r1 * mag_scaling_fac;
 | |
|           ptr_vec_x_cap[1] = temp_i1 * mag_scaling_fac;
 | |
| 
 | |
|           in_buf += 256;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
 | |
|           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
 | |
| 
 | |
|           in_buf -= 128;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           tmp_cr = temp_r1 + ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
 | |
|           tmp_ci = temp_i1 + ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
 | |
| 
 | |
|           in_buf1 += 256;
 | |
| 
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           temp_r1 = ptr_sel1[0] * temp_r + ptr_sel1[1] * temp_i;
 | |
|           temp_i1 = ptr_sel1[2] * temp_r + ptr_sel1[3] * temp_i;
 | |
| 
 | |
|           in_buf1 -= 128;
 | |
| 
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           tmp_vr = temp_r1 + ptr_sel1[4] * temp_r + ptr_sel1[5] * temp_i;
 | |
|           tmp_vi = temp_i1 + ptr_sel1[6] * temp_r + ptr_sel1[7] * temp_i;
 | |
| 
 | |
|           tmp_cr *= 0.3984033437f;
 | |
|           tmp_ci *= 0.3984033437f;
 | |
| 
 | |
|           tmp_vr *= 0.3984033437f;
 | |
|           tmp_vi *= 0.3984033437f;
 | |
| 
 | |
|           base1 = base + tmp_vr * tmp_vr;
 | |
|           base1 = base1 + tmp_vi * tmp_vi;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[2] = tmp_vr * mag_scaling_fac;
 | |
|           ptr_vec_x[3] = tmp_vi * mag_scaling_fac;
 | |
| 
 | |
|           base1 = base + tmp_cr * tmp_cr;
 | |
|           base1 = base1 + tmp_ci * tmp_ci;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x_cap[2] = tmp_cr * mag_scaling_fac;
 | |
|           ptr_vec_x_cap[3] = tmp_ci * mag_scaling_fac;
 | |
| 
 | |
|           in_buf += 256;
 | |
|           in_buf1 += 256;
 | |
|           ptr_vec_x += 4;
 | |
|           ptr_vec_x_cap += 4;
 | |
|         }
 | |
|         ptr_vec_x = &vec_x[0];
 | |
|         ptr_vec_x_cap = &vec_x_cap[0];
 | |
| 
 | |
|         temp_r = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
 | |
|         temp_r1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
 | |
| 
 | |
|         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
 | |
|         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
 | |
| 
 | |
|         temp_r = temp_r1 * temp_r1 - temp_i1 * temp_i1;
 | |
|         temp_i = temp_r1 * temp_i1 + temp_i1 * temp_r1;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
 | |
|           temp_r1 = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
 | |
|           temp_i1 = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
 | |
| 
 | |
|           temp_r1 += ptr_vec_x_cap[0] * temp_r - ptr_vec_x_cap[1] * temp_i;
 | |
|           temp_i1 += ptr_vec_x_cap[0] * temp_i + ptr_vec_x_cap[1] * temp_r;
 | |
| 
 | |
|           out_buf[0] += (temp_r1 * 0.23570225f);
 | |
|           out_buf[1] += (temp_i1 * 0.23570225f);
 | |
| 
 | |
|           out_buf += 128;
 | |
|           ptr_vec_x += 2;
 | |
|           ptr_vec_x_cap += 2;
 | |
|         }
 | |
| 
 | |
|         in_buf -= 128 * 11;
 | |
|         in_buf1 -= 128 * 11;
 | |
|         out_buf -= 128 * 6;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     out_buf -= (256 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_prod4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
 | |
|   WORD32 i, inp_band_idx;
 | |
|   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[3][2 * qmf_band_idx];
 | |
| 
 | |
|   ixheaacd_norm_qmf_in_buf_4(ptr_hbe_txposer, ((qmf_band_idx >> 1) - 1));
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
 | |
|     WORD32 ip_idx;
 | |
|     FLOAT32 temp, temp_r, temp_i;
 | |
|     FLOAT32 *norm_ptr, *x_norm_ptr;
 | |
|     inp_band_idx = qmf_band_idx >> 1;
 | |
|     ip_idx = (qmf_band_idx & 1) ? (inp_band_idx + 1) : (inp_band_idx - 1);
 | |
| 
 | |
|     norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * ip_idx];
 | |
|     x_norm_ptr =
 | |
|         &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * inp_band_idx];
 | |
| 
 | |
|     for (i = 0; i < qmf_voc_columns; i++) {
 | |
|       WORD32 k;
 | |
|       FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|       temp_r = x_zero_band_r = *x_norm_ptr++;
 | |
|       temp_i = x_zero_band_i = *x_norm_ptr++;
 | |
| 
 | |
|       temp = x_zero_band_r * x_zero_band_r - x_zero_band_i * x_zero_band_i;
 | |
|       x_zero_band_i =
 | |
|           x_zero_band_r * x_zero_band_i + x_zero_band_i * x_zero_band_r;
 | |
| 
 | |
|       x_zero_band_r = temp_r * temp - temp_i * x_zero_band_i;
 | |
|       x_zero_band_i = temp_r * x_zero_band_i + temp_i * temp;
 | |
| 
 | |
|       for (k = 0; k < HBE_OPER_BLK_LEN_4; k++) {
 | |
|         temp = *norm_ptr++;
 | |
|         temp_i = *norm_ptr++;
 | |
| 
 | |
|         temp_r = temp * x_zero_band_r - temp_i * x_zero_band_i;
 | |
|         temp_i = temp * x_zero_band_i + temp_i * x_zero_band_r;
 | |
| 
 | |
|         *out_ptr++ += (temp_r * 0.6666667f);
 | |
|         *out_ptr++ += (temp_i * 0.6666667f);
 | |
| 
 | |
|         norm_ptr += 254;
 | |
|         out_ptr += 126;
 | |
|       }
 | |
| 
 | |
|       norm_ptr -= 128 * 11;
 | |
|       out_ptr -= 128 * 4;
 | |
|       x_norm_ptr += 126;
 | |
|     }
 | |
| 
 | |
|     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_xprod2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
 | |
|                                    FLOAT32 p, FLOAT32 *cos_sin_theta) {
 | |
|   WORD32 i;
 | |
|   FLOAT32 *norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[1][2 * qmf_band_idx];
 | |
|   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[1][2 * qmf_band_idx];
 | |
|   FLOAT32 *x_norm_ptr =
 | |
|       &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * qmf_band_idx];
 | |
| 
 | |
|   ixheaacd_norm_qmf_in_buf_2(ptr_hbe_txposer, qmf_band_idx);
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
 | |
|     WORD32 n1, n2;
 | |
|     FLOAT64 temp_fac;
 | |
|     FLOAT32 mag_cmplx_gain = 1.666666667f;
 | |
|     temp_fac = (2.0 * qmf_band_idx + 1 - p) * 0.5;
 | |
|     n1 = ((WORD32)(temp_fac)) << 1;
 | |
|     n2 = ((WORD32)(temp_fac + p)) << 1;
 | |
| 
 | |
|     for (i = 0; i < qmf_voc_columns; i++) {
 | |
|       WORD32 k;
 | |
|       FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|       x_zero_band_r = *x_norm_ptr++;
 | |
|       x_zero_band_i = *x_norm_ptr++;
 | |
| 
 | |
|       for (k = 1; k < (HBE_OPER_BLK_LEN_2 + 1); k++) {
 | |
|         register FLOAT32 tmp_r, tmp_i;
 | |
|         tmp_r = *norm_ptr++;
 | |
|         tmp_i = *norm_ptr++;
 | |
| 
 | |
|         *out_ptr++ +=
 | |
|             ((tmp_r * x_zero_band_r - tmp_i * x_zero_band_i) * 0.3333333f);
 | |
| 
 | |
|         *out_ptr++ +=
 | |
|             ((tmp_r * x_zero_band_i + tmp_i * x_zero_band_r) * 0.3333333f);
 | |
| 
 | |
|         norm_ptr += 126;
 | |
|         out_ptr += 126;
 | |
|       }
 | |
|       norm_ptr -= 128 * 9;
 | |
|       out_ptr -= 128 * 8;
 | |
|       x_norm_ptr += 126;
 | |
| 
 | |
|       {
 | |
|         WORD32 max_trans_fac, max_n1, max_n2;
 | |
|         FLOAT32 max_mag_value;
 | |
|         FLOAT32 mag_zero_band, mag_n1_band, mag_n2_band, temp;
 | |
| 
 | |
|         FLOAT32 *qmf_in_buf_ri =
 | |
|             ptr_hbe_txposer->qmf_in_buf[i + HBE_ZERO_BAND_IDX];
 | |
| 
 | |
|         mag_zero_band =
 | |
|             qmf_in_buf_ri[2 * qmf_band_idx] * qmf_in_buf_ri[2 * qmf_band_idx] +
 | |
|             qmf_in_buf_ri[2 * qmf_band_idx + 1] *
 | |
|                 qmf_in_buf_ri[2 * qmf_band_idx + 1];
 | |
| 
 | |
|         mag_n1_band = qmf_in_buf_ri[n1] * qmf_in_buf_ri[n1] +
 | |
|                       qmf_in_buf_ri[n1 + 1] * qmf_in_buf_ri[n1 + 1];
 | |
|         mag_n2_band = qmf_in_buf_ri[n2] * qmf_in_buf_ri[n2] +
 | |
|                       qmf_in_buf_ri[n2 + 1] * qmf_in_buf_ri[n2 + 1];
 | |
| 
 | |
|         temp = min(mag_n1_band, mag_n2_band);
 | |
| 
 | |
|         max_mag_value = 0;
 | |
|         max_trans_fac = 0;
 | |
|         max_n1 = 0;
 | |
|         max_n2 = 0;
 | |
| 
 | |
|         if (temp > 0) {
 | |
|           max_mag_value = temp;
 | |
|           max_trans_fac = 1;
 | |
|           max_n1 = n1;
 | |
|           max_n2 = n2;
 | |
|         }
 | |
| 
 | |
|         if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
 | |
|             max_n2 < TWICE_QMF_SYNTH_CHANNELS_NUM) {
 | |
|           FLOAT32 vec_y_r[2], vec_y_i[2];
 | |
|           FLOAT32 temp_r, temp_i, tmp_r1;
 | |
|           WORD32 mid_trans_fac, idx;
 | |
|           FLOAT64 base;
 | |
|           WORD32 k;
 | |
|           FLOAT32 mag_scaling_fac = 0.0f;
 | |
|           FLOAT32 x_zero_band_r = 0;
 | |
|           FLOAT32 x_zero_band_i = 0;
 | |
| 
 | |
|           mid_trans_fac = 2 - max_trans_fac;
 | |
| 
 | |
|           x_zero_band_r = qmf_in_buf_ri[max_n1];
 | |
|           x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
 | |
|           base = 1e-17;
 | |
|           base = base + x_zero_band_r * x_zero_band_r;
 | |
|           base = base + x_zero_band_i * x_zero_band_i;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(1.0f / base);
 | |
|           mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
 | |
| 
 | |
|           x_zero_band_r *= mag_scaling_fac;
 | |
|           x_zero_band_i *= mag_scaling_fac;
 | |
| 
 | |
|           temp_r = x_zero_band_r;
 | |
|           temp_i = x_zero_band_i;
 | |
|           for (idx = 0; idx < mid_trans_fac - 1; idx++) {
 | |
|             FLOAT32 tmp = x_zero_band_r;
 | |
|             x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
 | |
|             x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
 | |
|           }
 | |
| 
 | |
|           for (k = 0; k < 2; k++) {
 | |
|             temp_r = ptr_hbe_txposer
 | |
|                          ->qmf_in_buf[i + HBE_ZERO_BAND_IDX - 1 + k][max_n2];
 | |
|             temp_i =
 | |
|                 ptr_hbe_txposer
 | |
|                     ->qmf_in_buf[i + HBE_ZERO_BAND_IDX - 1 + k][max_n2 + 1];
 | |
| 
 | |
|             base = 1e-17;
 | |
|             base = base + temp_r * temp_r;
 | |
|             base = base + temp_i * temp_i;
 | |
| 
 | |
|             mag_scaling_fac = (FLOAT32)(1.0f / base);
 | |
|             mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
 | |
| 
 | |
|             temp_r *= mag_scaling_fac;
 | |
|             temp_i *= mag_scaling_fac;
 | |
| 
 | |
|             vec_y_r[k] = temp_r;
 | |
|             vec_y_i[k] = temp_i;
 | |
|           }
 | |
| 
 | |
|           temp_r = vec_y_r[0] * x_zero_band_r - vec_y_i[0] * x_zero_band_i;
 | |
|           temp_i = vec_y_r[0] * x_zero_band_i + vec_y_i[0] * x_zero_band_r;
 | |
| 
 | |
|           tmp_r1 =
 | |
|               (FLOAT32)(cos_sin_theta[0] * temp_r - cos_sin_theta[1] * temp_i);
 | |
|           temp_i =
 | |
|               (FLOAT32)(cos_sin_theta[0] * temp_i + cos_sin_theta[1] * temp_r);
 | |
| 
 | |
|           ptr_hbe_txposer->qmf_out_buf[i * 2 + (HBE_ZERO_BAND_IDX - 1)]
 | |
|                                       [2 * qmf_band_idx] +=
 | |
|               (FLOAT32)(mag_cmplx_gain * tmp_r1);
 | |
| 
 | |
|           ptr_hbe_txposer->qmf_out_buf[i * 2 + (HBE_ZERO_BAND_IDX - 1)]
 | |
|                                       [2 * qmf_band_idx + 1] +=
 | |
|               (FLOAT32)(mag_cmplx_gain * temp_i);
 | |
| 
 | |
|           temp_r = vec_y_r[1] * x_zero_band_r - vec_y_i[1] * x_zero_band_i;
 | |
|           temp_i = vec_y_r[1] * x_zero_band_i + vec_y_i[1] * x_zero_band_r;
 | |
| 
 | |
|           ptr_hbe_txposer->qmf_out_buf[i * 2 + (1 + HBE_ZERO_BAND_IDX - 1)]
 | |
|                                       [2 * qmf_band_idx] +=
 | |
|               (FLOAT32)(mag_cmplx_gain * temp_r);
 | |
| 
 | |
|           ptr_hbe_txposer->qmf_out_buf[i * 2 + (1 + HBE_ZERO_BAND_IDX - 1)]
 | |
|                                       [2 * qmf_band_idx + 1] +=
 | |
|               (FLOAT32)(mag_cmplx_gain * temp_i);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
 | |
|     norm_ptr -= (128 * qmf_voc_columns) - 2;
 | |
|     x_norm_ptr -= (128 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_xprod3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
 | |
|                                    FLOAT32 p, WORD32 pitch_in_bins_idx) {
 | |
|   WORD32 i, inp_band_idx, rem;
 | |
| 
 | |
|   FLOAT32 *out_buf = &ptr_hbe_txposer->qmf_out_buf[2][2 * qmf_band_idx];
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[2]; qmf_band_idx++) {
 | |
|     FLOAT32 temp_r, temp_i;
 | |
|     FLOAT32 temp_r1, temp_i1;
 | |
|     const FLOAT32 *ptr_sel, *ptr_sel1;
 | |
| 
 | |
|     inp_band_idx = (2 * qmf_band_idx) / 3;
 | |
|     ptr_sel = &ixheaacd_sel_case[(inp_band_idx + 1) & 3][0];
 | |
|     ptr_sel1 = &ixheaacd_sel_case[((inp_band_idx + 1) & 3) + 1][0];
 | |
|     rem = 2 * qmf_band_idx - 3 * inp_band_idx;
 | |
| 
 | |
|     if (rem == 0 || rem == 1) {
 | |
|       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
 | |
| 
 | |
|       for (i = 0; i < qmf_voc_columns; i += 1) {
 | |
|         WORD32 k;
 | |
|         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
 | |
|         FLOAT32 *ptr_vec_x = &vec_x[0];
 | |
|         FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|         FLOAT32 mag_scaling_fac;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
 | |
|           FLOAT64 base1;
 | |
|           FLOAT64 base = 1e-17;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           in_buf += 256;
 | |
| 
 | |
|           base1 = base + temp_r * temp_r;
 | |
|           base1 = base1 + temp_i * temp_i;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[0] = temp_r * mag_scaling_fac;
 | |
|           ptr_vec_x[1] = temp_i * mag_scaling_fac;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           in_buf -= 128;
 | |
| 
 | |
|           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
 | |
|           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           temp_r1 += ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
 | |
|           temp_i1 += ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
 | |
| 
 | |
|           temp_r1 *= 0.3984033437f;
 | |
|           temp_i1 *= 0.3984033437f;
 | |
| 
 | |
|           base1 = base + temp_r1 * temp_r1;
 | |
|           base1 = base1 + temp_i1 * temp_i1;
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[2] = temp_r1 * mag_scaling_fac;
 | |
|           ptr_vec_x[3] = temp_i1 * mag_scaling_fac;
 | |
| 
 | |
|           ptr_vec_x += 4;
 | |
|           in_buf += 256;
 | |
|         }
 | |
|         ptr_vec_x = &vec_x[0];
 | |
|         temp_r = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i = vec_x[(2 * (HBE_ZERO_BAND_IDX - 2)) + 1];
 | |
| 
 | |
|         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
 | |
|         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
 | |
|           temp_r = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
 | |
|           temp_i = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
 | |
| 
 | |
|           out_buf[0] += (temp_r * 0.4714045f);
 | |
|           out_buf[1] += (temp_i * 0.4714045f);
 | |
| 
 | |
|           ptr_vec_x += 2;
 | |
|           out_buf += 128;
 | |
|         }
 | |
| 
 | |
|         ixheaacd_hbe_xprod_proc_3(ptr_hbe_txposer, qmf_band_idx, i, p,
 | |
|                                   pitch_in_bins_idx);
 | |
| 
 | |
|         in_buf -= 128 * 11;
 | |
|         out_buf -= 128 * 6;
 | |
|       }
 | |
|     } else {
 | |
|       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
 | |
|       FLOAT32 *in_buf1 =
 | |
|           &ptr_hbe_txposer->qmf_in_buf[0][2 * (inp_band_idx + 1)];
 | |
| 
 | |
|       for (i = 0; i < qmf_voc_columns; i++) {
 | |
|         WORD32 k;
 | |
|         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
 | |
|         FLOAT32 vec_x_cap[2 * HBE_OPER_WIN_LEN];
 | |
| 
 | |
|         FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
|         FLOAT32 *ptr_vec_x = &vec_x[0];
 | |
|         FLOAT32 *ptr_vec_x_cap = &vec_x_cap[0];
 | |
| 
 | |
|         FLOAT32 mag_scaling_fac;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
 | |
|           FLOAT32 tmp_vr, tmp_vi;
 | |
|           FLOAT32 tmp_cr, tmp_ci;
 | |
|           FLOAT64 base1;
 | |
|           FLOAT64 base = 1e-17;
 | |
| 
 | |
|           temp_r1 = in_buf[0];
 | |
|           temp_i1 = in_buf[1];
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           base1 = base + temp_r * temp_r;
 | |
|           base1 = base1 + temp_i * temp_i;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[0] = temp_r * mag_scaling_fac;
 | |
|           ptr_vec_x[1] = temp_i * mag_scaling_fac;
 | |
| 
 | |
|           base1 = base + temp_r1 * temp_r1;
 | |
|           base1 = base1 + temp_i1 * temp_i1;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x_cap[0] = temp_r1 * mag_scaling_fac;
 | |
|           ptr_vec_x_cap[1] = temp_i1 * mag_scaling_fac;
 | |
| 
 | |
|           in_buf += 256;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
 | |
|           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
 | |
| 
 | |
|           in_buf -= 128;
 | |
| 
 | |
|           temp_r = in_buf[0];
 | |
|           temp_i = in_buf[1];
 | |
| 
 | |
|           tmp_cr = temp_r1 + ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
 | |
|           tmp_ci = temp_i1 + ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
 | |
| 
 | |
|           in_buf1 += 256;
 | |
| 
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           temp_r1 = ptr_sel1[0] * temp_r + ptr_sel1[1] * temp_i;
 | |
|           temp_i1 = ptr_sel1[2] * temp_r + ptr_sel1[3] * temp_i;
 | |
| 
 | |
|           in_buf1 -= 128;
 | |
| 
 | |
|           temp_r = in_buf1[0];
 | |
|           temp_i = in_buf1[1];
 | |
| 
 | |
|           tmp_vr = temp_r1 + ptr_sel1[4] * temp_r + ptr_sel1[5] * temp_i;
 | |
|           tmp_vi = temp_i1 + ptr_sel1[6] * temp_r + ptr_sel1[7] * temp_i;
 | |
| 
 | |
|           tmp_cr *= 0.3984033437f;
 | |
|           tmp_ci *= 0.3984033437f;
 | |
| 
 | |
|           tmp_vr *= 0.3984033437f;
 | |
|           tmp_vi *= 0.3984033437f;
 | |
| 
 | |
|           base1 = base + tmp_vr * tmp_vr;
 | |
|           base1 = base1 + tmp_vi * tmp_vi;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x[2] = tmp_vr * mag_scaling_fac;
 | |
|           ptr_vec_x[3] = tmp_vi * mag_scaling_fac;
 | |
| 
 | |
|           base1 = base + tmp_cr * tmp_cr;
 | |
|           base1 = base1 + tmp_ci * tmp_ci;
 | |
| 
 | |
|           mag_scaling_fac = (FLOAT32)(ixheaacd_cbrt_calc((FLOAT32)base1));
 | |
| 
 | |
|           ptr_vec_x_cap[2] = tmp_cr * mag_scaling_fac;
 | |
|           ptr_vec_x_cap[3] = tmp_ci * mag_scaling_fac;
 | |
| 
 | |
|           in_buf += 256;
 | |
|           in_buf1 += 256;
 | |
|           ptr_vec_x += 4;
 | |
|           ptr_vec_x_cap += 4;
 | |
|         }
 | |
|         ptr_vec_x = &vec_x[0];
 | |
|         ptr_vec_x_cap = &vec_x_cap[0];
 | |
| 
 | |
|         temp_r = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
 | |
|         temp_r1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
 | |
|         temp_i1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
 | |
| 
 | |
|         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
 | |
|         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
 | |
| 
 | |
|         temp_r = temp_r1 * temp_r1 - temp_i1 * temp_i1;
 | |
|         temp_i = temp_r1 * temp_i1 + temp_i1 * temp_r1;
 | |
| 
 | |
|         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
 | |
|           temp_r1 = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
 | |
|           temp_i1 = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
 | |
| 
 | |
|           temp_r1 += ptr_vec_x_cap[0] * temp_r - ptr_vec_x_cap[1] * temp_i;
 | |
|           temp_i1 += ptr_vec_x_cap[0] * temp_i + ptr_vec_x_cap[1] * temp_r;
 | |
| 
 | |
|           out_buf[0] += (temp_r1 * 0.23570225f);
 | |
|           out_buf[1] += (temp_i1 * 0.23570225f);
 | |
| 
 | |
|           out_buf += 128;
 | |
|           ptr_vec_x += 2;
 | |
|           ptr_vec_x_cap += 2;
 | |
|         }
 | |
| 
 | |
|         ixheaacd_hbe_xprod_proc_3(ptr_hbe_txposer, qmf_band_idx, i, p,
 | |
|                                   pitch_in_bins_idx);
 | |
| 
 | |
|         in_buf -= 128 * 11;
 | |
|         in_buf1 -= 128 * 11;
 | |
|         out_buf -= 128 * 6;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     out_buf -= (256 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_hbe_post_anal_xprod4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
 | |
|                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
 | |
|                                    FLOAT32 p, WORD32 pitch_in_bins_idx) {
 | |
|   WORD32 i, inp_band_idx;
 | |
|   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[3][2 * qmf_band_idx];
 | |
| 
 | |
|   ixheaacd_norm_qmf_in_buf_4(ptr_hbe_txposer, ((qmf_band_idx >> 1) - 1));
 | |
| 
 | |
|   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
 | |
|     WORD32 ip_idx;
 | |
|     FLOAT32 temp, temp_r, temp_i;
 | |
|     FLOAT32 *norm_ptr, *x_norm_ptr;
 | |
|     inp_band_idx = qmf_band_idx >> 1;
 | |
|     ip_idx = (qmf_band_idx & 1) ? (inp_band_idx + 1) : (inp_band_idx - 1);
 | |
| 
 | |
|     norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * ip_idx];
 | |
|     x_norm_ptr =
 | |
|         &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * inp_band_idx];
 | |
| 
 | |
|     for (i = 0; i < qmf_voc_columns; i++) {
 | |
|       WORD32 k;
 | |
|       FLOAT32 x_zero_band_r, x_zero_band_i;
 | |
| 
 | |
|       temp_r = x_zero_band_r = *x_norm_ptr++;
 | |
|       temp_i = x_zero_band_i = *x_norm_ptr++;
 | |
| 
 | |
|       temp = x_zero_band_r * x_zero_band_r - x_zero_band_i * x_zero_band_i;
 | |
|       x_zero_band_i =
 | |
|           x_zero_band_r * x_zero_band_i + x_zero_band_i * x_zero_band_r;
 | |
| 
 | |
|       x_zero_band_r = temp_r * temp - temp_i * x_zero_band_i;
 | |
|       x_zero_band_i = temp_r * x_zero_band_i + temp_i * temp;
 | |
| 
 | |
|       for (k = 0; k < HBE_OPER_BLK_LEN_4; k++) {
 | |
|         temp = *norm_ptr++;
 | |
|         temp_i = *norm_ptr++;
 | |
| 
 | |
|         temp_r = temp * x_zero_band_r - temp_i * x_zero_band_i;
 | |
|         temp_i = temp * x_zero_band_i + temp_i * x_zero_band_r;
 | |
| 
 | |
|         *out_ptr++ += (temp_r * 0.6666667f);
 | |
|         *out_ptr++ += (temp_i * 0.6666667f);
 | |
| 
 | |
|         norm_ptr += 254;
 | |
|         out_ptr += 126;
 | |
|       }
 | |
| 
 | |
|       norm_ptr -= 128 * 11;
 | |
|       out_ptr -= 128 * 4;
 | |
|       x_norm_ptr += 126;
 | |
| 
 | |
|       ixheaacd_hbe_xprod_proc_4(ptr_hbe_txposer, qmf_band_idx, i, p,
 | |
|                                 pitch_in_bins_idx);
 | |
|     }
 | |
| 
 | |
|     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| IA_ERRORCODE ixheaacd_hbe_post_anal_process(
 | |
|     ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, WORD32 pitch_in_bins,
 | |
|     WORD32 sbr_upsamp_4_flg) {
 | |
|   FLOAT32 p;
 | |
|   WORD32 trans_fac;
 | |
|   WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2;
 | |
|   FLOAT32 cos_sin_theta[2];
 | |
| 
 | |
|   p = (sbr_upsamp_4_flg) ? (FLOAT32)(pitch_in_bins * 0.04166666666666)
 | |
|                          : (FLOAT32)(pitch_in_bins * 0.08333333333333);
 | |
| 
 | |
|   if (p < SBR_CONST_PMIN) {
 | |
|     trans_fac = 2;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch)
 | |
|       ixheaacd_hbe_post_anal_prod2(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                    ptr_hbe_txposer->x_over_qmf[0]);
 | |
| 
 | |
|     trans_fac = 3;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch)
 | |
|       ixheaacd_hbe_post_anal_prod3(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                    ptr_hbe_txposer->x_over_qmf[1]);
 | |
| 
 | |
|     trans_fac = 4;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
 | |
|       if (ptr_hbe_txposer->x_over_qmf[2] <= 1) return IA_FATAL_ERROR;
 | |
|       ixheaacd_hbe_post_anal_prod4(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                    ptr_hbe_txposer->x_over_qmf[2]);
 | |
|     }
 | |
| 
 | |
|   } else {
 | |
|     trans_fac = 2;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
 | |
|       cos_sin_theta[0] = ixheaacd_hbe_x_prod_cos_table_trans_2
 | |
|           [((pitch_in_bins + sbr_upsamp_4_flg * 128) << 1) + 0];
 | |
|       cos_sin_theta[1] = ixheaacd_hbe_x_prod_cos_table_trans_2
 | |
|           [((pitch_in_bins + sbr_upsamp_4_flg * 128) << 1) + 1];
 | |
| 
 | |
|       ixheaacd_hbe_post_anal_xprod2(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                     ptr_hbe_txposer->x_over_qmf[0], p,
 | |
|                                     cos_sin_theta);
 | |
|     }
 | |
| 
 | |
|     trans_fac = 3;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch)
 | |
|       ixheaacd_hbe_post_anal_xprod3(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                     ptr_hbe_txposer->x_over_qmf[1], p,
 | |
|                                     (pitch_in_bins + sbr_upsamp_4_flg * 128));
 | |
| 
 | |
|     trans_fac = 4;
 | |
|     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
 | |
|       if (ptr_hbe_txposer->x_over_qmf[2] <= 1) return IA_FATAL_ERROR;
 | |
|       ixheaacd_hbe_post_anal_xprod4(ptr_hbe_txposer, qmf_voc_columns,
 | |
|                                     ptr_hbe_txposer->x_over_qmf[2], p,
 | |
|                                     (pitch_in_bins + sbr_upsamp_4_flg * 128));
 | |
|     }
 | |
|   }
 | |
|   return IA_NO_ERROR;
 | |
| }
 |