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