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