impd_drc_filter_bank.h revision 51aa06e124ba688ca810b25ee0b5bb66678aac14
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#ifndef IMPD_DRC_FILTER_BANK_H 21#define IMPD_DRC_FILTER_BANK_H 22 23#define FILTER_BANK_PARAMETER_COUNT 16 24#define CASCADE_ALLPASS_COUNT_MAX 9 25#define QMF_NUM_FILT_BANDS 64 26#define QMF_FILT_RESOLUTION 64 27 28 29typedef struct ia_drc_qmf_filt_struct 30{ 31 32FLOAT64* ana_buff; 33FLOAT64* syn_buff; 34FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; 35FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; 36FLOAT64 syn_tab_real[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; 37FLOAT64 syn_tab_imag[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; 38 39}ia_drc_qmf_filt_struct; 40 41typedef struct { 42 FLOAT32 f_cross_norm; 43 FLOAT32 gamma; 44 FLOAT32 delta; 45} ia_filter_bank_params_struct; 46 47 48typedef struct { 49 FLOAT32 s00; 50 FLOAT32 s01; 51 FLOAT32 s10; 52 FLOAT32 s11; 53} ia_lr_filter_state_struct; 54 55 56typedef struct { 57 FLOAT32 s0; 58 FLOAT32 s1; 59} ia_all_pass_filter_state_struct; 60 61typedef struct { 62 FLOAT32 a0; 63 FLOAT32 a1; 64 FLOAT32 a2; 65 FLOAT32 b0; 66 FLOAT32 b1; 67 FLOAT32 b2; 68 FLOAT32 x_p[MAX_CHANNEL_COUNT*2]; 69 FLOAT32 y_p[MAX_CHANNEL_COUNT*2]; 70} ia_iir_filter_struct; 71typedef struct { 72 ia_iir_filter_struct low_pass; 73 ia_iir_filter_struct high_pass; 74} ia_two_band_filt_struct; 75 76typedef struct { 77 ia_iir_filter_struct str_low_pass_stage_1; 78 ia_iir_filter_struct str_high_pass_stage_1; 79 ia_iir_filter_struct str_low_pass_stage_2; 80 ia_iir_filter_struct str_high_pass_stage_2; 81 ia_iir_filter_struct str_all_pass_stage_2; 82} ia_three_band_filt_struct; 83 84typedef struct { 85 ia_iir_filter_struct str_low_pass_stage_1; 86 ia_iir_filter_struct str_high_pass_stage_1; 87 ia_iir_filter_struct str_all_pass_stage_2_high; 88 ia_iir_filter_struct str_all_pass_stage_2_low; 89 ia_iir_filter_struct str_low_pass_stage_3_high; 90 ia_iir_filter_struct str_high_pass_stage_3_high; 91 ia_iir_filter_struct str_low_pass_stage_3_low; 92 ia_iir_filter_struct str_high_pass_stage_3_low; 93} ia_four_band_filt_struct; 94 95typedef struct { 96 ia_iir_filter_struct str_all_pass_stage; 97} ia_all_pass_filter_sturct; 98 99typedef struct { 100 ia_all_pass_filter_sturct str_all_pass_cascade_filter[CASCADE_ALLPASS_COUNT_MAX]; 101 WORD32 num_filter; 102} ia_all_pass_cascade_struct; 103 104typedef struct { 105 WORD32 num_bands; 106 WORD32 complexity; 107 ia_two_band_filt_struct str_two_band_bank; 108 ia_three_band_filt_struct str_three_band_bank; 109 ia_four_band_filt_struct str_four_band_bank; 110 ia_all_pass_cascade_struct str_all_pass_cascade; 111} ia_drc_filter_bank_struct; 112 113typedef struct { 114 WORD32 nfilter_banks; 115 WORD32 num_ph_align_ch_groups; 116 WORD32 complexity; 117 ia_drc_filter_bank_struct str_drc_filter_bank[8]; 118} ia_filter_banks_struct; 119 120 121WORD32 122impd_init_all_filter_banks( ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc, 123 ia_drc_instructions_struct* str_drc_instruction_str, 124 ia_filter_banks_struct* ia_filter_banks_struct); 125 126VOID impd_two_band_filter_process(ia_two_band_filt_struct* str_two_band_bank, 127 WORD32 c, 128 WORD32 size, 129 FLOAT32* audio_in, 130 FLOAT32* audio_out[]); 131 132VOID impd_three_band_filter_process(ia_three_band_filt_struct* str_three_band_bank, 133 WORD32 c, 134 WORD32 size, 135 FLOAT32* audio_in, 136 FLOAT32* audio_out[]); 137 138VOID impd_four_band_filter_process(ia_four_band_filt_struct* str_four_band_bank, 139 WORD32 c, 140 WORD32 size, 141 FLOAT32* audio_in, 142 FLOAT32* audio_out[]); 143 144VOID impd_all_pass_cascade_process(ia_all_pass_cascade_struct *str_all_pass_cascade, 145 WORD32 c, 146 WORD32 size, 147 FLOAT32* audio_in); 148 149WORD32 150impd_shape_filt_block_init(ia_shape_filter_block_params_struct* pstr_shape_filter_block_params, 151 shape_filter_block* shape_filter_block); 152 153WORD32 154impd_shape_filt_block_adapt(const FLOAT32 drc_gain, 155 shape_filter_block* shape_filter_block); 156 157 158 159WORD32 impd_shape_filt_block_time_process(shape_filter_block* shape_filter_block, 160 FLOAT32* drc_gain, 161 const WORD32 channel, 162 FLOAT32 *audio_in, 163 WORD32 start, 164 WORD32 end); 165#endif 166