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 <stdlib.h> 21 #include <math.h> 22 #include <string.h> 23 24 #include <ixheaacd_type_def.h> 25 26 #include "ixheaacd_sbr_const.h" 27 #include "ixheaacd_sbrdecsettings.h" 28 #include "ixheaacd_bitbuffer.h" 29 #include "ixheaacd_sbr_common.h" 30 #include "ixheaacd_drc_data_struct.h" 31 #include "ixheaacd_drc_dec.h" 32 #include "ixheaacd_sbrdecoder.h" 33 34 #include "ixheaacd_bitbuffer.h" 35 36 #include "ixheaacd_env_extr_part.h" 37 #include <ixheaacd_sbr_rom.h> 38 #include "ixheaacd_common_rom.h" 39 #include "ixheaacd_hybrid.h" 40 #include "ixheaacd_sbr_scale.h" 41 #include "ixheaacd_ps_dec.h" 42 #include "ixheaacd_freq_sca.h" 43 #include "ixheaacd_lpp_tran.h" 44 #include "ixheaacd_env_extr.h" 45 46 #include "ixheaacd_esbr_rom.h" 47 48 VOID ixheaacd_shellsort(WORD32 *in, WORD32 n) { 49 WORD32 i, j, v; 50 WORD32 inc = 1; 51 52 do 53 inc = 3 * inc + 1; 54 while (inc <= n); 55 56 do { 57 inc = inc / 3; 58 for (i = inc + 1; i <= n; i++) { 59 v = in[i - 1]; 60 j = i; 61 while (in[j - inc - 1] > v) { 62 in[j - 1] = in[j - inc - 1]; 63 j -= inc; 64 if (j <= inc) break; 65 } 66 in[j - 1] = v; 67 } 68 } while (inc > 1); 69 } 70 71 VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, 72 FLOAT32 input_real[][64], FLOAT32 input_imag[][64], 73 FLOAT32 input_real1[][64], FLOAT32 input_imag1[][64], 74 WORD32 x_over_qmf[MAX_NUM_PATCHES], 75 FLOAT32 *scratch_buff, FLOAT32 *env_out) { 76 WORD8 harmonics[64]; 77 FLOAT32(*env_tmp)[48]; 78 FLOAT32(*noise_level_pvc)[48]; 79 FLOAT32(*nrg_est_pvc)[48]; 80 FLOAT32(*nrg_ref_pvc)[48]; 81 FLOAT32(*nrg_gain_pvc)[48]; 82 FLOAT32(*nrg_tone_pvc)[48]; 83 84 WORD32 n, c, li, ui, i, j, k = 0, l, m = 0, kk = 0, o, next = -1, ui2, flag, 85 tmp, noise_absc_flag, smooth_length; 86 WORD32 upsamp_4_flag = frame_data->pstr_sbr_header->is_usf_4; 87 88 FLOAT32 *ptr_real_buf, *ptr_imag_buf, nrg = 0, p_ref, p_est, avg_gain, g_max, 89 p_adj, boost_gain, sb_gain, sb_noise, 90 temp[64]; 91 92 WORD32 t; 93 WORD32 start_pos = 0; 94 WORD32 end_pos = 0; 95 96 WORD32 slot_idx; 97 98 FLOAT32 *prev_env_noise_level = frame_data->prev_noise_level; 99 FLOAT32 *nrg_tone = scratch_buff; 100 FLOAT32 *noise_level = scratch_buff + 64; 101 FLOAT32 *nrg_est = scratch_buff + 128; 102 FLOAT32 *nrg_ref = scratch_buff + 192; 103 FLOAT32 *nrg_gain = scratch_buff + 256; 104 105 const FLOAT32 *smooth_filt; 106 107 FLOAT32 *sfb_nrg = frame_data->flt_env_sf_arr; 108 FLOAT32 *noise_floor = frame_data->flt_noise_floor; 109 ia_frame_info_struct *p_frame_info = &frame_data->str_frame_info_details; 110 111 ia_frame_info_struct *pvc_frame_info = &frame_data->str_pvc_frame_info; 112 WORD32 smoothing_length = frame_data->pstr_sbr_header->smoothing_mode ? 0 : 4; 113 WORD32 int_mode = frame_data->pstr_sbr_header->interpol_freq; 114 WORD32 limiter_band = frame_data->pstr_sbr_header->limiter_bands; 115 WORD32 limiter_gains = frame_data->pstr_sbr_header->limiter_gains; 116 WORD32 *add_harmonics = frame_data->add_harmonics; 117 WORD32 sub_band_start = 118 frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_start; 119 WORD32 sub_band_end = 120 frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end; 121 WORD32 reset = frame_data->reset_flag; 122 WORD32 num_subbands = sub_band_end - sub_band_start; 123 WORD32 bs_num_env = p_frame_info->num_env; 124 WORD32 trans_env = p_frame_info->transient_env; 125 WORD32 sbr_mode = frame_data->sbr_mode; 126 WORD32 prev_sbr_mode = frame_data->prev_sbr_mode; 127 128 WORD16 *freq_band_table[2]; 129 const WORD16 *num_sf_bands = 130 frame_data->pstr_sbr_header->pstr_freq_band_data->num_sf_bands; 131 WORD16 *freq_band_table_noise = 132 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_noise; 133 WORD32 num_nf_bands = 134 frame_data->pstr_sbr_header->pstr_freq_band_data->num_nf_bands; 135 136 WORD32 harm_index = frame_data->harm_index; 137 WORD32 phase_index = frame_data->phase_index; 138 WORD32 esbr_start_up = frame_data->pstr_sbr_header->esbr_start_up; 139 WORD32 esbr_start_up_pvc = frame_data->pstr_sbr_header->esbr_start_up_pvc; 140 WORD8(*harm_flag_prev)[64] = &frame_data->harm_flag_prev; 141 FLOAT32(*e_gain)[5][64] = &frame_data->e_gain; 142 FLOAT32(*noise_buf)[5][64] = &frame_data->noise_buf; 143 WORD32(*lim_table)[4][12 + 1] = &frame_data->lim_table; 144 WORD32(*gate_mode)[4] = &frame_data->gate_mode; 145 WORD32 freq_inv = 1; 146 147 WORD8(*harm_flag_varlen_prev)[64] = &frame_data->harm_flag_varlen_prev; 148 WORD8(*harm_flag_varlen)[64] = &frame_data->harm_flag_varlen; 149 WORD32 band_loop_end; 150 151 WORD32 rate = upsamp_4_flag ? 4 : 2; 152 153 env_tmp = frame_data->env_tmp; 154 noise_level_pvc = frame_data->noise_level_pvc; 155 nrg_est_pvc = frame_data->nrg_est_pvc; 156 nrg_ref_pvc = frame_data->nrg_ref_pvc; 157 nrg_gain_pvc = frame_data->nrg_gain_pvc; 158 nrg_tone_pvc = frame_data->nrg_tone_pvc; 159 160 freq_band_table[0] = 161 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[0]; 162 freq_band_table[1] = 163 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1]; 164 165 if (reset) { 166 esbr_start_up = 1; 167 esbr_start_up_pvc = 1; 168 phase_index = 0; 169 ixheaacd_createlimiterbands( 170 (*lim_table), (*gate_mode), 171 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, 172 num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, 173 upsamp_4_flag, &frame_data->patch_param); 174 } 175 176 if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) { 177 ixheaacd_createlimiterbands( 178 (*lim_table), (*gate_mode), 179 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, 180 num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, 181 upsamp_4_flag, &frame_data->patch_param); 182 183 frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode; 184 } 185 186 memset(harmonics, 0, 64 * sizeof(WORD8)); 187 188 if (sbr_mode == PVC_SBR) { 189 for (i = 0; i < num_sf_bands[HIGH]; i++) { 190 li = 191 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i]; 192 ui = frame_data->pstr_sbr_header->pstr_freq_band_data 193 ->freq_band_tbl_hi[i + 1]; 194 tmp = ((ui + li) - (sub_band_start << 1)) >> 1; 195 196 harmonics[tmp] = add_harmonics[i]; 197 } 198 199 for (t = 0; t < p_frame_info->border_vec[0]; t++) { 200 for (c = 0; c < 64; c++) { 201 frame_data->qmapped_pvc[c][t] = frame_data->qmapped_pvc[c][t + 16]; 202 } 203 } 204 205 for (i = 0; i < bs_num_env; i++) { 206 if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) 207 kk++, next++; 208 209 start_pos = p_frame_info->border_vec[i]; 210 end_pos = p_frame_info->border_vec[i + 1]; 211 212 for (t = start_pos; t < end_pos; t++) { 213 band_loop_end = num_sf_bands[p_frame_info->freq_res[i]]; 214 215 for (c = 0, o = 0, j = 0; j < band_loop_end; j++) { 216 li = freq_band_table[p_frame_info->freq_res[i]][j]; 217 ui = freq_band_table[p_frame_info->freq_res[i]][j + 1]; 218 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data 219 ->freq_band_tbl_noise[o + 1]; 220 221 for (k = 0; k < ui - li; k++) { 222 o = (k + li >= ui2) ? o + 1 : o; 223 ui2 = freq_band_table_noise[o + 1]; 224 225 frame_data->qmapped_pvc[c][t] = 226 noise_floor[next * num_nf_bands + o]; 227 c++; 228 } 229 } 230 } 231 } 232 233 kk = 0; 234 next = -1; 235 236 for (i = 0; i < bs_num_env; i++) { 237 if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) 238 kk++, next++; 239 240 start_pos = pvc_frame_info->border_vec[i]; 241 end_pos = pvc_frame_info->border_vec[i + 1]; 242 243 for (t = start_pos; t < end_pos; t++) { 244 for (c = 0; c < 64; c++) { 245 env_tmp[c][t] = env_out[64 * t + c]; 246 } 247 } 248 249 noise_absc_flag = 250 (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0; 251 252 if (prev_sbr_mode == ORIG_SBR) noise_absc_flag = 0; 253 254 smooth_length = (noise_absc_flag ? 0 : smoothing_length); 255 smooth_filt = *ixheaacd_fir_table[smooth_length]; 256 257 for (t = start_pos; t < frame_data->sin_len_for_cur_top; t++) { 258 band_loop_end = 259 num_sf_bands[frame_data->str_frame_info_prev 260 .freq_res[frame_data->var_len_id_prev]]; 261 262 for (c = 0, o = 0, j = 0; j < band_loop_end; j++) { 263 double tmp; 264 265 li = freq_band_table[frame_data->str_frame_info_prev 266 .freq_res[frame_data->var_len_id_prev]][j]; 267 ui = freq_band_table[frame_data->str_frame_info_prev 268 .freq_res[frame_data->var_len_id_prev]] 269 [j + 1]; 270 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data 271 ->freq_band_tbl_noise[o + 1]; 272 273 for (flag = 0, k = li; k < ui; k++) { 274 flag = ((*harm_flag_varlen)[c] && 275 (t >= frame_data->sin_start_for_cur_top || 276 (*harm_flag_varlen_prev)[c + sub_band_start])) 277 ? 1 278 : flag; 279 280 nrg_ref_pvc[c][t] = env_tmp[k][t]; 281 for (nrg = 0, l = 0; l < rate; l++) { 282 nrg += 283 (input_real[rate * t + l][k] * input_real[rate * t + l][k]) + 284 (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]); 285 } 286 nrg_est_pvc[c][t] = nrg / rate; 287 c++; 288 } 289 290 if (!int_mode) { 291 for (nrg = 0, k = c - (ui - li); k < c; k++) { 292 nrg += nrg_est_pvc[k][t]; 293 } 294 nrg /= (ui - li); 295 } 296 c -= (ui - li); 297 298 for (k = 0; k < ui - li; k++) { 299 o = (k + li >= ui2) ? o + 1 : o; 300 ui2 = freq_band_table_noise[o + 1]; 301 nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t]; 302 nrg_tone_pvc[c][t] = 0.0f; 303 304 tmp = frame_data->qmapped_pvc[c][t] / 305 (1 + frame_data->qmapped_pvc[c][t]); 306 307 if (flag) { 308 nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp / 309 (nrg_est_pvc[c][t] + 1)); 310 311 nrg_tone_pvc[c][t] = (FLOAT32)( 312 (harmonics[c] && (t >= frame_data->sine_position || 313 (*harm_flag_prev)[c + sub_band_start])) 314 ? sqrt(nrg_ref_pvc[c][t] * tmp / 315 frame_data->qmapped_pvc[c][t]) 316 : nrg_tone_pvc[c][t]); 317 318 nrg_tone_pvc[c][t] = (FLOAT32)( 319 ((*harm_flag_varlen)[c] && 320 (t >= frame_data->sin_start_for_cur_top || 321 (*harm_flag_varlen_prev)[c + sub_band_start])) 322 ? sqrt(nrg_ref_pvc[c][t] * tmp / prev_env_noise_level[o]) 323 : nrg_tone_pvc[c][t]); 324 325 } else { 326 if (noise_absc_flag) { 327 nrg_gain_pvc[c][t] = 328 (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1)); 329 } else { 330 nrg_gain_pvc[c][t] = (FLOAT32)sqrt( 331 nrg_ref_pvc[c][t] * tmp / 332 ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t])); 333 } 334 } 335 336 noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp); 337 c++; 338 } 339 } 340 341 for (c = 0; c < (*gate_mode)[limiter_band]; c++) { 342 p_ref = p_est = 0.0f; 343 p_adj = 0; 344 for (k = (*lim_table)[limiter_band][c]; 345 k < (*lim_table)[limiter_band][c + 1]; k++) { 346 p_ref += nrg_ref_pvc[k][t]; 347 p_est += nrg_est_pvc[k][t]; 348 } 349 avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS)); 350 g_max = avg_gain * ixheaacd_g_lim_gains[limiter_gains]; 351 g_max > 1.0e5f ? g_max = 1.0e5f : 0; 352 for (k = (*lim_table)[limiter_band][c]; 353 k < (*lim_table)[limiter_band][c + 1]; k++) { 354 if (g_max <= nrg_gain_pvc[k][t]) { 355 noise_level_pvc[k][t] = 356 noise_level_pvc[k][t] * (g_max / nrg_gain_pvc[k][t]); 357 nrg_gain_pvc[k][t] = g_max; 358 } 359 360 p_adj += 361 nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t]; 362 363 if (nrg_tone_pvc[k][t]) { 364 p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t]; 365 } else if (!noise_absc_flag) { 366 p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t]; 367 } 368 } 369 boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS)); 370 boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain; 371 372 for (k = (*lim_table)[limiter_band][c]; 373 k < (*lim_table)[limiter_band][c + 1]; k++) { 374 nrg_gain_pvc[k][t] *= boost_gain; 375 noise_level_pvc[k][t] *= boost_gain; 376 nrg_tone_pvc[k][t] *= boost_gain; 377 } 378 } 379 } 380 381 for (; t < end_pos; t++) { 382 band_loop_end = num_sf_bands[pvc_frame_info->freq_res[i]]; 383 384 for (c = 0, o = 0, j = 0; j < band_loop_end; j++) { 385 double tmp; 386 387 li = freq_band_table[pvc_frame_info->freq_res[i]][j]; 388 ui = freq_band_table[pvc_frame_info->freq_res[i]][j + 1]; 389 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data 390 ->freq_band_tbl_noise[o + 1]; 391 392 for (flag = 0, k = li; k < ui; k++) { 393 flag = (harmonics[c] && (t >= frame_data->sine_position || 394 (*harm_flag_prev)[c + sub_band_start])) 395 ? 1 396 : flag; 397 398 nrg_ref_pvc[c][t] = env_tmp[k][t]; 399 for (nrg = 0, l = 0; l < rate; l++) { 400 nrg += 401 (input_real[rate * t + l][k] * input_real[rate * t + l][k]) + 402 (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]); 403 } 404 nrg_est_pvc[c][t] = nrg / rate; 405 c++; 406 } 407 408 if (!int_mode) { 409 for (nrg = 0, k = c - (ui - li); k < c; k++) { 410 nrg += nrg_est_pvc[k][t]; 411 } 412 nrg /= (ui - li); 413 } 414 c -= (ui - li); 415 416 for (k = 0; k < ui - li; k++) { 417 o = (k + li >= ui2) ? o + 1 : o; 418 ui2 = freq_band_table_noise[o + 1]; 419 nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t]; 420 nrg_tone_pvc[c][t] = 0.0f; 421 422 tmp = frame_data->qmapped_pvc[c][t] / 423 (1 + frame_data->qmapped_pvc[c][t]); 424 425 if (flag) { 426 nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp / 427 (nrg_est_pvc[c][t] + 1)); 428 429 nrg_tone_pvc[c][t] = (FLOAT32)( 430 (harmonics[c] && (t >= frame_data->sine_position || 431 (*harm_flag_prev)[c + sub_band_start])) 432 ? sqrt(nrg_ref_pvc[c][t] * tmp / 433 frame_data->qmapped_pvc[c][t]) 434 : nrg_tone_pvc[c][t]); 435 } else { 436 if (noise_absc_flag) { 437 nrg_gain_pvc[c][t] = 438 (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1)); 439 } else { 440 nrg_gain_pvc[c][t] = (FLOAT32)sqrt( 441 nrg_ref_pvc[c][t] * tmp / 442 ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t])); 443 } 444 } 445 446 noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp); 447 c++; 448 } 449 } 450 451 for (c = 0; c < (*gate_mode)[limiter_band]; c++) { 452 p_ref = p_est = 0.0f; 453 p_adj = 0; 454 for (k = (*lim_table)[limiter_band][c]; 455 k < (*lim_table)[limiter_band][c + 1]; k++) { 456 p_ref += nrg_ref_pvc[k][t]; 457 p_est += nrg_est_pvc[k][t]; 458 } 459 avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS)); 460 g_max = avg_gain * ixheaacd_g_lim_gains[limiter_gains]; 461 g_max > 1.0e5f ? g_max = 1.0e5f : 0; 462 463 for (k = (*lim_table)[limiter_band][c]; 464 k < (*lim_table)[limiter_band][c + 1]; k++) { 465 if (g_max <= nrg_gain_pvc[k][t]) { 466 noise_level_pvc[k][t] = 467 noise_level_pvc[k][t] * (g_max / nrg_gain_pvc[k][t]); 468 nrg_gain_pvc[k][t] = g_max; 469 } 470 471 p_adj += 472 nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t]; 473 474 if (nrg_tone_pvc[k][t]) { 475 p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t]; 476 } else if (!noise_absc_flag) { 477 p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t]; 478 } 479 } 480 481 boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS)); 482 boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain; 483 484 for (k = (*lim_table)[limiter_band][c]; 485 k < (*lim_table)[limiter_band][c + 1]; k++) { 486 nrg_gain_pvc[k][t] *= boost_gain; 487 noise_level_pvc[k][t] *= boost_gain; 488 nrg_tone_pvc[k][t] *= boost_gain; 489 } 490 } 491 } 492 493 if (esbr_start_up_pvc) { 494 for (n = 0; n < 4; n++) { 495 for (c = 0; c < num_subbands; c++) { 496 (*e_gain)[n][c] = nrg_gain_pvc[c][start_pos]; 497 (*noise_buf)[n][c] = noise_level_pvc[c][start_pos]; 498 } 499 } 500 esbr_start_up_pvc = 0; 501 esbr_start_up = 0; 502 } 503 for (l = rate * pvc_frame_info->border_vec[i]; 504 l < rate * pvc_frame_info->border_vec[1 + i]; l++) { 505 ptr_real_buf = *(input_real + l) + sub_band_start; 506 ptr_imag_buf = *(input_imag + l) + sub_band_start; 507 508 slot_idx = (WORD32)l / rate; 509 if (sub_band_start & 1) { 510 freq_inv = -1; 511 } 512 513 for (k = 0; k < num_subbands; k++) { 514 (*e_gain)[4][k] = nrg_gain_pvc[k][slot_idx]; 515 (*noise_buf)[4][k] = noise_level_pvc[k][slot_idx]; 516 c = 0, sb_gain = 0, sb_noise = 0; 517 for (n = 4 - smooth_length; n <= 4; n++) { 518 sb_gain += (*e_gain)[n][k] * smooth_filt[c]; 519 sb_noise += (*noise_buf)[n][k] * smooth_filt[c++]; 520 } 521 phase_index = (phase_index + 1) & 511; 522 sb_noise = (nrg_tone_pvc[k][slot_idx] != 0 || noise_absc_flag) 523 ? 0 524 : sb_noise; 525 526 *ptr_real_buf = 527 *ptr_real_buf * sb_gain + 528 sb_noise * ixheaacd_random_phase[phase_index][0] + 529 nrg_tone_pvc[k][slot_idx] * ixheaacd_hphase_tbl[0][harm_index]; 530 *ptr_imag_buf = *ptr_imag_buf * sb_gain + 531 sb_noise * ixheaacd_random_phase[phase_index][1] + 532 nrg_tone_pvc[k][slot_idx] * freq_inv * 533 ixheaacd_hphase_tbl[1][harm_index]; 534 535 ptr_real_buf++; 536 ptr_imag_buf++; 537 freq_inv = -freq_inv; 538 } 539 540 harm_index = (harm_index + 1) & 3; 541 542 memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32)); 543 for (n = 0; n < 4; n++) { 544 memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32)); 545 } 546 memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32)); 547 548 memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32)); 549 for (n = 0; n < 4; n++) { 550 memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32)); 551 } 552 memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32)); 553 } 554 } 555 } else { 556 for (i = 0; i < num_sf_bands[HIGH]; i++) { 557 li = 558 frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i]; 559 ui = frame_data->pstr_sbr_header->pstr_freq_band_data 560 ->freq_band_tbl_hi[i + 1]; 561 tmp = ((ui + li) - (sub_band_start << 1)) >> 1; 562 563 harmonics[tmp] = add_harmonics[i]; 564 } 565 566 for (i = 0; i < bs_num_env; i++) { 567 if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) 568 kk++, next++; 569 570 noise_absc_flag = 571 (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0; 572 573 smooth_length = (noise_absc_flag ? 0 : smoothing_length); 574 smooth_filt = *ixheaacd_fir_table[smooth_length]; 575 576 if (sbr_mode == ORIG_SBR) { 577 for (c = 0, o = 0, j = 0; j < num_sf_bands[p_frame_info->freq_res[i]]; 578 j++) { 579 double tmp; 580 li = freq_band_table[p_frame_info->freq_res[i]][j]; 581 ui = freq_band_table[p_frame_info->freq_res[i]][j + 1]; 582 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data 583 ->freq_band_tbl_noise[o + 1]; 584 for (flag = 0, k = li; k < ui; k++) { 585 for (nrg = 0, l = rate * p_frame_info->border_vec[i]; 586 l < rate * p_frame_info->border_vec[i + 1]; l++) { 587 nrg += (input_real[l][k] * input_real[l][k]) + 588 (input_imag[l][k] * input_imag[l][k]); 589 } 590 flag = (harmonics[c] && 591 (i >= trans_env || (*harm_flag_prev)[c + sub_band_start])) 592 ? 1 593 : flag; 594 nrg_est[c++] = nrg / (rate * p_frame_info->border_vec[i + 1] - 595 rate * p_frame_info->border_vec[i]); 596 } 597 if (!int_mode) { 598 for (nrg = 0, k = c - (ui - li); k < c; k++) { 599 nrg += nrg_est[k]; 600 } 601 nrg /= (ui - li); 602 } 603 c -= (ui - li); 604 605 for (k = 0; k < ui - li; k++) { 606 o = (k + li >= ui2) ? o + 1 : o; 607 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data 608 ->freq_band_tbl_noise[o + 1]; 609 nrg_ref[c] = sfb_nrg[m]; 610 nrg_est[c] = (!int_mode) ? nrg : nrg_est[c]; 611 nrg_tone[c] = 0; 612 tmp = noise_floor[next * num_nf_bands + o] / 613 (1 + noise_floor[next * num_nf_bands + o]); 614 if (flag) { 615 nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1)); 616 nrg_tone[c] = (FLOAT32)( 617 (harmonics[c] && 618 (i >= trans_env || (*harm_flag_prev)[c + sub_band_start])) 619 ? sqrt(nrg_ref[c] * tmp / 620 noise_floor[next * num_nf_bands + o]) 621 : nrg_tone[c]); 622 } else { 623 if (noise_absc_flag) 624 nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] / (nrg_est[c] + 1)); 625 else 626 nrg_gain[c] = 627 (FLOAT32)sqrt(nrg_ref[c] * tmp / 628 ((nrg_est[c] + 1) * 629 (noise_floor[next * num_nf_bands + o]))); 630 } 631 noise_level[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp); 632 c++; 633 } 634 m++; 635 } 636 637 for (c = 0; c < (*gate_mode)[limiter_band]; c++) { 638 p_ref = p_est = 0; 639 for (k = (*lim_table)[limiter_band][c]; 640 k < (*lim_table)[limiter_band][c + 1]; k++) { 641 p_ref += nrg_ref[k]; 642 p_est += nrg_est[k]; 643 } 644 avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS)); 645 g_max = avg_gain * ixheaacd_g_lim_gains[limiter_gains]; 646 g_max > 1.0e5f ? g_max = 1.0e5f : 0; 647 for (k = (*lim_table)[limiter_band][c]; 648 k < (*lim_table)[limiter_band][c + 1]; k++) { 649 if (g_max <= nrg_gain[k]) { 650 noise_level[k] = noise_level[k] * (g_max / nrg_gain[k]); 651 nrg_gain[k] = g_max; 652 } 653 } 654 p_adj = 0; 655 for (k = (*lim_table)[limiter_band][c]; 656 k < (*lim_table)[limiter_band][c + 1]; k++) { 657 p_adj += nrg_gain[k] * nrg_gain[k] * nrg_est[k]; 658 if (nrg_tone[k]) 659 p_adj += nrg_tone[k] * nrg_tone[k]; 660 else if (!noise_absc_flag) 661 p_adj += noise_level[k] * noise_level[k]; 662 } 663 boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS)); 664 boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain; 665 for (k = (*lim_table)[limiter_band][c]; 666 k < (*lim_table)[limiter_band][c + 1]; k++) { 667 nrg_gain[k] *= boost_gain; 668 noise_level[k] *= boost_gain; 669 nrg_tone[k] *= boost_gain; 670 } 671 } 672 673 if (esbr_start_up) { 674 for (n = 0; n < 4; n++) { 675 memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32)); 676 memcpy((*noise_buf)[n], noise_level, 677 num_subbands * sizeof(FLOAT32)); 678 } 679 esbr_start_up = 0; 680 esbr_start_up_pvc = 0; 681 } 682 683 for (l = rate * p_frame_info->border_vec[i]; 684 l < rate * p_frame_info->border_vec[i + 1]; l++) { 685 ptr_real_buf = *(input_real + l) + sub_band_start; 686 ptr_imag_buf = *(input_imag + l) + sub_band_start; 687 688 for (k = 0; k < num_subbands; k++) { 689 (*e_gain)[4][k] = nrg_gain[k]; 690 (*noise_buf)[4][k] = noise_level[k]; 691 c = 0, sb_gain = 0, sb_noise = 0; 692 for (n = 4 - smooth_length; n <= 4; n++) { 693 sb_gain += (*e_gain)[n][k] * smooth_filt[c]; 694 sb_noise += (*noise_buf)[n][k] * smooth_filt[c++]; 695 } 696 697 phase_index = (phase_index + 1) & 511; 698 sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise; 699 700 *ptr_real_buf = *ptr_real_buf * sb_gain + 701 sb_noise * ixheaacd_random_phase[phase_index][0]; 702 *ptr_imag_buf = *ptr_imag_buf * sb_gain + 703 sb_noise * ixheaacd_random_phase[phase_index][1]; 704 705 ptr_real_buf++; 706 ptr_imag_buf++; 707 } 708 709 memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32)); 710 for (n = 0; n < 4; n++) 711 memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32)); 712 memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32)); 713 memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32)); 714 for (n = 0; n < 4; n++) 715 memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32)); 716 memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32)); 717 } 718 719 ixheaacd_apply_inter_tes( 720 *(input_real1 + rate * p_frame_info->border_vec[i]), 721 *(input_imag1 + rate * p_frame_info->border_vec[i]), 722 *(input_real + rate * p_frame_info->border_vec[i]), 723 *(input_imag + rate * p_frame_info->border_vec[i]), 724 rate * p_frame_info->border_vec[i + 1] - 725 rate * p_frame_info->border_vec[i], 726 sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]); 727 728 for (l = rate * p_frame_info->border_vec[i]; 729 l < rate * p_frame_info->border_vec[i + 1]; l++) { 730 ptr_real_buf = *(input_real + l) + sub_band_start; 731 ptr_imag_buf = *(input_imag + l) + sub_band_start; 732 if (sub_band_start & 1) { 733 freq_inv = -1; 734 } 735 for (k = 0; k < num_subbands; k++) { 736 *ptr_real_buf += nrg_tone[k] * ixheaacd_hphase_tbl[0][harm_index]; 737 *ptr_imag_buf += 738 nrg_tone[k] * freq_inv * ixheaacd_hphase_tbl[1][harm_index]; 739 740 ptr_real_buf++; 741 ptr_imag_buf++; 742 freq_inv = -freq_inv; 743 } 744 harm_index = (harm_index + 1) & 3; 745 } 746 } 747 } 748 } 749 750 for (i = 0; i < 64; i++) { 751 (*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i]; 752 (*harm_flag_varlen)[i] = harmonics[i]; 753 } 754 755 memcpy(&((*harm_flag_prev)[0]) + sub_band_start, harmonics, 756 (64 - sub_band_start) * sizeof(WORD8)); 757 758 if (trans_env == bs_num_env) { 759 frame_data->env_short_flag_prev = 0; 760 } else { 761 frame_data->env_short_flag_prev = -1; 762 } 763 764 memcpy((VOID *)&frame_data->str_frame_info_prev, 765 (VOID *)&frame_data->str_frame_info_details, 766 sizeof(ia_frame_info_struct)); 767 768 if (frame_data->str_frame_info_details.num_env == 1) { 769 frame_data->var_len_id_prev = 0; 770 } else if (frame_data->str_frame_info_details.num_env == 2) { 771 frame_data->var_len_id_prev = 1; 772 } 773 774 for (i = 0; i < num_nf_bands; i++) { 775 prev_env_noise_level[i] = 776 frame_data->flt_noise_floor 777 [(frame_data->str_frame_info_details.num_noise_env - 1) * 778 num_nf_bands + 779 i]; 780 } 781 782 frame_data->harm_index = harm_index; 783 frame_data->phase_index = phase_index; 784 frame_data->pstr_sbr_header->esbr_start_up = esbr_start_up; 785 frame_data->pstr_sbr_header->esbr_start_up_pvc = esbr_start_up_pvc; 786 } 787 788 VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], 789 WORD32 gate_mode[4], WORD16 *freq_band_tbl, 790 WORD32 ixheaacd_num_bands, 791 WORD32 x_over_qmf[MAX_NUM_PATCHES], 792 WORD32 b_patching_mode, WORD32 upsamp_4_flag, 793 struct ixheaacd_lpp_trans_patch *patch_param) { 794 WORD32 i, j, k, is_patch_border[2]; 795 WORD32 patch_borders[MAX_NUM_PATCHES + 1]; 796 WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1]; 797 798 double num_octave; 799 WORD32 num_patches; 800 801 WORD32 sub_band_start = freq_band_tbl[0]; 802 WORD32 sub_band_end = freq_band_tbl[ixheaacd_num_bands]; 803 804 const double log2 = log(2.0); 805 const double limbnd_per_oct[4] = {0, 1.2, 2.0, 3.0}; 806 807 if (!b_patching_mode && (x_over_qmf != NULL)) { 808 num_patches = 0; 809 if (upsamp_4_flag) { 810 for (i = 1; i < MAX_NUM_PATCHES; i++) 811 if (x_over_qmf[i] != 0) num_patches++; 812 } else { 813 for (i = 1; i < 4; i++) 814 if (x_over_qmf[i] != 0) num_patches++; 815 } 816 for (i = 0; i < num_patches; i++) { 817 patch_borders[i] = x_over_qmf[i] - sub_band_start; 818 } 819 } else { 820 num_patches = patch_param->num_patches; 821 for (i = 0; i < num_patches; i++) { 822 patch_borders[i] = patch_param->start_subband[i] - sub_band_start; 823 } 824 } 825 patch_borders[i] = sub_band_end - sub_band_start; 826 827 lim_table[0][0] = freq_band_tbl[0] - sub_band_start; 828 lim_table[0][1] = freq_band_tbl[ixheaacd_num_bands] - sub_band_start; 829 gate_mode[0] = 1; 830 831 for (i = 1; i < 4; i++) { 832 for (k = 0; k <= ixheaacd_num_bands; k++) { 833 temp_limiter_band_calc[k] = freq_band_tbl[k] - sub_band_start; 834 } 835 836 for (k = 1; k < num_patches; k++) { 837 temp_limiter_band_calc[ixheaacd_num_bands + k] = patch_borders[k]; 838 } 839 840 gate_mode[i] = ixheaacd_num_bands + num_patches - 1; 841 ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1); 842 843 for (j = 1; j <= gate_mode[i]; j++) { 844 num_octave = log((double)(temp_limiter_band_calc[j] + sub_band_start) / 845 (temp_limiter_band_calc[j - 1] + sub_band_start)) / 846 log2; 847 848 if (num_octave * limbnd_per_oct[i] < 0.49) { 849 if (temp_limiter_band_calc[j] == temp_limiter_band_calc[j - 1]) { 850 temp_limiter_band_calc[j] = sub_band_end; 851 ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1); 852 gate_mode[i]--; 853 j--; 854 continue; 855 } 856 857 is_patch_border[0] = is_patch_border[1] = 0; 858 859 for (k = 0; k <= num_patches; k++) { 860 if (temp_limiter_band_calc[j - 1] == patch_borders[k]) { 861 is_patch_border[0] = 1; 862 break; 863 } 864 } 865 866 for (k = 0; k <= num_patches; k++) { 867 if (temp_limiter_band_calc[j] == patch_borders[k]) { 868 is_patch_border[1] = 1; 869 break; 870 } 871 } 872 873 if (!is_patch_border[1]) { 874 temp_limiter_band_calc[j] = sub_band_end; 875 ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1); 876 gate_mode[i]--; 877 j--; 878 } else if (!is_patch_border[0]) { 879 temp_limiter_band_calc[j - 1] = sub_band_end; 880 ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1); 881 gate_mode[i]--; 882 j--; 883 } 884 } 885 } 886 887 for (k = 0; k <= gate_mode[i]; k++) { 888 lim_table[i][k] = temp_limiter_band_calc[k]; 889 } 890 } 891 } 892 893 VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1, 894 FLOAT32 *qmf_real, FLOAT32 *qmf_imag, 895 WORD32 num_sample, WORD32 sub_band_start, 896 WORD32 num_subband, WORD32 gamma_idx) { 897 WORD32 sub_band_end = sub_band_start + num_subband; 898 FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE], 899 subsample_power_low[TIMESLOT_BUFFER_SIZE]; 900 FLOAT32 total_power_high = 0.0f; 901 FLOAT32 total_power_low = 0.0f, total_power_high_after = 1.0e-6f; 902 FLOAT32 gain[TIMESLOT_BUFFER_SIZE]; 903 FLOAT32 gain_adj, gain_adj_2; 904 FLOAT32 gamma = ixheaacd_q_gamma_table[gamma_idx]; 905 WORD32 i, j; 906 907 if (gamma > 0) { 908 for (i = 0; i < num_sample; i++) { 909 memcpy(&qmf_real[64 * i], &qmf_real1[64 * i], 910 sub_band_start * sizeof(FLOAT32)); 911 memcpy(&qmf_imag[64 * i], &qmf_imag1[64 * i], 912 sub_band_start * sizeof(FLOAT32)); 913 } 914 915 for (i = 0; i < num_sample; i++) { 916 subsample_power_low[i] = 0.0f; 917 for (j = 0; j < sub_band_start; j++) { 918 subsample_power_low[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j]; 919 subsample_power_low[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j]; 920 } 921 subsample_power_high[i] = 0.0f; 922 for (j = sub_band_start; j < sub_band_end; j++) { 923 subsample_power_high[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j]; 924 subsample_power_high[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j]; 925 } 926 total_power_low += subsample_power_low[i]; 927 total_power_high += subsample_power_high[i]; 928 } 929 930 for (i = 0; i < num_sample; i++) { 931 gain[i] = (FLOAT32)(sqrt(subsample_power_low[i] * num_sample / 932 (total_power_low + 1.0e-6f))); 933 } 934 935 for (i = 0; i < num_sample; i++) { 936 gain[i] = (FLOAT32)(1.0f + gamma * (gain[i] - 1.0f)); 937 } 938 939 for (i = 0; i < num_sample; i++) { 940 if (gain[i] < 0.2f) { 941 gain[i] = 0.2f; 942 } 943 944 subsample_power_high[i] *= gain[i] * gain[i]; 945 total_power_high_after += subsample_power_high[i]; 946 } 947 948 gain_adj_2 = total_power_high / total_power_high_after; 949 gain_adj = (FLOAT32)(sqrt(gain_adj_2)); 950 951 for (i = 0; i < num_sample; i++) { 952 gain[i] *= gain_adj; 953 954 for (j = sub_band_start; j < sub_band_end; j++) { 955 qmf_real[64 * i + j] *= gain[i]; 956 qmf_imag[64 * i + j] *= gain[i]; 957 } 958 } 959 } 960 } 961