1 /****************************************************************************** 2 * * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #include <ixheaacd_type_def.h> 21 #include "ixheaacd_bitbuffer.h" 22 #include "ixheaacd_interface.h" 23 #include "ixheaacd_sbr_common.h" 24 #include "ixheaacd_drc_data_struct.h" 25 #include "ixheaacd_drc_dec.h" 26 27 #include "ixheaacd_sbr_const.h" 28 #include "ixheaacd_sbrdecsettings.h" 29 #include "ixheaacd_sbrdecoder.h" 30 #include "ixheaacd_env_extr_part.h" 31 #include <ixheaacd_sbr_rom.h> 32 #include "ixheaacd_common_rom.h" 33 #include "ixheaacd_hybrid.h" 34 #include "ixheaacd_sbr_scale.h" 35 #include "ixheaacd_ps_dec.h" 36 #include "ixheaacd_freq_sca.h" 37 #include "ixheaacd_lpp_tran.h" 38 #include "ixheaacd_bitbuffer.h" 39 #include "ixheaacd_env_extr.h" 40 #include "ixheaacd_qmf_dec.h" 41 #include "ixheaacd_env_calc.h" 42 #include "ixheaacd_pvc_dec.h" 43 #include "ixheaacd_sbr_dec.h" 44 #include "ixheaacd_qmf_poly.h" 45 #include "ixheaacd_esbr_rom.h" 46 47 #include "string.h" 48 49 WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) { 50 WORD32 idx; 51 WORD32 anal_size = 2 * ptr_hbe_txposer->synth_size; 52 WORD32 N = (10 * anal_size); 53 54 for (idx = 0; idx < (ptr_hbe_txposer->no_bins >> 1); idx++) { 55 WORD32 i, j, k, l; 56 FLOAT32 window_output[640]; 57 FLOAT32 u[128], u_in[256], u_out[256]; 58 FLOAT32 accu_r, accu_i; 59 const FLOAT32 *inp_signal; 60 FLOAT32 *anal_buf; 61 62 FLOAT32 *analy_cos_sin_tab = ptr_hbe_txposer->analy_cos_sin_tab; 63 const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->analy_wind_coeff; 64 FLOAT32 *x = ptr_hbe_txposer->analy_buf; 65 66 memset(ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1], 0, 67 TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32)); 68 69 inp_signal = ptr_hbe_txposer->ptr_input_buf + 70 idx * 2 * ptr_hbe_txposer->synth_size + 1; 71 anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1] 72 [4 * ptr_hbe_txposer->k_start]; 73 74 for (i = N - 1; i >= anal_size; i--) { 75 x[i] = x[i - anal_size]; 76 } 77 78 for (i = anal_size - 1; i >= 0; i--) { 79 x[i] = inp_signal[anal_size - 1 - i]; 80 } 81 82 for (i = 0; i < N; i++) { 83 window_output[i] = x[i] * interp_window_coeff[i]; 84 } 85 86 for (i = 0; i < 2 * anal_size; i++) { 87 accu_r = 0.0; 88 for (j = 0; j < 5; j++) { 89 accu_r = accu_r + window_output[i + j * 2 * anal_size]; 90 } 91 u[i] = accu_r; 92 } 93 94 if (anal_size == 40) { 95 for (i = 1; i < anal_size; i++) { 96 FLOAT32 temp1 = u[i] + u[2 * anal_size - i]; 97 FLOAT32 temp2 = u[i] - u[2 * anal_size - i]; 98 u[i] = temp1; 99 u[2 * anal_size - i] = temp2; 100 } 101 102 for (k = 0; k < anal_size; k++) { 103 accu_r = u[anal_size]; 104 if (k & 1) 105 accu_i = u[0]; 106 else 107 accu_i = -u[0]; 108 for (l = 1; l < anal_size; l++) { 109 accu_r = accu_r + u[0 + l] * analy_cos_sin_tab[2 * l + 0]; 110 accu_i = accu_i + u[2 * anal_size - l] * analy_cos_sin_tab[2 * l + 1]; 111 } 112 analy_cos_sin_tab += (2 * anal_size); 113 *anal_buf++ = (FLOAT32)accu_r; 114 *anal_buf++ = (FLOAT32)accu_i; 115 } 116 } else { 117 FLOAT32 *ptr_u = u_in; 118 FLOAT32 *ptr_v = u_out; 119 for (k = 0; k < anal_size * 2; k++) { 120 *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]); 121 *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]); 122 } 123 if (ptr_hbe_txposer->ixheaacd_cmplx_anal_fft != NULL) 124 (*(ptr_hbe_txposer->ixheaacd_cmplx_anal_fft))(u_in, u_out, 125 anal_size * 2); 126 else 127 return -1; 128 129 for (k = 0; k < anal_size / 2; k++) { 130 *(anal_buf + 1) = -*ptr_v++; 131 *anal_buf = *ptr_v++; 132 133 anal_buf += 2; 134 135 *(anal_buf + 1) = *ptr_v++; 136 *anal_buf = -*ptr_v++; 137 138 anal_buf += 2; 139 } 140 } 141 } 142 return 0; 143 } 144 145 WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, 146 WORD32 num_columns, FLOAT32 qmf_buf_real[][64], 147 FLOAT32 qmf_buf_imag[][64]) { 148 WORD32 i, j, k, l, idx; 149 FLOAT32 g[640]; 150 FLOAT32 w[640]; 151 FLOAT32 synth_out[128]; 152 FLOAT32 accu_r; 153 WORD32 synth_size = ptr_hbe_txposer->synth_size; 154 FLOAT32 *ptr_cos_tab_trans_qmf = 155 (FLOAT32 *)&ixheaacd_cos_table_trans_qmf[0][0] + 156 ptr_hbe_txposer->k_start * 32; 157 FLOAT32 *buffer = ptr_hbe_txposer->synth_buf; 158 159 for (idx = 0; idx < num_columns; idx++) { 160 FLOAT32 loc_qmf_buf[64]; 161 FLOAT32 *synth_buf_r = loc_qmf_buf; 162 FLOAT32 *out_buf = ptr_hbe_txposer->ptr_input_buf + 163 (idx + 1) * ptr_hbe_txposer->synth_size; 164 FLOAT32 *synth_cos_tab = ptr_hbe_txposer->synth_cos_tab; 165 const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->synth_wind_coeff; 166 if (ptr_hbe_txposer->k_start < 0) return -1; 167 for (k = 0; k < synth_size; k++) { 168 WORD32 ki = ptr_hbe_txposer->k_start + k; 169 synth_buf_r[k] = (FLOAT32)( 170 ptr_cos_tab_trans_qmf[(k << 1) + 0] * qmf_buf_real[idx][ki] + 171 ptr_cos_tab_trans_qmf[(k << 1) + 1] * qmf_buf_imag[idx][ki]); 172 173 synth_buf_r[k + ptr_hbe_txposer->synth_size] = 0; 174 } 175 176 for (l = (20 * synth_size - 1); l >= 2 * synth_size; l--) { 177 buffer[l] = buffer[l - 2 * synth_size]; 178 } 179 180 if (synth_size == 20) { 181 FLOAT32 *psynth_cos_tab = synth_cos_tab; 182 183 for (l = 0; l < (synth_size + 1); l++) { 184 accu_r = 0.0; 185 for (k = 0; k < synth_size; k++) { 186 accu_r += synth_buf_r[k] * psynth_cos_tab[k]; 187 } 188 buffer[0 + l] = accu_r; 189 buffer[synth_size - l] = accu_r; 190 psynth_cos_tab = psynth_cos_tab + synth_size; 191 } 192 for (l = (synth_size + 1); l < (2 * synth_size - synth_size / 2); l++) { 193 accu_r = 0.0; 194 for (k = 0; k < synth_size; k++) { 195 accu_r += synth_buf_r[k] * psynth_cos_tab[k]; 196 } 197 buffer[0 + l] = accu_r; 198 buffer[3 * synth_size - l] = -accu_r; 199 psynth_cos_tab = psynth_cos_tab + synth_size; 200 } 201 accu_r = 0.0; 202 for (k = 0; k < synth_size; k++) { 203 accu_r += synth_buf_r[k] * psynth_cos_tab[k]; 204 } 205 buffer[3 * synth_size >> 1] = accu_r; 206 } else { 207 FLOAT32 tmp; 208 FLOAT32 *ptr_u = synth_out; 209 WORD32 kmax = (synth_size >> 1); 210 FLOAT32 *syn_buf = &buffer[kmax]; 211 kmax += synth_size; 212 213 if (ptr_hbe_txposer->ixheaacd_real_synth_fft != NULL) 214 (*(ptr_hbe_txposer->ixheaacd_real_synth_fft))(synth_buf_r, synth_out, 215 synth_size * 2); 216 else 217 return -1; 218 219 for (k = 0; k < kmax; k++) { 220 tmp = ((*ptr_u++) * (*synth_cos_tab++)); 221 tmp -= ((*ptr_u++) * (*synth_cos_tab++)); 222 *syn_buf++ = tmp; 223 } 224 225 syn_buf = &buffer[0]; 226 kmax -= synth_size; 227 228 for (k = 0; k < kmax; k++) { 229 tmp = ((*ptr_u++) * (*synth_cos_tab++)); 230 tmp -= ((*ptr_u++) * (*synth_cos_tab++)); 231 *syn_buf++ = tmp; 232 } 233 } 234 235 for (i = 0; i < 5; i++) { 236 memcpy(&g[(2 * i + 0) * synth_size], &buffer[(4 * i + 0) * synth_size], 237 sizeof(FLOAT32) * synth_size); 238 memcpy(&g[(2 * i + 1) * synth_size], &buffer[(4 * i + 3) * synth_size], 239 sizeof(FLOAT32) * synth_size); 240 } 241 242 for (k = 0; k < 10 * synth_size; k++) { 243 w[k] = g[k] * interp_window_coeff[k]; 244 } 245 246 for (i = 0; i < synth_size; i++) { 247 accu_r = 0.0; 248 for (j = 0; j < 10; j++) { 249 accu_r = accu_r + w[synth_size * j + i]; 250 } 251 out_buf[i] = (FLOAT32)accu_r; 252 } 253 } 254 return 0; 255 } 256