1*15dc779aSAndroid Build Coastguard Worker /****************************************************************************** 2*15dc779aSAndroid Build Coastguard Worker * * 3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 4*15dc779aSAndroid Build Coastguard Worker * 5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at: 8*15dc779aSAndroid Build Coastguard Worker * 9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*15dc779aSAndroid Build Coastguard Worker * 11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*15dc779aSAndroid Build Coastguard Worker * limitations under the License. 16*15dc779aSAndroid Build Coastguard Worker * 17*15dc779aSAndroid Build Coastguard Worker ***************************************************************************** 18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*15dc779aSAndroid Build Coastguard Worker */ 20*15dc779aSAndroid Build Coastguard Worker 21*15dc779aSAndroid Build Coastguard Worker #pragma once 22*15dc779aSAndroid Build Coastguard Worker #include <stdio.h> 23*15dc779aSAndroid Build Coastguard Worker 24*15dc779aSAndroid Build Coastguard Worker #define MAX_NUM_GROUPED_SFB (60) 25*15dc779aSAndroid Build Coastguard Worker #define MAX_BARK_VALUE (24.0f) 26*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_FAC (3.0f) 27*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_FAC (1.5f) 28*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_SP_ENERGY_L (3.0f) 29*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_L (2.0f) 30*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_L_LBR (1.5f) 31*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_SP_ENERGY_S (2.0f) 32*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_S (1.5f) 33*15dc779aSAndroid Build Coastguard Worker #define C_RATIO (0.001258925f) 34*15dc779aSAndroid Build Coastguard Worker 35*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_SCALE_FACTOR_BAND_LONG 51 36*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_SCALE_FACTOR_BAND_SHORT 15 37*15dc779aSAndroid Build Coastguard Worker 38*15dc779aSAndroid Build Coastguard Worker #define MAX_GROUPED_SFB 51 39*15dc779aSAndroid Build Coastguard Worker #define MAX_GROUPED_SFB_TEMP 60 40*15dc779aSAndroid Build Coastguard Worker #define BLOCK_SWITCHING_OFFSET (1 * 1024 + 3 * 128 + 64 + 128) 41*15dc779aSAndroid Build Coastguard Worker #define MAX_CHANNEL_BITS 6144 42*15dc779aSAndroid Build Coastguard Worker #define MAX_SFB_SHORT 15 43*15dc779aSAndroid Build Coastguard Worker 44*15dc779aSAndroid Build Coastguard Worker #define TRANS_FAC 8 45*15dc779aSAndroid Build Coastguard Worker #ifndef FRAME_LEN_SHORT_128 46*15dc779aSAndroid Build Coastguard Worker #define FRAME_LEN_SHORT_128 (FRAME_LEN_LONG / TRANS_FAC) 47*15dc779aSAndroid Build Coastguard Worker #endif 48*15dc779aSAndroid Build Coastguard Worker 49*15dc779aSAndroid Build Coastguard Worker typedef struct { 50*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_count; 51*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_active; 52*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_LONG + 1]; 53*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 54*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_allowed_inc_fac; 55*15dc779aSAndroid Build Coastguard Worker FLOAT32 min_remaining_thr_fac; 56*15dc779aSAndroid Build Coastguard Worker WORD32 low_pass_line; 57*15dc779aSAndroid Build Coastguard Worker FLOAT32 clip_energy; 58*15dc779aSAndroid Build Coastguard Worker FLOAT32 ratio; 59*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 60*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 61*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 62*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 63*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_LONG]; 64*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_long_config_struct; 65*15dc779aSAndroid Build Coastguard Worker 66*15dc779aSAndroid Build Coastguard Worker typedef struct { 67*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_count; 68*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_active; 69*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_SHORT + 1]; 70*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 71*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_allowed_inc_fac; 72*15dc779aSAndroid Build Coastguard Worker FLOAT32 min_remaining_thr_fac; 73*15dc779aSAndroid Build Coastguard Worker WORD32 low_pass_line; 74*15dc779aSAndroid Build Coastguard Worker FLOAT32 clip_energy; 75*15dc779aSAndroid Build Coastguard Worker FLOAT32 ratio; 76*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 77*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 78*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 79*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 80*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 81*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_short_config_struct; 82*15dc779aSAndroid Build Coastguard Worker 83*15dc779aSAndroid Build Coastguard Worker typedef struct { 84*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_count; 85*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb_per_grp; 86*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_per_group; 87*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence; 88*15dc779aSAndroid Build Coastguard Worker WORD32 window_shape; 89*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_offsets[100]; 90*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_energy; 91*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_spread_energy; 92*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_thr; 93*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec_coeffs; 94*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_sum_lr_energy; 95*15dc779aSAndroid Build Coastguard Worker FLOAT32 pe; 96*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_min_snr[100]; 97*15dc779aSAndroid Build Coastguard Worker WORD32 ms_used[100]; 98*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_out_data_struct; 99*15dc779aSAndroid Build Coastguard Worker 100*15dc779aSAndroid Build Coastguard Worker typedef struct { 101*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence; 102*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_thr_nm1[MAX_GROUPED_SFB_TEMP]; 103*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_thr_long; 104*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_thr_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 105*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_energy_long; 106*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_sfb_energy_long_ms[MAX_GROUPED_SFB_TEMP]; 107*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_sfb_energy_short_ms[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 108*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 109*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_spreaded_energy_long; 110*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_spreaded_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; 111*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_data_struct; 112*15dc779aSAndroid Build Coastguard Worker 113*15dc779aSAndroid Build Coastguard Worker typedef struct ia_psy_mod_struct { 114*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_long_config_struct str_psy_long_config[MAX_TIME_CHANNELS]; 115*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_short_config_struct str_psy_short_config[MAX_TIME_CHANNELS]; 116*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_data_struct str_psy_data[MAX_TIME_CHANNELS]; 117*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_out_data_struct str_psy_out_data[MAX_TIME_CHANNELS]; 118*15dc779aSAndroid Build Coastguard Worker FLOAT32 mdct_spec_coeff_buf[MAX_TIME_CHANNELS][1024]; 119*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_struct; 120*15dc779aSAndroid Build Coastguard Worker 121*15dc779aSAndroid Build Coastguard Worker typedef struct ia_sfb_params_struct { 122*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb[MAX_TIME_CHANNELS]; 123*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb[MAX_TIME_CHANNELS]; 124*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb_ste; 125*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_width_table[MAX_TIME_CHANNELS][MAX_SFB_LONG]; 126*15dc779aSAndroid Build Coastguard Worker WORD32 grouped_sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1]; 127*15dc779aSAndroid Build Coastguard Worker WORD32 sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1]; 128*15dc779aSAndroid Build Coastguard Worker WORD32 num_window_groups[MAX_TIME_CHANNELS]; 129*15dc779aSAndroid Build Coastguard Worker WORD32 window_group_length[MAX_TIME_CHANNELS][8]; 130*15dc779aSAndroid Build Coastguard Worker WORD32 window_shape[MAX_TIME_CHANNELS]; 131*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence[MAX_TIME_CHANNELS]; 132*15dc779aSAndroid Build Coastguard Worker WORD32 common_win[MAX_TIME_CHANNELS]; 133*15dc779aSAndroid Build Coastguard Worker 134*15dc779aSAndroid Build Coastguard Worker } ia_sfb_params_struct; 135*15dc779aSAndroid Build Coastguard Worker 136*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_init(ia_psy_mod_struct *pstr_psy_mod, WORD32 sample_rate, WORD32 bit_rate, 137*15dc779aSAndroid Build Coastguard Worker WORD32 band_width, WORD32 num_channels, WORD32 ch, WORD32 ele_id, 138*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl); 139*15dc779aSAndroid Build Coastguard Worker 140*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_sb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms, 141*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS], 142*15dc779aSAndroid Build Coastguard Worker WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type, 143*15dc779aSAndroid Build Coastguard Worker FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch, 144*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl); 145*15dc779aSAndroid Build Coastguard Worker 146*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_lb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms, 147*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS], 148*15dc779aSAndroid Build Coastguard Worker WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type, 149*15dc779aSAndroid Build Coastguard Worker FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch, 150*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl); 151