aboutsummaryrefslogtreecommitdiff
path: root/decoder/drc_src/impd_drc_eq.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/drc_src/impd_drc_eq.c')
-rw-r--r--decoder/drc_src/impd_drc_eq.c2540
1 files changed, 1189 insertions, 1351 deletions
diff --git a/decoder/drc_src/impd_drc_eq.c b/decoder/drc_src/impd_drc_eq.c
index 7519526..4acc37b 100644
--- a/decoder/drc_src/impd_drc_eq.c
+++ b/decoder/drc_src/impd_drc_eq.c
@@ -29,1526 +29,1364 @@
#include "impd_drc_gain_dec.h"
#include "impd_drc_eq.h"
+#define CONFIG_REAL_POLE 0
+#define CONFIG_COMPLEX_POLE 1
+#define CONFIG_REAL_ZERO_RADIUS_ONE 2
+#define CONFIG_REAL_ZERO 3
+#define CONFIG_GENERIC_ZERO 4
-#define CONFIG_REAL_POLE 0
-#define CONFIG_COMPLEX_POLE 1
-#define CONFIG_REAL_ZERO_RADIUS_ONE 2
-#define CONFIG_REAL_ZERO 3
-#define CONFIG_GENERIC_ZERO 4
+#define STEP_RATIO_F_LO 20.0f
+#define STEP_RATIO_F_HI 24000.0f
+#define STEP_RATIO_EQ_NODE_COUNT_MAX 33
-#define STEP_RATIO_F_LO 20.0f
-#define STEP_RATIO_F_HI 24000.0f
-#define STEP_RATIO_EQ_NODE_COUNT_MAX 33
-
-#define FILTER_ELEMENT_FORMAT_POLE_ZERO 0
-#define FILTER_ELEMENT_FORMAT_FIR 1
+#define FILTER_ELEMENT_FORMAT_POLE_ZERO 0
+#define FILTER_ELEMENT_FORMAT_FIR 1
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
-WORD32 impd_derive_subband_center_freq(WORD32 eq_subband_gain_count,
- WORD32 eq_subband_gain_format,
- FLOAT32 sample_rate,
- FLOAT32* subband_center_freq)
-{
- WORD32 i;
- FLOAT32 width, offset;
- switch (eq_subband_gain_format)
- {
- case GAINFORMAT_QMF32:
- case GAINFORMAT_QMF64:
- case GAINFORMAT_QMF128:
- case GAINFORMAT_UNIFORM:
- width = 0.5f * sample_rate / (FLOAT32) eq_subband_gain_count;
- offset = 0.5f * width;
- for (i=0; i<eq_subband_gain_count; i++)
- {
- subband_center_freq[i] = offset;
- offset = offset + width;
- }
- break;
- case GAINFORMAT_QMFHYBRID39:
- case GAINFORMAT_QMFHYBRID71:
- case GAINFORMAT_QMFHYBRID135:
- return(UNEXPECTED_ERROR);
- break;
- default:
- break;
- }
- return (0);
+WORD32 impd_derive_subband_center_freq(WORD32 eq_subband_gain_count,
+ WORD32 eq_subband_gain_format,
+ FLOAT32 sample_rate,
+ FLOAT32* subband_center_freq) {
+ WORD32 i;
+ FLOAT32 width, offset;
+ switch (eq_subband_gain_format) {
+ case GAINFORMAT_QMF32:
+ case GAINFORMAT_QMF64:
+ case GAINFORMAT_QMF128:
+ case GAINFORMAT_UNIFORM:
+ width = 0.5f * sample_rate / (FLOAT32)eq_subband_gain_count;
+ offset = 0.5f * width;
+ for (i = 0; i < eq_subband_gain_count; i++) {
+ subband_center_freq[i] = offset;
+ offset = offset + width;
+ }
+ break;
+ case GAINFORMAT_QMFHYBRID39:
+ case GAINFORMAT_QMFHYBRID71:
+ case GAINFORMAT_QMFHYBRID135:
+ return (UNEXPECTED_ERROR);
+ break;
+ default:
+ break;
+ }
+ return (0);
}
-VOID impd_calc_fir_filt_response(WORD32 fir_order,
- WORD32 fir_symmetry,
- FLOAT32 *coeff,
- FLOAT32 frequency_radian,
- FLOAT32 *response)
-{
- WORD32 m;
- FLOAT32 sum = 0.0f;
- WORD32 o2;
-
- if ((fir_order & 0x1) == 0)
- {
- o2 = fir_order/2;
- if (fir_symmetry == 0)
- {
- /*ITTIAM: sum is been over written after the loop
- None of the conformance streams with us entering this function*/
- for (m=1; m<=o2; m++)
- {
- sum += coeff[o2-m] *(FLOAT32)cos (m * frequency_radian);
- }
- sum += sum;
- sum = coeff[o2];
- }
- else
- {
- for (m=1; m<=o2; m++)
- {
- sum += coeff[o2-m] * (FLOAT32)sin (m * frequency_radian);
- }
- sum += sum;
- }
+VOID impd_calc_fir_filt_response(WORD32 fir_order, WORD32 fir_symmetry,
+ FLOAT32* coeff, FLOAT32 frequency_radian,
+ FLOAT32* response) {
+ WORD32 m;
+ FLOAT32 sum = 0.0f;
+ WORD32 o2;
+
+ if ((fir_order & 0x1) == 0) {
+ o2 = fir_order / 2;
+ if (fir_symmetry == 0) {
+ /*ITTIAM: sum is been over written after the loop
+ None of the conformance streams with us entering this function*/
+ for (m = 1; m <= o2; m++) {
+ sum += coeff[o2 - m] * (FLOAT32)cos(m * frequency_radian);
+ }
+ sum += sum;
+ sum = coeff[o2];
+ } else {
+ for (m = 1; m <= o2; m++) {
+ sum += coeff[o2 - m] * (FLOAT32)sin(m * frequency_radian);
+ }
+ sum += sum;
}
- else
- {
- o2 = (fir_order+1)/2;
- if (fir_symmetry == 0)
- {
- for (m=1; m<=o2; m++)
- {
- sum += coeff[o2-m] * (FLOAT32)cos ((m - 0.5f) * frequency_radian);
- }
- }
- else
- {
- for (m=1; m<=o2; m++)
- {
- sum += coeff[o2-m] * (FLOAT32)sin ((m - 0.5f) * frequency_radian);
- }
- }
- sum += sum;
+ } else {
+ o2 = (fir_order + 1) / 2;
+ if (fir_symmetry == 0) {
+ for (m = 1; m <= o2; m++) {
+ sum += coeff[o2 - m] * (FLOAT32)cos((m - 0.5f) * frequency_radian);
+ }
+ } else {
+ for (m = 1; m <= o2; m++) {
+ sum += coeff[o2 - m] * (FLOAT32)sin((m - 0.5f) * frequency_radian);
+ }
}
- *response = sum;
- return;
+ sum += sum;
+ }
+ *response = sum;
+ return;
}
VOID impd_calc_filt_ele_response(ia_unique_td_filt_element* element,
- FLOAT32 frequency_radian,
- FLOAT32 *response)
-{
- WORD32 i;
- FLOAT32 part_response, radius, angle_radian;
- FLOAT64 total_response = 1.0;
-
- if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO)
- {
- for (i=0; i<element->bs_real_zero_radius_one_count; i++)
- {
- part_response = 1.0f + 1.0f - 2.0f * 1.0f * (FLOAT32)cos(frequency_radian - (FLOAT32) element->zero_sign[i]);
- total_response *= part_response;
- }
- for (i=0; i<element->real_zero_count; i++)
- {
- if (element->real_zero_radius[i] < 0.0f)
- {
- radius = - element->real_zero_radius[i];
- angle_radian =(FLOAT32) M_PI;
- }
- else
- {
- radius = element->real_zero_radius[i];
- angle_radian = 0.0f;
- }
- part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian);
- total_response *= part_response;
- part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian);
- total_response *= part_response;
- }
-
- total_response = sqrt(total_response);
+ FLOAT32 frequency_radian, FLOAT32* response) {
+ WORD32 i;
+ FLOAT32 part_response, radius, angle_radian;
+ FLOAT64 total_response = 1.0;
+
+ if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) {
+ for (i = 0; i < element->bs_real_zero_radius_one_count; i++) {
+ part_response =
+ 1.0f + 1.0f -
+ 2.0f * 1.0f *
+ (FLOAT32)cos(frequency_radian - (FLOAT32)element->zero_sign[i]);
+ total_response *= part_response;
+ }
+ for (i = 0; i < element->real_zero_count; i++) {
+ if (element->real_zero_radius[i] < 0.0f) {
+ radius = -element->real_zero_radius[i];
+ angle_radian = (FLOAT32)M_PI;
+ } else {
+ radius = element->real_zero_radius[i];
+ angle_radian = 0.0f;
+ }
+ part_response =
+ 1.0f + radius * radius -
+ 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian);
+ total_response *= part_response;
+ part_response =
+ 1.0f + radius * radius -
+ 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian);
+ total_response *= part_response;
+ }
- for (i=0; i<element->generic_zero_count; i++)
- {
- radius = element->generic_zero_radius[i];
- part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]);
- total_response *= part_response;
- part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]);
- total_response *= part_response;
- }
- for (i=0; i<element->real_pole_count; i++)
- {
- if (element->real_pole_radius[i] < 0.0f)
- {
- radius = - element->real_pole_radius[i];
- angle_radian =(FLOAT32)( - M_PI);
- }
- else
- {
- radius = element->real_pole_radius[i];
- angle_radian = 0.0f;
- }
- part_response = 1/(1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian));
- total_response *= part_response;
- }
- for (i=0; i<element->cmplx_pole_count; i++)
- {
- part_response = 1/(1.0f + element->real_pole_radius[i] * element->real_pole_radius[i] - 2.0f * element->real_pole_radius[i] * (FLOAT32)cos(frequency_radian - element->complex_pole_angle[i]));
- total_response *= part_response * part_response;
- }
+ total_response = sqrt(total_response);
+
+ for (i = 0; i < element->generic_zero_count; i++) {
+ radius = element->generic_zero_radius[i];
+ part_response =
+ 1.0f + radius * radius -
+ 2.0f * radius *
+ (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]);
+ total_response *= part_response;
+ part_response =
+ 1.0f + radius * radius -
+ 2.0f * radius *
+ (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]);
+ total_response *= part_response;
+ }
+ for (i = 0; i < element->real_pole_count; i++) {
+ if (element->real_pole_radius[i] < 0.0f) {
+ radius = -element->real_pole_radius[i];
+ angle_radian = (FLOAT32)(-M_PI);
+ } else {
+ radius = element->real_pole_radius[i];
+ angle_radian = 0.0f;
+ }
+ part_response =
+ 1 / (1.0f + radius * radius -
+ 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian));
+ total_response *= part_response;
}
- else
- {
- impd_calc_fir_filt_response(element->fir_filt_order,
- element->fir_symmetry,
- element->fir_coeff,
- frequency_radian,
- &part_response);
-
- total_response *= part_response;
+ for (i = 0; i < element->cmplx_pole_count; i++) {
+ part_response =
+ 1 /
+ (1.0f + element->real_pole_radius[i] * element->real_pole_radius[i] -
+ 2.0f * element->real_pole_radius[i] *
+ (FLOAT32)cos(frequency_radian - element->complex_pole_angle[i]));
+ total_response *= part_response * part_response;
}
- *response = (FLOAT32)total_response;
- return;
+ } else {
+ impd_calc_fir_filt_response(element->fir_filt_order, element->fir_symmetry,
+ element->fir_coeff, frequency_radian,
+ &part_response);
+
+ total_response *= part_response;
+ }
+ *response = (FLOAT32)total_response;
+ return;
}
-VOID impd_calc_filt_block_response(ia_unique_td_filt_element* unique_td_filt_ele,
- ia_filt_block_struct* str_filter_block,
- FLOAT32 frequency_radian,
- FLOAT32 *response)
-{
- WORD32 i;
- FLOAT32 part_response;
- FLOAT64 total_response = 1.0;
- for (i=0; i<str_filter_block->filter_element_count; i++)
- {
- ia_filt_ele_struct* str_filter_element = &str_filter_block->str_filter_element[i];
-
- impd_calc_filt_ele_response(&(unique_td_filt_ele[str_filter_element->filt_ele_idx]),
- frequency_radian,
- &part_response);
- total_response *= part_response;
-
- if (str_filter_element->filt_ele_gain_flag == 1)
- {
- total_response *= pow(10.0f, 0.05f * str_filter_element->filt_ele_gain);
- }
+VOID impd_calc_filt_block_response(
+ ia_unique_td_filt_element* unique_td_filt_ele,
+ ia_filt_block_struct* str_filter_block, FLOAT32 frequency_radian,
+ FLOAT32* response) {
+ WORD32 i;
+ FLOAT32 part_response;
+ FLOAT64 total_response = 1.0;
+ for (i = 0; i < str_filter_block->filter_element_count; i++) {
+ ia_filt_ele_struct* str_filter_element =
+ &str_filter_block->str_filter_element[i];
+
+ impd_calc_filt_ele_response(
+ &(unique_td_filt_ele[str_filter_element->filt_ele_idx]),
+ frequency_radian, &part_response);
+ total_response *= part_response;
+
+ if (str_filter_element->filt_ele_gain_flag == 1) {
+ total_response *= pow(10.0f, 0.05f * str_filter_element->filt_ele_gain);
}
- *response = (FLOAT32) total_response;
- return;
+ }
+ *response = (FLOAT32)total_response;
+ return;
}
-WORD32 impd_calc_subband_gains_td_cascade(ia_unique_td_filt_element* unique_td_filt_ele,
- ia_filt_block_struct* str_filter_block,
- ia_td_filter_cascade_struct* str_td_filter_cascade,
- WORD32 eq_subband_gain_format,
- WORD32 eq_ch_group_count,
- FLOAT32 sample_rate,
- WORD32 eq_frame_size_subband,
- ia_subband_filt_struct* subband_filt)
-{
- WORD32 i, err = 0, g, b;
- FLOAT32 response, frequency_radian;
- FLOAT32 subband_center_freq[256];
- FLOAT64 total_response;
-
- WORD32 eq_subband_gain_count = subband_filt->coeff_count;
-
- err = impd_derive_subband_center_freq(eq_subband_gain_count, eq_subband_gain_format, sample_rate, subband_center_freq);
- if (err)
- return(err);
-
- for (g=0; g<eq_ch_group_count; g++)
- {
- for (b=0; b<eq_subband_gain_count; b++)
- {
- total_response = pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]);
- frequency_radian = (FLOAT32)(2.0f * M_PI * subband_center_freq[b] / sample_rate);
- for (i=0; i<str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; i++)
- {
- impd_calc_filt_block_response(unique_td_filt_ele,
- &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g].filter_block_index[i]]),
- frequency_radian,
- &response);
- total_response *= response;
- }
- subband_filt[g].subband_coeff[b] = (FLOAT32) total_response;
- }
- subband_filt[g].eq_frame_size_subband = eq_frame_size_subband;
+WORD32 impd_calc_subband_gains_td_cascade(
+ ia_unique_td_filt_element* unique_td_filt_ele,
+ ia_filt_block_struct* str_filter_block,
+ ia_td_filter_cascade_struct* str_td_filter_cascade,
+ WORD32 eq_subband_gain_format, WORD32 eq_ch_group_count,
+ FLOAT32 sample_rate, WORD32 eq_frame_size_subband,
+ ia_subband_filt_struct* subband_filt) {
+ WORD32 i, err = 0, g, b;
+ FLOAT32 response, frequency_radian;
+ FLOAT32 subband_center_freq[256];
+ FLOAT64 total_response;
+
+ WORD32 eq_subband_gain_count = subband_filt->coeff_count;
+
+ err = impd_derive_subband_center_freq(eq_subband_gain_count,
+ eq_subband_gain_format, sample_rate,
+ subband_center_freq);
+ if (err) return (err);
+
+ for (g = 0; g < eq_ch_group_count; g++) {
+ for (b = 0; b < eq_subband_gain_count; b++) {
+ total_response =
+ pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]);
+ frequency_radian =
+ (FLOAT32)(2.0f * M_PI * subband_center_freq[b] / sample_rate);
+ for (i = 0;
+ i <
+ str_td_filter_cascade->str_filter_block_refs[g].filter_block_count;
+ i++) {
+ impd_calc_filt_block_response(
+ unique_td_filt_ele,
+ &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g]
+ .filter_block_index[i]]),
+ frequency_radian, &response);
+ total_response *= response;
+ }
+ subband_filt[g].subband_coeff[b] = (FLOAT32)total_response;
}
- return(0);
+ subband_filt[g].eq_frame_size_subband = eq_frame_size_subband;
+ }
+ return (0);
}
VOID impd_add_cascade(ia_cascade_align_group_struct* pstr_cascade_align_grp,
- WORD32 c1,
- WORD32 c2,
- WORD32* done)
-{
- WORD32 m, n;
-
- *done = 0;
- for (m=0; m<pstr_cascade_align_grp->member_count; m++)
- {
- if (pstr_cascade_align_grp->member_idx[m] == c1)
- {
- for (n=0; n<pstr_cascade_align_grp->member_count; n++)
- {
- if (pstr_cascade_align_grp->member_idx[n] == c2)
- {
- *done = 1;
- }
- }
- if (*done == 0)
- {
- pstr_cascade_align_grp->member_idx[pstr_cascade_align_grp->member_count] = c2;
- pstr_cascade_align_grp->member_count++;
- *done = 1;
- }
+ WORD32 c1, WORD32 c2, WORD32* done) {
+ WORD32 m, n;
+
+ *done = 0;
+ for (m = 0; m < pstr_cascade_align_grp->member_count; m++) {
+ if (pstr_cascade_align_grp->member_idx[m] == c1) {
+ for (n = 0; n < pstr_cascade_align_grp->member_count; n++) {
+ if (pstr_cascade_align_grp->member_idx[n] == c2) {
+ *done = 1;
}
+ }
+ if (*done == 0) {
+ pstr_cascade_align_grp
+ ->member_idx[pstr_cascade_align_grp->member_count] = c2;
+ pstr_cascade_align_grp->member_count++;
+ *done = 1;
+ }
}
- return;
+ }
+ return;
}
-VOID impd_calc_cascade_align_groups(WORD32 eq_ch_group_count,
- WORD32 eq_phase_alignment_present,
- WORD32 eq_phase_alignment[][EQ_CHANNEL_GROUP_COUNT_MAX],
- WORD32* cascade_align_grp_cnt,
- ia_cascade_align_group_struct* pstr_cascade_align_grp)
-{
- WORD32 i, k, g, group_count, done;
-
- group_count = 0;
-
- if (eq_phase_alignment_present == 0)
- {
- if (eq_ch_group_count > 1)
- {
- for (i=0; i<eq_ch_group_count; i++)
- {
- pstr_cascade_align_grp[group_count].member_idx[i] = i;
- }
- pstr_cascade_align_grp[group_count].member_count = eq_ch_group_count;
- group_count = 1;
- }
+VOID impd_calc_cascade_align_groups(
+ WORD32 eq_ch_group_count, WORD32 eq_phase_alignment_present,
+ WORD32 eq_phase_alignment[][EQ_CHANNEL_GROUP_COUNT_MAX],
+ WORD32* cascade_align_grp_cnt,
+ ia_cascade_align_group_struct* pstr_cascade_align_grp) {
+ WORD32 i, k, g, group_count, done;
+
+ group_count = 0;
+
+ if (eq_phase_alignment_present == 0) {
+ if (eq_ch_group_count > 1) {
+ for (i = 0; i < eq_ch_group_count; i++) {
+ pstr_cascade_align_grp[group_count].member_idx[i] = i;
+ }
+ pstr_cascade_align_grp[group_count].member_count = eq_ch_group_count;
+ group_count = 1;
}
- else
- {
- for (i=0; i<eq_ch_group_count; i++)
- {
- for (k=i+1; k<eq_ch_group_count; k++)
- {
- if (eq_phase_alignment[i][k] == 1)
- {
- done = 0;
- for (g=0; g<group_count; g++)
- {
- impd_add_cascade(&pstr_cascade_align_grp[g], i, k, &done);
-
- if (done == 0)
- {
- impd_add_cascade(&pstr_cascade_align_grp[g], k, i, &done);
- }
- }
- if (done == 0)
- {
- pstr_cascade_align_grp[group_count].member_idx[0] = i;
- pstr_cascade_align_grp[group_count].member_idx[1] = k;
- pstr_cascade_align_grp[group_count].member_count = 2;
- group_count++;
- }
- }
+ } else {
+ for (i = 0; i < eq_ch_group_count; i++) {
+ for (k = i + 1; k < eq_ch_group_count; k++) {
+ if (eq_phase_alignment[i][k] == 1) {
+ done = 0;
+ for (g = 0; g < group_count; g++) {
+ impd_add_cascade(&pstr_cascade_align_grp[g], i, k, &done);
+
+ if (done == 0) {
+ impd_add_cascade(&pstr_cascade_align_grp[g], k, i, &done);
}
+ }
+ if (done == 0) {
+ pstr_cascade_align_grp[group_count].member_idx[0] = i;
+ pstr_cascade_align_grp[group_count].member_idx[1] = k;
+ pstr_cascade_align_grp[group_count].member_count = 2;
+ group_count++;
+ }
}
+ }
}
- *cascade_align_grp_cnt = group_count;
- return;
+ }
+ *cascade_align_grp_cnt = group_count;
+ return;
}
-
-VOID impd_calc_phase_filt_params(WORD32 config,
- FLOAT32 radius,
- FLOAT32 angle,
- ia_ph_alignment_filt_struct* ph_alignment_filt)
-{
- WORD32 channel;
- FLOAT32 zReal, zImag;
- FLOAT32 prod;
- WORD32 section = ph_alignment_filt->section_count;
- ia_filt_sect_struct* filt_section = &ph_alignment_filt->filt_section[section];
- switch (config)
- {
- case CONFIG_REAL_POLE:
- ph_alignment_filt->gain *= (-radius);
- filt_section->a1 = - radius;
- filt_section->a2 = 0.0f;
- filt_section->b1 = - 1.0f / radius;
- filt_section->b2 = 0.0f;
- ph_alignment_filt->section_count++;
- break;
- case CONFIG_COMPLEX_POLE:
- zReal = radius * (FLOAT32)cos(M_PI * angle);
- zImag = radius * (FLOAT32)sin(M_PI * angle);
- prod = zReal * zReal + zImag * zImag;
- ph_alignment_filt->gain *= prod;
- filt_section->a1 = - 2.0f * zReal;
- filt_section->a2 = prod;
- filt_section->b1 = - 2.0f * zReal / prod;
- filt_section->b2 = 1.0f / prod;
- ph_alignment_filt->section_count++;
- break;
- default:
- break;
- }
- for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++)
- {
- filt_section->filt_sect_state[channel].in_state_1 = 0.0f;
- filt_section->filt_sect_state[channel].in_state_2 = 0.0f;
- filt_section->filt_sect_state[channel].out_state_1 = 0.0f;
- filt_section->filt_sect_state[channel].out_state_2 = 0.0f;
- }
-
- return;
+VOID impd_calc_phase_filt_params(
+ WORD32 config, FLOAT32 radius, FLOAT32 angle,
+ ia_ph_alignment_filt_struct* ph_alignment_filt) {
+ WORD32 channel;
+ FLOAT32 zReal, zImag;
+ FLOAT32 prod;
+ WORD32 section = ph_alignment_filt->section_count;
+ ia_filt_sect_struct* filt_section = &ph_alignment_filt->filt_section[section];
+ switch (config) {
+ case CONFIG_REAL_POLE:
+ ph_alignment_filt->gain *= (-radius);
+ filt_section->a1 = -radius;
+ filt_section->a2 = 0.0f;
+ filt_section->b1 = -1.0f / radius;
+ filt_section->b2 = 0.0f;
+ ph_alignment_filt->section_count++;
+ break;
+ case CONFIG_COMPLEX_POLE:
+ zReal = radius * (FLOAT32)cos(M_PI * angle);
+ zImag = radius * (FLOAT32)sin(M_PI * angle);
+ prod = zReal * zReal + zImag * zImag;
+ ph_alignment_filt->gain *= prod;
+ filt_section->a1 = -2.0f * zReal;
+ filt_section->a2 = prod;
+ filt_section->b1 = -2.0f * zReal / prod;
+ filt_section->b2 = 1.0f / prod;
+ ph_alignment_filt->section_count++;
+ break;
+ default:
+ break;
+ }
+ for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) {
+ filt_section->filt_sect_state[channel].in_state_1 = 0.0f;
+ filt_section->filt_sect_state[channel].in_state_2 = 0.0f;
+ filt_section->filt_sect_state[channel].out_state_1 = 0.0f;
+ filt_section->filt_sect_state[channel].out_state_2 = 0.0f;
+ }
+
+ return;
}
-
-VOID impd_calc_phase_filt_delay(ia_unique_td_filt_element* element,
- ia_ph_alignment_filt_struct* ph_alignment_filt)
-{
- WORD32 i, delay=0, channel;
- if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO)
- {
- if (element->bs_real_zero_radius_one_count == 0)
- {
- delay = element->real_zero_count + 2 * element->generic_zero_count - element->real_pole_count - 2 * element->cmplx_pole_count;
- delay = max(0, delay);
- ph_alignment_filt->validity_flag = 1;
- }
+VOID impd_calc_phase_filt_delay(
+ ia_unique_td_filt_element* element,
+ ia_ph_alignment_filt_struct* ph_alignment_filt) {
+ WORD32 i, delay = 0, channel;
+ if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) {
+ if (element->bs_real_zero_radius_one_count == 0) {
+ delay = element->real_zero_count + 2 * element->generic_zero_count -
+ element->real_pole_count - 2 * element->cmplx_pole_count;
+ delay = max(0, delay);
+ ph_alignment_filt->validity_flag = 1;
}
- ph_alignment_filt->audio_delay.delay = delay;
- for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++)
- {
- for (i=0; i<delay; i++)
- {
- ph_alignment_filt->audio_delay.state[channel][i] = 0.0f;
- }
+ }
+ ph_alignment_filt->audio_delay.delay = delay;
+ for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) {
+ for (i = 0; i < delay; i++) {
+ ph_alignment_filt->audio_delay.state[channel][i] = 0.0f;
}
+ }
- return;
+ return;
}
VOID impd_calc_phase_filt(ia_unique_td_filt_element* element,
WORD32 filt_ele_idx,
- ia_matching_ph_filt_struct* matching_ph_filt)
-{
- WORD32 i;
-
- memset(matching_ph_filt, 0, sizeof(ia_matching_ph_filt_struct));
- matching_ph_filt->gain = 1.0f;
-
- if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO)
- {
- for (i=0; i<element->real_pole_count; i++)
- {
- impd_calc_phase_filt_params(CONFIG_REAL_POLE,
- element->real_pole_radius[i],
- 0.0f,
- matching_ph_filt);
- }
- for (i=0; i<element->cmplx_pole_count; i++)
- {
- impd_calc_phase_filt_params(CONFIG_COMPLEX_POLE,
- element->complex_pole_radius[i],
- element->complex_pole_angle[i],
- matching_ph_filt);
- }
- }
- impd_calc_phase_filt_delay(element, matching_ph_filt);
-
- matching_ph_filt->num_matches_filter = 1;
- matching_ph_filt->matches_filter[0] = filt_ele_idx;
+ ia_matching_ph_filt_struct* matching_ph_filt) {
+ WORD32 i;
- return;
-}
+ memset(matching_ph_filt, 0, sizeof(ia_matching_ph_filt_struct));
+ matching_ph_filt->gain = 1.0f;
-WORD32 impd_calc_filt_params(ia_unique_td_filt_element* element,
- ia_interm_filt_params_struct* interm_filt_params)
-{
- FLOAT32 zReal;
- FLOAT32* coeff;
- //WORD32 offset_idx = 0;
- WORD32 i;
- WORD32 param_idx = 0;
-
- ia_2nd_order_filt_params_struct *pstr_2nd_oder_filt_params = &interm_filt_params->ord_2_filt_params_of_zeros[0];
-
- for (i=0; i<element->bs_real_zero_radius_one_count; i+=2)
- {
- FLOAT32 radius = (FLOAT32)element->zero_sign[i + 0];
- FLOAT32 angle = (FLOAT32)element->zero_sign[i + 1];
- FLOAT32 angle1 = radius;
- FLOAT32 angle2 = angle;
- pstr_2nd_oder_filt_params->radius = 1.0f;
- coeff = pstr_2nd_oder_filt_params->coeff;
-
- if (angle1 != angle2)
- {
- coeff[0] = 0.0f;
- coeff[1] = -1.0f;
- }
- else if (angle1 == 1.0f)
- {
- coeff[0] = -2.0f;
- coeff[1] = 1.0f;
- }
- else
- {
- coeff[0] = 2.0f;
- coeff[1] = 1.0f;
- }
- pstr_2nd_oder_filt_params += 1;
- param_idx += 1;
+ if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) {
+ for (i = 0; i < element->real_pole_count; i++) {
+ impd_calc_phase_filt_params(CONFIG_REAL_POLE,
+ element->real_pole_radius[i], 0.0f,
+ matching_ph_filt);
}
- for (i=0; i<element->real_zero_count; i++)
- {
- FLOAT32 radius = element->real_zero_radius[i];
- //FLOAT32 angle = 0.0f;
-
- pstr_2nd_oder_filt_params->radius = radius;
- if (fabs(radius) == 1.0f)
- {
- return (-1);
- }
- else
- {
- coeff = pstr_2nd_oder_filt_params->coeff;
- coeff[0] = - (radius + 1.0f / radius);
- coeff[1] = 1.0f;
- }
- pstr_2nd_oder_filt_params += 1;
- param_idx += 1;
- }
-
- for (i=0; i<element->generic_zero_count; i++)
- {
- FLOAT32 radius = element->generic_zero_radius[i];
- FLOAT32 angle = element->generic_zero_angle[i];
- zReal = radius * (FLOAT32)cos(M_PI * angle);
- pstr_2nd_oder_filt_params->radius = radius;
- coeff = pstr_2nd_oder_filt_params->coeff;
- coeff[0] = -2.0f * zReal;
- coeff[1] = radius * radius;
-
- pstr_2nd_oder_filt_params += 1;
-
- zReal = (FLOAT32)cos(M_PI * angle) / radius;
- pstr_2nd_oder_filt_params->radius = radius;
- coeff = pstr_2nd_oder_filt_params->coeff;
- coeff[0] = -2.0f * zReal;
- coeff[1] = 1.0f / (radius * radius);
-
- pstr_2nd_oder_filt_params += 1;
-
- param_idx += 2;
+ for (i = 0; i < element->cmplx_pole_count; i++) {
+ impd_calc_phase_filt_params(
+ CONFIG_COMPLEX_POLE, element->complex_pole_radius[i],
+ element->complex_pole_angle[i], matching_ph_filt);
}
+ }
+ impd_calc_phase_filt_delay(element, matching_ph_filt);
- interm_filt_params->filter_param_count_of_zeros = param_idx;
- param_idx = 0;
+ matching_ph_filt->num_matches_filter = 1;
+ matching_ph_filt->matches_filter[0] = filt_ele_idx;
- pstr_2nd_oder_filt_params = &interm_filt_params->ord_2_filt_params_of_poles[0];
+ return;
+}
- for (i=0; i<element->real_pole_count; i++)
- {
- FLOAT32 radius = element->real_pole_radius[i];
- pstr_2nd_oder_filt_params->radius = radius;
- coeff = pstr_2nd_oder_filt_params->coeff;
- coeff[0] = -2.0f * radius;
- coeff[1] = radius * radius;
- param_idx += 1;
- pstr_2nd_oder_filt_params += 1;
+WORD32 impd_calc_filt_params(ia_unique_td_filt_element* element,
+ ia_interm_filt_params_struct* interm_filt_params) {
+ FLOAT32 zReal;
+ FLOAT32* coeff;
+ // WORD32 offset_idx = 0;
+ WORD32 i;
+ WORD32 param_idx = 0;
+
+ ia_2nd_order_filt_params_struct* pstr_2nd_oder_filt_params =
+ &interm_filt_params->ord_2_filt_params_of_zeros[0];
+
+ for (i = 0; i < element->bs_real_zero_radius_one_count; i += 2) {
+ FLOAT32 radius = (FLOAT32)element->zero_sign[i + 0];
+ FLOAT32 angle = (FLOAT32)element->zero_sign[i + 1];
+ FLOAT32 angle1 = radius;
+ FLOAT32 angle2 = angle;
+ pstr_2nd_oder_filt_params->radius = 1.0f;
+ coeff = pstr_2nd_oder_filt_params->coeff;
+
+ if (angle1 != angle2) {
+ coeff[0] = 0.0f;
+ coeff[1] = -1.0f;
+ } else if (angle1 == 1.0f) {
+ coeff[0] = -2.0f;
+ coeff[1] = 1.0f;
+ } else {
+ coeff[0] = 2.0f;
+ coeff[1] = 1.0f;
}
-
- for (i=0; i<element->cmplx_pole_count; i++)
- {
- FLOAT32 radius = element->complex_pole_radius[i];
- FLOAT32 angle = element->complex_pole_angle[i];
-
- zReal = radius * (FLOAT32)cos(M_PI * angle);
- pstr_2nd_oder_filt_params->radius = radius;
- coeff = pstr_2nd_oder_filt_params->coeff;
- coeff[0] = -2.0f * zReal;
- coeff[1] = radius * radius;
-
- pstr_2nd_oder_filt_params += 1;
-
- pstr_2nd_oder_filt_params->radius = radius;
- pstr_2nd_oder_filt_params->coeff[0] = coeff[0];
- pstr_2nd_oder_filt_params->coeff[1] = coeff[1];
-
- pstr_2nd_oder_filt_params += 1;
- param_idx += 2;
+ pstr_2nd_oder_filt_params += 1;
+ param_idx += 1;
+ }
+ for (i = 0; i < element->real_zero_count; i++) {
+ FLOAT32 radius = element->real_zero_radius[i];
+ // FLOAT32 angle = 0.0f;
+
+ pstr_2nd_oder_filt_params->radius = radius;
+ if (fabs(radius) == 1.0f) {
+ return (-1);
+ } else {
+ coeff = pstr_2nd_oder_filt_params->coeff;
+ coeff[0] = -(radius + 1.0f / radius);
+ coeff[1] = 1.0f;
}
- interm_filt_params->filter_param_count_of_poles = param_idx;
- return 0;
+ pstr_2nd_oder_filt_params += 1;
+ param_idx += 1;
+ }
+
+ for (i = 0; i < element->generic_zero_count; i++) {
+ FLOAT32 radius = element->generic_zero_radius[i];
+ FLOAT32 angle = element->generic_zero_angle[i];
+ zReal = radius * (FLOAT32)cos(M_PI * angle);
+ pstr_2nd_oder_filt_params->radius = radius;
+ coeff = pstr_2nd_oder_filt_params->coeff;
+ coeff[0] = -2.0f * zReal;
+ coeff[1] = radius * radius;
+
+ pstr_2nd_oder_filt_params += 1;
+
+ zReal = (FLOAT32)cos(M_PI * angle) / radius;
+ pstr_2nd_oder_filt_params->radius = radius;
+ coeff = pstr_2nd_oder_filt_params->coeff;
+ coeff[0] = -2.0f * zReal;
+ coeff[1] = 1.0f / (radius * radius);
+
+ pstr_2nd_oder_filt_params += 1;
+
+ param_idx += 2;
+ }
+
+ interm_filt_params->filter_param_count_of_zeros = param_idx;
+ param_idx = 0;
+
+ pstr_2nd_oder_filt_params =
+ &interm_filt_params->ord_2_filt_params_of_poles[0];
+
+ for (i = 0; i < element->real_pole_count; i++) {
+ FLOAT32 radius = element->real_pole_radius[i];
+ pstr_2nd_oder_filt_params->radius = radius;
+ coeff = pstr_2nd_oder_filt_params->coeff;
+ coeff[0] = -2.0f * radius;
+ coeff[1] = radius * radius;
+ param_idx += 1;
+ pstr_2nd_oder_filt_params += 1;
+ }
+
+ for (i = 0; i < element->cmplx_pole_count; i++) {
+ FLOAT32 radius = element->complex_pole_radius[i];
+ FLOAT32 angle = element->complex_pole_angle[i];
+
+ zReal = radius * (FLOAT32)cos(M_PI * angle);
+ pstr_2nd_oder_filt_params->radius = radius;
+ coeff = pstr_2nd_oder_filt_params->coeff;
+ coeff[0] = -2.0f * zReal;
+ coeff[1] = radius * radius;
+
+ pstr_2nd_oder_filt_params += 1;
+
+ pstr_2nd_oder_filt_params->radius = radius;
+ pstr_2nd_oder_filt_params->coeff[0] = coeff[0];
+ pstr_2nd_oder_filt_params->coeff[1] = coeff[1];
+
+ pstr_2nd_oder_filt_params += 1;
+ param_idx += 2;
+ }
+ interm_filt_params->filter_param_count_of_poles = param_idx;
+ return 0;
}
-VOID impd_convert_fir_filt_params(WORD32 fir_filt_order,
- WORD32 fir_symmetry,
+VOID impd_convert_fir_filt_params(WORD32 fir_filt_order, WORD32 fir_symmetry,
FLOAT32* fir_coeff,
- ia_fir_filter_struct* fir_filter)
-{
- WORD32 i, channel;
- FLOAT32* coeff = fir_filter->coeff;
-
- fir_filter->coeff_count = fir_filt_order + 1;
- for (i=0; i<fir_filt_order/2+1; i++) {
- coeff[i] = fir_coeff[i];
+ ia_fir_filter_struct* fir_filter) {
+ WORD32 i, channel;
+ FLOAT32* coeff = fir_filter->coeff;
+
+ fir_filter->coeff_count = fir_filt_order + 1;
+ for (i = 0; i < fir_filt_order / 2 + 1; i++) {
+ coeff[i] = fir_coeff[i];
+ }
+
+ if (fir_symmetry == 1) {
+ for (i = 0; i < (fir_filt_order + 1) / 2; i++) {
+ coeff[fir_filt_order - i] = -coeff[i];
}
- if (fir_symmetry==1)
- {
- for (i=0; i<(fir_filt_order+1)/2; i++)
- {
- coeff[fir_filt_order-i] = - coeff[i];
- }
-
- if((fir_filt_order & 1) == 0)
- {
- coeff[fir_filt_order/2] = 0.0f;
- }
+ if ((fir_filt_order & 1) == 0) {
+ coeff[fir_filt_order / 2] = 0.0f;
}
- else
- {
- for (i=0; i<(fir_filt_order+1)/2; i++)
- {
- coeff[fir_filt_order-i] = coeff[i];
- }
+ } else {
+ for (i = 0; i < (fir_filt_order + 1) / 2; i++) {
+ coeff[fir_filt_order - i] = coeff[i];
}
+ }
- for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++)
- {
- for (i=0; i<fir_filt_order+1; i++) {
- fir_filter->state[channel][i] = 0.0f;
- }
+ for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) {
+ for (i = 0; i < fir_filt_order + 1; i++) {
+ fir_filter->state[channel][i] = 0.0f;
}
- return;
+ }
+ return;
}
-WORD32 impd_calc_filt_params_all(ia_unique_td_filt_element* element,
- ia_interm_filt_params_struct* interm_filt_params)
-{
- WORD32 err = 0;
-
- interm_filt_params->filter_format = element->eq_filter_format;
- if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO)
- {
- err = impd_calc_filt_params(element,
- interm_filt_params);
- if(err)
- return err;
- }
- else
- {
- interm_filt_params->filter_param_count_of_zeros = 0;
- interm_filt_params->filter_param_count_of_poles = 0;
-
- impd_convert_fir_filt_params (element->fir_filt_order,
- element->fir_symmetry,
- element->fir_coeff,
- &interm_filt_params->fir_filter);
- }
- return (0);
+WORD32 impd_calc_filt_params_all(
+ ia_unique_td_filt_element* element,
+ ia_interm_filt_params_struct* interm_filt_params) {
+ WORD32 err = 0;
+
+ interm_filt_params->filter_format = element->eq_filter_format;
+ if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) {
+ err = impd_calc_filt_params(element, interm_filt_params);
+ if (err) return err;
+ } else {
+ interm_filt_params->filter_param_count_of_zeros = 0;
+ interm_filt_params->filter_param_count_of_poles = 0;
+
+ impd_convert_fir_filt_params(element->fir_filt_order, element->fir_symmetry,
+ element->fir_coeff,
+ &interm_filt_params->fir_filter);
+ }
+ return (0);
}
-VOID impd_calc_eq_filt_elements(ia_interm_filt_params_struct* interm_filt_params,
- ia_eq_filt_ele_struct* eq_filt_element)
-{
- WORD32 i, poles_idx, zeros_idx, pole_order = 0, section, channel;
- WORD32 poles_over[REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX];
- WORD32 zeros_over[REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX];
- FLOAT32 max_radius, diff_radius;
- WORD32 coeff_count;
- FLOAT32* coeff;
-
- for (i=0; i<REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX; i++)
- {
- poles_over[i] = 0;
- }
- for (i=0; i<REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX; i++)
- {
- zeros_over[i] = 0;
- }
- section = 0;
- do
- {
- max_radius = -1.0;
- poles_idx = -1;
- for (i=0; i<interm_filt_params->filter_param_count_of_poles; i++)
- {
- if (poles_over[i] == 0)
- {
- if (interm_filt_params->filter_format == 0)
- {
- if (max_radius < fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius))
- {
- max_radius = (FLOAT32)fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius);
- poles_idx = i;
- if (interm_filt_params->ord_2_filt_params_of_poles[i].coeff[1] != 0.0f)
- {
- pole_order = 2;
- }
- else
- {
- pole_order = 1;
- }
- }
- }
+VOID impd_calc_eq_filt_elements(
+ ia_interm_filt_params_struct* interm_filt_params,
+ ia_eq_filt_ele_struct* eq_filt_element) {
+ WORD32 i, poles_idx, zeros_idx, pole_order = 0, section, channel;
+ WORD32 poles_over[REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX];
+ WORD32 zeros_over[REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX];
+ FLOAT32 max_radius, diff_radius;
+ WORD32 coeff_count;
+ FLOAT32* coeff;
+
+ for (i = 0; i < REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX; i++) {
+ poles_over[i] = 0;
+ }
+ for (i = 0; i < REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX; i++) {
+ zeros_over[i] = 0;
+ }
+ section = 0;
+ do {
+ max_radius = -1.0;
+ poles_idx = -1;
+ for (i = 0; i < interm_filt_params->filter_param_count_of_poles; i++) {
+ if (poles_over[i] == 0) {
+ if (interm_filt_params->filter_format == 0) {
+ if (max_radius <
+ fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius)) {
+ max_radius = (FLOAT32)fabs(
+ interm_filt_params->ord_2_filt_params_of_poles[i].radius);
+ poles_idx = i;
+ if (interm_filt_params->ord_2_filt_params_of_poles[i].coeff[1] !=
+ 0.0f) {
+ pole_order = 2;
+ } else {
+ pole_order = 1;
}
+ }
}
- if (poles_idx >= 0)
- {
- diff_radius = 10.0f;
- zeros_idx = -1;
- for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++)
- {
- if (zeros_over[i] == 0)
- {
- if (interm_filt_params->filter_format == 0)
- {
- if (pole_order == 2) {
- if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] != 0.0f)
- {
- if (diff_radius > fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius))
- {
- diff_radius = (FLOAT32)fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius);
- zeros_idx = i;
- }
- }
- }
- else
- {
- if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] == 0.0f)
- {
- if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)))
- {
- diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius));
- zeros_idx = i;
- }
- }
- }
- }
+ }
+ }
+ if (poles_idx >= 0) {
+ diff_radius = 10.0f;
+ zeros_idx = -1;
+ for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) {
+ if (zeros_over[i] == 0) {
+ if (interm_filt_params->filter_format == 0) {
+ if (pole_order == 2) {
+ if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] !=
+ 0.0f) {
+ if (diff_radius >
+ fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius)) {
+ diff_radius = (FLOAT32)fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius);
+ zeros_idx = i;
}
- }
- if (zeros_idx == -1)
- {
- for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++)
- {
- if (zeros_over[i] == 0)
- {
- if (interm_filt_params->filter_format == 0)
- {
- if (pole_order == 2) {
- if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] == 0.0f)
- {
- if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)))
- {
- diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius));
- zeros_idx = i;
- }
- }
- }
- else
- {
- if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] != 0.0f)
- {
- if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)))
- {
- diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius));
- zeros_idx = i;
- }
- }
- }
- }
- }
+ }
+ } else {
+ if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] ==
+ 0.0f) {
+ if (diff_radius >
+ (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius))) {
+ diff_radius = (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius));
+ zeros_idx = i;
}
+ }
}
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].a1 = interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[0];
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].a2 = interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[1];
- if (zeros_idx >= 0)
- {
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[0];
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[1];
- }
- else
- {
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = 0.0f;
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = 0.0f;
- eq_filt_element->pstr_pole_zero_filt.audio_delay.delay++;
- }
- for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++)
- {
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].in_state_1 = 0.0f;
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].in_state_2 = 0.0f;
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].out_state_1 = 0.0f;
- eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].out_state_2 = 0.0f;
- }
- if (zeros_idx >= 0) zeros_over[zeros_idx] = 1;
- if (poles_idx >= 0) poles_over[poles_idx] = 1;
- section++;
+ }
}
- } while (poles_idx >= 0);
-
- eq_filt_element->pstr_pole_zero_filt.section_count = section;
-
- coeff_count = 1;
- coeff = eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff;
- coeff[0] = 1.0f;
- for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++)
- {
- if (zeros_over[i] == 0)
- {
- if (interm_filt_params->filter_format == 0)
- {
- WORD32 k;
- FLOAT32 b1, b2;
- b1 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[0];
- b2 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1];
-
- coeff_count += 2;
- k = coeff_count - 1;
- coeff[k] = b2 * coeff[k-2];
- k--;
- if (k>1)
- {
- coeff[k] = b1 * coeff[k-1] + b2 * coeff[k-2];
- k--;
- for ( ; k>1; k--)
- {
- coeff[k] += b1 * coeff[k-1] + b2 * coeff[k-2];
- }
- coeff[1] += b1 * coeff[0];
+ }
+ if (zeros_idx == -1) {
+ for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) {
+ if (zeros_over[i] == 0) {
+ if (interm_filt_params->filter_format == 0) {
+ if (pole_order == 2) {
+ if (interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .coeff[1] == 0.0f) {
+ if (diff_radius >
+ (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius))) {
+ diff_radius = (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius));
+ zeros_idx = i;
+ }
}
- else
- {
- coeff[1] = b1 * coeff[0];
+ } else {
+ if (interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .coeff[1] != 0.0f) {
+ if (diff_radius >
+ (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius))) {
+ diff_radius = (FLOAT32)(fabs(
+ fabs(interm_filt_params->ord_2_filt_params_of_zeros[i]
+ .radius) -
+ max_radius));
+ zeros_idx = i;
+ }
}
+ }
}
+ }
}
- zeros_over[i] = 1;
+ }
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].a1 =
+ interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[0];
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].a2 =
+ interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[1];
+ if (zeros_idx >= 0) {
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 =
+ interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[0];
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 =
+ interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[1];
+ } else {
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = 0.0f;
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = 0.0f;
+ eq_filt_element->pstr_pole_zero_filt.audio_delay.delay++;
+ }
+ for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) {
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section]
+ .filt_sect_state[channel]
+ .in_state_1 = 0.0f;
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section]
+ .filt_sect_state[channel]
+ .in_state_2 = 0.0f;
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section]
+ .filt_sect_state[channel]
+ .out_state_1 = 0.0f;
+ eq_filt_element->pstr_pole_zero_filt.filt_section[section]
+ .filt_sect_state[channel]
+ .out_state_2 = 0.0f;
+ }
+ if (zeros_idx >= 0) zeros_over[zeros_idx] = 1;
+ if (poles_idx >= 0) poles_over[poles_idx] = 1;
+ section++;
}
- if (coeff_count > 1)
- {
- eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 1;
- eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = coeff_count;
- }
- else
- {
- eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 0;
- eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = 0;
+ } while (poles_idx >= 0);
+
+ eq_filt_element->pstr_pole_zero_filt.section_count = section;
+
+ coeff_count = 1;
+ coeff = eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff;
+ coeff[0] = 1.0f;
+ for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) {
+ if (zeros_over[i] == 0) {
+ if (interm_filt_params->filter_format == 0) {
+ WORD32 k;
+ FLOAT32 b1, b2;
+ b1 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[0];
+ b2 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1];
+
+ coeff_count += 2;
+ k = coeff_count - 1;
+ coeff[k] = b2 * coeff[k - 2];
+ k--;
+ if (k > 1) {
+ coeff[k] = b1 * coeff[k - 1] + b2 * coeff[k - 2];
+ k--;
+ for (; k > 1; k--) {
+ coeff[k] += b1 * coeff[k - 1] + b2 * coeff[k - 2];
+ }
+ coeff[1] += b1 * coeff[0];
+ } else {
+ coeff[1] = b1 * coeff[0];
+ }
+ }
}
-
- return;
+ zeros_over[i] = 1;
+ }
+ if (coeff_count > 1) {
+ eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 1;
+ eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = coeff_count;
+ } else {
+ eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 0;
+ eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = 0;
+ }
+
+ return;
}
WORD32 impd_calc_filt_block(ia_unique_td_filt_element* unique_td_filt_ele,
ia_filt_block_struct* str_filter_block,
- ia_eq_filt_block_struct* pstr_eq_filt_block)
-{
- WORD32 i, k, err;
- ia_interm_filt_params_struct interm_filt_params;
- ia_matching_ph_filt_struct matching_ph_filt[FILTER_ELEMENT_COUNT_MAX];
-
- for (i=0; i<str_filter_block->filter_element_count; i++)
- {
- if ((unique_td_filt_ele[str_filter_block->str_filter_element[i].filt_ele_idx].eq_filter_format == FILTER_ELEMENT_FORMAT_FIR) && (str_filter_block->filter_element_count > 1))
- {
- return (-1);
- }
+ ia_eq_filt_block_struct* pstr_eq_filt_block) {
+ WORD32 i, k, err;
+ ia_interm_filt_params_struct interm_filt_params;
+ ia_matching_ph_filt_struct matching_ph_filt[FILTER_ELEMENT_COUNT_MAX];
+
+ for (i = 0; i < str_filter_block->filter_element_count; i++) {
+ if ((unique_td_filt_ele[str_filter_block->str_filter_element[i]
+ .filt_ele_idx]
+ .eq_filter_format == FILTER_ELEMENT_FORMAT_FIR) &&
+ (str_filter_block->filter_element_count > 1)) {
+ return (-1);
}
- for (i=0; i<str_filter_block->filter_element_count; i++)
- {
- ia_eq_filt_ele_struct* eq_filt_element = &pstr_eq_filt_block->eq_filt_element[i];
- ia_filt_ele_struct* str_filter_element = &str_filter_block->str_filter_element[i];
- WORD32 filterIndex = str_filter_element->filt_ele_idx;
-
- if (unique_td_filt_ele[filterIndex].eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO)
- {
- err = impd_calc_filt_params_all(&(unique_td_filt_ele[filterIndex]),
- &interm_filt_params);
- if (err)
- return (err);
-
- impd_calc_eq_filt_elements(&interm_filt_params, eq_filt_element);
-
- eq_filt_element->format = FILTER_ELEMENT_FORMAT_POLE_ZERO;
- }
- else
- {
- impd_convert_fir_filt_params (unique_td_filt_ele[filterIndex].fir_filt_order,
- unique_td_filt_ele[filterIndex].fir_symmetry,
- unique_td_filt_ele[filterIndex].fir_coeff,
- &eq_filt_element->fir_filter);
-
- eq_filt_element->format = FILTER_ELEMENT_FORMAT_FIR;
- }
- if (str_filter_element->filt_ele_gain_flag == 1)
- {
- eq_filt_element->elementGainLinear = (FLOAT32)(pow(10.0f, 0.05f * str_filter_element->filt_ele_gain));
- }
- else
- {
- eq_filt_element->elementGainLinear = 1.0f;
- }
- for (k=0; k<unique_td_filt_ele[filterIndex].real_zero_count; k++)
- {
- if (unique_td_filt_ele[filterIndex].real_zero_radius[k] > 0.0f)
- {
- eq_filt_element->elementGainLinear = - eq_filt_element->elementGainLinear;
- }
- }
- impd_calc_phase_filt(&(unique_td_filt_ele[filterIndex]),
- i,
- &matching_ph_filt[i]);
+ }
+ for (i = 0; i < str_filter_block->filter_element_count; i++) {
+ ia_eq_filt_ele_struct* eq_filt_element =
+ &pstr_eq_filt_block->eq_filt_element[i];
+ ia_filt_ele_struct* str_filter_element =
+ &str_filter_block->str_filter_element[i];
+ WORD32 filterIndex = str_filter_element->filt_ele_idx;
+
+ if (unique_td_filt_ele[filterIndex].eq_filter_format ==
+ FILTER_ELEMENT_FORMAT_POLE_ZERO) {
+ err = impd_calc_filt_params_all(&(unique_td_filt_ele[filterIndex]),
+ &interm_filt_params);
+ if (err) return (err);
+
+ impd_calc_eq_filt_elements(&interm_filt_params, eq_filt_element);
+
+ eq_filt_element->format = FILTER_ELEMENT_FORMAT_POLE_ZERO;
+ } else {
+ impd_convert_fir_filt_params(
+ unique_td_filt_ele[filterIndex].fir_filt_order,
+ unique_td_filt_ele[filterIndex].fir_symmetry,
+ unique_td_filt_ele[filterIndex].fir_coeff,
+ &eq_filt_element->fir_filter);
+
+ eq_filt_element->format = FILTER_ELEMENT_FORMAT_FIR;
+ }
+ if (str_filter_element->filt_ele_gain_flag == 1) {
+ eq_filt_element->elementGainLinear =
+ (FLOAT32)(pow(10.0f, 0.05f * str_filter_element->filt_ele_gain));
+ } else {
+ eq_filt_element->elementGainLinear = 1.0f;
}
- pstr_eq_filt_block->element_count = str_filter_block->filter_element_count;
+ for (k = 0; k < unique_td_filt_ele[filterIndex].real_zero_count; k++) {
+ if (unique_td_filt_ele[filterIndex].real_zero_radius[k] > 0.0f) {
+ eq_filt_element->elementGainLinear =
+ -eq_filt_element->elementGainLinear;
+ }
+ }
+ impd_calc_phase_filt(&(unique_td_filt_ele[filterIndex]), i,
+ &matching_ph_filt[i]);
+ }
+ pstr_eq_filt_block->element_count = str_filter_block->filter_element_count;
- pstr_eq_filt_block->matching_ph_filt_ele_0 = matching_ph_filt[0];
+ pstr_eq_filt_block->matching_ph_filt_ele_0 = matching_ph_filt[0];
- return(0);
+ return (0);
}
-VOID impd_calc_cascade_phase_align_filt(ia_td_filter_cascade_struct* str_td_filter_cascade,
- WORD32 ch_group_cnt)
-{
- //WORD32 err = 0;
- WORD32 cascade_align_grp_cnt = 0;
- ia_cascade_align_group_struct pstr_cascade_align_grp[EQ_CHANNEL_GROUP_COUNT_MAX/2];
-
- impd_calc_cascade_align_groups(ch_group_cnt,
- str_td_filter_cascade->eq_phase_alignment_present,
- str_td_filter_cascade->eq_phase_alignment,
- &cascade_align_grp_cnt,
- pstr_cascade_align_grp);
- return;
+VOID impd_calc_cascade_phase_align_filt(
+ ia_td_filter_cascade_struct* str_td_filter_cascade, WORD32 ch_group_cnt) {
+ // WORD32 err = 0;
+ WORD32 cascade_align_grp_cnt = 0;
+ ia_cascade_align_group_struct
+ pstr_cascade_align_grp[EQ_CHANNEL_GROUP_COUNT_MAX / 2];
+
+ impd_calc_cascade_align_groups(
+ ch_group_cnt, str_td_filter_cascade->eq_phase_alignment_present,
+ str_td_filter_cascade->eq_phase_alignment, &cascade_align_grp_cnt,
+ pstr_cascade_align_grp);
+ return;
}
-
-WORD32 impd_calc_filt_cascade(ia_unique_td_filt_element* unique_td_filt_ele,
- ia_filt_block_struct* str_filter_block,
- ia_td_filter_cascade_struct* str_td_filter_cascade,
- WORD32 ch_group_cnt,
- ia_filt_cascade_td_struct filt_cascade_td[])
-{
- WORD32 i, err, g;
-
- for (g=0; g<ch_group_cnt; g++)
- {
- for (i=0; i<str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; i++)
- {
- err = impd_calc_filt_block(unique_td_filt_ele,
- &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g].filter_block_index[i]]),
- &(filt_cascade_td[g].pstr_eq_filt_block[i]));
- if (err)
- return(err);
- }
- filt_cascade_td[g].block_count = i;
- filt_cascade_td[g].cascade_gain_linear = (FLOAT32)(pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]));
+WORD32 impd_calc_filt_cascade(
+ ia_unique_td_filt_element* unique_td_filt_ele,
+ ia_filt_block_struct* str_filter_block,
+ ia_td_filter_cascade_struct* str_td_filter_cascade, WORD32 ch_group_cnt,
+ ia_filt_cascade_td_struct filt_cascade_td[]) {
+ WORD32 i, err, g;
+
+ for (g = 0; g < ch_group_cnt; g++) {
+ for (i = 0;
+ i < str_td_filter_cascade->str_filter_block_refs[g].filter_block_count;
+ i++) {
+ err = impd_calc_filt_block(
+ unique_td_filt_ele,
+ &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g]
+ .filter_block_index[i]]),
+ &(filt_cascade_td[g].pstr_eq_filt_block[i]));
+ if (err) return (err);
}
+ filt_cascade_td[g].block_count = i;
+ filt_cascade_td[g].cascade_gain_linear = (FLOAT32)(
+ pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]));
+ }
- impd_calc_cascade_phase_align_filt(str_td_filter_cascade,
- ch_group_cnt);
- return(0);
+ impd_calc_cascade_phase_align_filt(str_td_filter_cascade, ch_group_cnt);
+ return (0);
}
-
VOID impd_calc_subband_eq(ia_eq_subband_gain_vector* str_eq_subband_gain_vector,
WORD32 eq_subband_gain_count,
- ia_subband_filt_struct* subband_filt)
-{
- WORD32 i;
-
- for (i=0; i<eq_subband_gain_count; i++)
- {
- subband_filt->subband_coeff[i] = str_eq_subband_gain_vector->eq_subband_gain[i];
- }
- subband_filt->coeff_count = eq_subband_gain_count;
- return ;
+ ia_subband_filt_struct* subband_filt) {
+ WORD32 i;
+
+ for (i = 0; i < eq_subband_gain_count; i++) {
+ subband_filt->subband_coeff[i] =
+ str_eq_subband_gain_vector->eq_subband_gain[i];
+ }
+ subband_filt->coeff_count = eq_subband_gain_count;
+ return;
}
-FLOAT32 impd_decode_eq_node_freq(WORD32 eq_node_freq_idx)
-{
- /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/
- FLOAT32 step_ratio = 0.0739601809794f;
- return((FLOAT32)(pow(STEP_RATIO_F_LO, 1.0f + eq_node_freq_idx * step_ratio)));
+FLOAT32 impd_decode_eq_node_freq(WORD32 eq_node_freq_idx) {
+ /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) /
+ * (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/
+ FLOAT32 step_ratio = 0.0739601809794f;
+ return (
+ (FLOAT32)(pow(STEP_RATIO_F_LO, 1.0f + eq_node_freq_idx * step_ratio)));
}
-FLOAT32 impd_calc_warp_freq_delta(FLOAT32 fsubband,
- FLOAT32 node_freq,
- WORD32 eq_node_freq_idx)
-{
- /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/
- FLOAT32 step_ratio = 0.0739601809794f;
- return((FLOAT32)((log10(fsubband)/log10(node_freq) - 1.0f) / step_ratio - (FLOAT32) eq_node_freq_idx));
+FLOAT32 impd_calc_warp_freq_delta(FLOAT32 fsubband, FLOAT32 node_freq,
+ WORD32 eq_node_freq_idx) {
+ /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) /
+ * (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/
+ FLOAT32 step_ratio = 0.0739601809794f;
+ return ((FLOAT32)((log10(fsubband) / log10(node_freq) - 1.0f) / step_ratio -
+ (FLOAT32)eq_node_freq_idx));
}
-VOID impd_interpolate_eq_gain(WORD32 band_step,
- FLOAT32 left_gain,
- FLOAT32 right_gain,
- FLOAT32 left_slope,
- FLOAT32 right_slope,
- FLOAT32 f,
- FLOAT32* interpolated_gain)
-{
- FLOAT32 k1, k2, a, b, c, d;
- FLOAT32 inv_band_step =(FLOAT32)( 1.0 / (FLOAT32)band_step);
- FLOAT32 inv_band_step_sqr = inv_band_step * inv_band_step; k1 = (right_gain - left_gain) * inv_band_step_sqr;
- left_slope = (FLOAT32) (left_slope / 3.128f);
- right_slope = (FLOAT32) (right_slope / 3.128f);
-
- k2 = right_slope + left_slope;
- a = inv_band_step * (inv_band_step * k2 - 2.0f * k1); b = 3.0f * k1 - inv_band_step * (k2 + left_slope);
- c = left_slope;
- d = left_gain;
- *interpolated_gain = (((a * f + b ) * f + c ) * f ) + d;
- return;
+VOID impd_interpolate_eq_gain(WORD32 band_step, FLOAT32 left_gain,
+ FLOAT32 right_gain, FLOAT32 left_slope,
+ FLOAT32 right_slope, FLOAT32 f,
+ FLOAT32* interpolated_gain) {
+ FLOAT32 k1, k2, a, b, c, d;
+ FLOAT32 inv_band_step = (FLOAT32)(1.0 / (FLOAT32)band_step);
+ FLOAT32 inv_band_step_sqr = inv_band_step * inv_band_step;
+ k1 = (right_gain - left_gain) * inv_band_step_sqr;
+ left_slope = (FLOAT32)(left_slope / 3.128f);
+ right_slope = (FLOAT32)(right_slope / 3.128f);
+
+ k2 = right_slope + left_slope;
+ a = inv_band_step * (inv_band_step * k2 - 2.0f * k1);
+ b = 3.0f * k1 - inv_band_step * (k2 + left_slope);
+ c = left_slope;
+ d = left_gain;
+ *interpolated_gain = (((a * f + b) * f + c) * f) + d;
+ return;
}
-WORD32 impd_interpolate_subband_spline(ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline,
- WORD32 eq_subband_gain_count,
- WORD32 eq_subband_gain_format,
- FLOAT32 sample_rate,
- ia_subband_filt_struct* subband_filt)
-{
- WORD32 b, n, err;
-
- FLOAT32 eq_gain[32];
- WORD32 eq_node_freq_idx[32];
- FLOAT32 eq_node_freq[32];
- FLOAT32 subband_center_freq[256];
- WORD32 num_eq_nodes = str_eq_subband_gain_spline->num_eq_nodes;
-
- FLOAT32* eq_slope = str_eq_subband_gain_spline->eq_slope;
- WORD32* eq_freq_delta = str_eq_subband_gain_spline->eq_freq_delta;
- FLOAT32 eq_gain_initial = str_eq_subband_gain_spline->eq_gain_initial;
- FLOAT32* eq_gain_delta = str_eq_subband_gain_spline->eq_gain_delta;
-
- FLOAT32* subband_coeff = subband_filt->subband_coeff;
- WORD32 max_eq_node_idx = 32;
-
- eq_gain[0] = eq_gain_initial;
- eq_node_freq_idx[0] = 0;
- eq_node_freq[0] = impd_decode_eq_node_freq(eq_node_freq_idx[0]);
- for (n=1; n<num_eq_nodes; n++) {
- eq_gain[n] = eq_gain[n-1] + eq_gain_delta[n];
- eq_node_freq_idx[n] = eq_node_freq_idx[n-1] + eq_freq_delta[n];
- eq_node_freq[n] = impd_decode_eq_node_freq(eq_node_freq_idx[n]);
- }
- if ((eq_node_freq[num_eq_nodes-1] < sample_rate * 0.5f) && (eq_node_freq_idx[num_eq_nodes-1] < max_eq_node_idx)) {
- eq_slope[num_eq_nodes] = 0;
- eq_gain[num_eq_nodes] = eq_gain[num_eq_nodes-1];
- eq_freq_delta[num_eq_nodes] = max_eq_node_idx - eq_node_freq_idx[num_eq_nodes-1];
- eq_node_freq_idx[num_eq_nodes] = max_eq_node_idx;
- eq_node_freq [num_eq_nodes] = impd_decode_eq_node_freq(eq_node_freq_idx[num_eq_nodes]); num_eq_nodes += 1;
- }
-
- err = impd_derive_subband_center_freq(eq_subband_gain_count, eq_subband_gain_format, sample_rate, subband_center_freq);
- if (err)
- return (err);
-
- for (n=0; n<num_eq_nodes-1; n++)
- {
- for (b=0; b<eq_subband_gain_count; b++)
- {
- FLOAT32 fSub;
- fSub = max(subband_center_freq[b], eq_node_freq[0]);
- fSub = min(fSub, eq_node_freq[num_eq_nodes-1]);
- if ((fSub >= eq_node_freq[n]) && (fSub <= eq_node_freq[n+1]))
- {
- FLOAT32 warpedDeltaFreq = impd_calc_warp_freq_delta (fSub, eq_node_freq[0], eq_node_freq_idx[n]);
- FLOAT32 gEqSubbandDb;
- impd_interpolate_eq_gain(eq_freq_delta[n+1], eq_gain[n], eq_gain[n+1],
- eq_slope[n], eq_slope[n+1], warpedDeltaFreq, &gEqSubbandDb);
-
- subband_coeff[b] = (FLOAT32)pow(2.0, gEqSubbandDb / 6.0f);
- }
- }
+WORD32 impd_interpolate_subband_spline(
+ ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline,
+ WORD32 eq_subband_gain_count, WORD32 eq_subband_gain_format,
+ FLOAT32 sample_rate, ia_subband_filt_struct* subband_filt) {
+ WORD32 b, n, err;
+
+ FLOAT32 eq_gain[32];
+ WORD32 eq_node_freq_idx[32];
+ FLOAT32 eq_node_freq[32];
+ FLOAT32 subband_center_freq[256];
+ WORD32 num_eq_nodes = str_eq_subband_gain_spline->num_eq_nodes;
+
+ FLOAT32* eq_slope = str_eq_subband_gain_spline->eq_slope;
+ WORD32* eq_freq_delta = str_eq_subband_gain_spline->eq_freq_delta;
+ FLOAT32 eq_gain_initial = str_eq_subband_gain_spline->eq_gain_initial;
+ FLOAT32* eq_gain_delta = str_eq_subband_gain_spline->eq_gain_delta;
+
+ FLOAT32* subband_coeff = subband_filt->subband_coeff;
+ WORD32 max_eq_node_idx = 32;
+
+ eq_gain[0] = eq_gain_initial;
+ eq_node_freq_idx[0] = 0;
+ eq_node_freq[0] = impd_decode_eq_node_freq(eq_node_freq_idx[0]);
+ for (n = 1; n < num_eq_nodes; n++) {
+ eq_gain[n] = eq_gain[n - 1] + eq_gain_delta[n];
+ eq_node_freq_idx[n] = eq_node_freq_idx[n - 1] + eq_freq_delta[n];
+ eq_node_freq[n] = impd_decode_eq_node_freq(eq_node_freq_idx[n]);
+ }
+ if ((eq_node_freq[num_eq_nodes - 1] < sample_rate * 0.5f) &&
+ (eq_node_freq_idx[num_eq_nodes - 1] < max_eq_node_idx)) {
+ eq_slope[num_eq_nodes] = 0;
+ eq_gain[num_eq_nodes] = eq_gain[num_eq_nodes - 1];
+ eq_freq_delta[num_eq_nodes] =
+ max_eq_node_idx - eq_node_freq_idx[num_eq_nodes - 1];
+ eq_node_freq_idx[num_eq_nodes] = max_eq_node_idx;
+ eq_node_freq[num_eq_nodes] =
+ impd_decode_eq_node_freq(eq_node_freq_idx[num_eq_nodes]);
+ num_eq_nodes += 1;
+ }
+
+ err = impd_derive_subband_center_freq(eq_subband_gain_count,
+ eq_subband_gain_format, sample_rate,
+ subband_center_freq);
+ if (err) return (err);
+
+ for (n = 0; n < num_eq_nodes - 1; n++) {
+ for (b = 0; b < eq_subband_gain_count; b++) {
+ FLOAT32 fSub;
+ fSub = max(subband_center_freq[b], eq_node_freq[0]);
+ fSub = min(fSub, eq_node_freq[num_eq_nodes - 1]);
+ if ((fSub >= eq_node_freq[n]) && (fSub <= eq_node_freq[n + 1])) {
+ FLOAT32 warpedDeltaFreq = impd_calc_warp_freq_delta(
+ fSub, eq_node_freq[0], eq_node_freq_idx[n]);
+ FLOAT32 gEqSubbandDb;
+ impd_interpolate_eq_gain(eq_freq_delta[n + 1], eq_gain[n],
+ eq_gain[n + 1], eq_slope[n], eq_slope[n + 1],
+ warpedDeltaFreq, &gEqSubbandDb);
+
+ subband_coeff[b] = (FLOAT32)pow(2.0, gEqSubbandDb / 6.0f);
+ }
}
- subband_filt->coeff_count = eq_subband_gain_count;
- return (0);
+ }
+ subband_filt->coeff_count = eq_subband_gain_count;
+ return (0);
}
WORD32 impd_calc_subband_gains(ia_eq_coeff_struct* str_eq_coeff,
WORD32 eq_ch_group_count,
- WORD32* subband_gains_index,
- FLOAT32 sample_rate,
+ WORD32* subband_gains_index, FLOAT32 sample_rate,
WORD32 eq_frame_size_subband,
- ia_subband_filt_struct* subband_filt)
-{
- WORD32 g, err;
- WORD32 eq_subband_gain_representation = str_eq_coeff->eq_subband_gain_representation;
- WORD32 eq_subband_gain_count = str_eq_coeff->eq_subband_gain_count;
- WORD32 eq_subband_gain_format = str_eq_coeff->eq_subband_gain_format;
-
- for (g=0; g<eq_ch_group_count; g++)
- {
- if (eq_subband_gain_representation == 1)
- {
- err = impd_interpolate_subband_spline(&(str_eq_coeff->str_eq_subband_gain_spline[subband_gains_index[g]]),
- eq_subband_gain_count,
- eq_subband_gain_format,
- sample_rate,
- &(subband_filt[g]));
- if (err)
- return(err);
- }
- else
- {
- impd_calc_subband_eq(&(str_eq_coeff->str_eq_subband_gain_vector[subband_gains_index[g]]),
- eq_subband_gain_count,
- &(subband_filt[g]));
- }
- subband_filt[g].eq_frame_size_subband = eq_frame_size_subband;
+ ia_subband_filt_struct* subband_filt) {
+ WORD32 g, err;
+ WORD32 eq_subband_gain_representation =
+ str_eq_coeff->eq_subband_gain_representation;
+ WORD32 eq_subband_gain_count = str_eq_coeff->eq_subband_gain_count;
+ WORD32 eq_subband_gain_format = str_eq_coeff->eq_subband_gain_format;
+
+ for (g = 0; g < eq_ch_group_count; g++) {
+ if (eq_subband_gain_representation == 1) {
+ err = impd_interpolate_subband_spline(
+ &(str_eq_coeff->str_eq_subband_gain_spline[subband_gains_index[g]]),
+ eq_subband_gain_count, eq_subband_gain_format, sample_rate,
+ &(subband_filt[g]));
+ if (err) return (err);
+ } else {
+ impd_calc_subband_eq(
+ &(str_eq_coeff->str_eq_subband_gain_vector[subband_gains_index[g]]),
+ eq_subband_gain_count, &(subband_filt[g]));
}
- return (0);
+ subband_filt[g].eq_frame_size_subband = eq_frame_size_subband;
+ }
+ return (0);
}
VOID impd_calc_filt_sect_delay(WORD32 section_count,
ia_filt_sect_struct* filt_section,
- FLOAT32* delay)
-{
- WORD32 i;
- FLOAT32 d = 0.0f;
- for (i=0; i<section_count; i++)
- {
- if (filt_section[i].b2 != 0.0f)
- {
- d += 1.0f;
- }
- else if (filt_section[i].b1 != 0.0f)
- {
- d += 0.5f;
- }
+ FLOAT32* delay) {
+ WORD32 i;
+ FLOAT32 d = 0.0f;
+ for (i = 0; i < section_count; i++) {
+ if (filt_section[i].b2 != 0.0f) {
+ d += 1.0f;
+ } else if (filt_section[i].b1 != 0.0f) {
+ d += 0.5f;
}
- *delay = d;
- return;
+ }
+ *delay = d;
+ return;
}
-VOID impd_get_eq_set_delay(ia_eq_set_struct* eq_set,
- WORD32* cascade_delay)
-{
- FLOAT32 delay, sect_delay;
- WORD32 k, g, c, b;
-
- delay = 0;
- for (c=0; c<eq_set->audio_num_chan; c++)
- {
- g = eq_set->eq_ch_group_of_channel[c];
- if (g>=0)
- {
- switch (eq_set->domain)
- {
- case EQ_FILTER_DOMAIN_TIME:
- {
- ia_filt_cascade_td_struct* filt_cascade_td = &eq_set->filt_cascade_td[g];
- for (b=0; b<filt_cascade_td->block_count; b++)
- {
- ia_eq_filt_ele_struct* eq_filt_element = &filt_cascade_td->pstr_eq_filt_block[b].eq_filt_element[0];
- switch (eq_filt_element->format)
- {
- case FILTER_ELEMENT_FORMAT_POLE_ZERO:
- impd_calc_filt_sect_delay(eq_filt_element->pstr_pole_zero_filt.section_count,
- eq_filt_element->pstr_pole_zero_filt.filt_section,
- &sect_delay);
- delay += sect_delay;
- if (eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag)
- {
- delay += 0.5f * (eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count - 1);
- }
- break;
- case FILTER_ELEMENT_FORMAT_FIR:
- delay += 0.5f * (eq_filt_element->fir_filter.coeff_count - 1);
- break;
- default:
- break;
- }
- for (k=0; k < eq_filt_element->num_ph_align_filt; k++)
- {
- ia_ph_alignment_filt_struct* ph_alignment_filt = &eq_filt_element->ph_alignment_filt[k];
- impd_calc_filt_sect_delay(ph_alignment_filt->section_count,
- ph_alignment_filt->filt_section,
- &sect_delay);
- delay += sect_delay;
- }
- }
- for (b=0; b<filt_cascade_td->num_ph_align_filt; b++)
- {
- ia_ph_alignment_filt_struct* ph_alignment_filt = &filt_cascade_td->ph_alignment_filt[b];
- impd_calc_filt_sect_delay(ph_alignment_filt->section_count,
- ph_alignment_filt->filt_section,
- &sect_delay);
- delay += sect_delay;
- }
+VOID impd_get_eq_set_delay(ia_eq_set_struct* eq_set, WORD32* cascade_delay) {
+ FLOAT32 delay, sect_delay;
+ WORD32 k, g, c, b;
+
+ delay = 0;
+ for (c = 0; c < eq_set->audio_num_chan; c++) {
+ g = eq_set->eq_ch_group_of_channel[c];
+ if (g >= 0) {
+ switch (eq_set->domain) {
+ case EQ_FILTER_DOMAIN_TIME: {
+ ia_filt_cascade_td_struct* filt_cascade_td =
+ &eq_set->filt_cascade_td[g];
+ for (b = 0; b < filt_cascade_td->block_count; b++) {
+ ia_eq_filt_ele_struct* eq_filt_element =
+ &filt_cascade_td->pstr_eq_filt_block[b].eq_filt_element[0];
+ switch (eq_filt_element->format) {
+ case FILTER_ELEMENT_FORMAT_POLE_ZERO:
+ impd_calc_filt_sect_delay(
+ eq_filt_element->pstr_pole_zero_filt.section_count,
+ eq_filt_element->pstr_pole_zero_filt.filt_section,
+ &sect_delay);
+ delay += sect_delay;
+ if (eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag) {
+ delay += 0.5f * (eq_filt_element->pstr_pole_zero_filt
+ .fir_filter.coeff_count -
+ 1);
}
- break;
- case EQ_FILTER_DOMAIN_SUBBAND:
- case EQ_FILTER_DOMAIN_NONE:
- default:
- break;
+ break;
+ case FILTER_ELEMENT_FORMAT_FIR:
+ delay += 0.5f * (eq_filt_element->fir_filter.coeff_count - 1);
+ break;
+ default:
+ break;
}
- }
- break;
+ for (k = 0; k < eq_filt_element->num_ph_align_filt; k++) {
+ ia_ph_alignment_filt_struct* ph_alignment_filt =
+ &eq_filt_element->ph_alignment_filt[k];
+ impd_calc_filt_sect_delay(ph_alignment_filt->section_count,
+ ph_alignment_filt->filt_section,
+ &sect_delay);
+ delay += sect_delay;
+ }
+ }
+ for (b = 0; b < filt_cascade_td->num_ph_align_filt; b++) {
+ ia_ph_alignment_filt_struct* ph_alignment_filt =
+ &filt_cascade_td->ph_alignment_filt[b];
+ impd_calc_filt_sect_delay(ph_alignment_filt->section_count,
+ ph_alignment_filt->filt_section,
+ &sect_delay);
+ delay += sect_delay;
+ }
+ } break;
+ case EQ_FILTER_DOMAIN_SUBBAND:
+ case EQ_FILTER_DOMAIN_NONE:
+ default:
+ break;
+ }
}
- *cascade_delay = (WORD32)delay;
- return;
+ break;
+ }
+ *cascade_delay = (WORD32)delay;
+ return;
}
WORD32 impd_derive_eq_set(ia_eq_coeff_struct* str_eq_coeff,
ia_eq_instructions_struct* str_eq_instructions,
- FLOAT32 sample_rate,
- WORD32 drc_frame_size,
+ FLOAT32 sample_rate, WORD32 drc_frame_size,
WORD32 sub_band_domain_mode,
- ia_eq_set_struct* eq_set)
-{
- WORD32 err, i, eq_frame_size_subband;
-
- eq_set->domain = EQ_FILTER_DOMAIN_NONE;
-
- if (sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF)
- {
- if (str_eq_instructions->td_filter_cascade_present== 1)
- {
- err = impd_calc_filt_cascade(str_eq_coeff->unique_td_filt_ele,
- str_eq_coeff->str_filter_block,
- &str_eq_instructions->str_td_filter_cascade,
- str_eq_instructions->eq_ch_group_count,
- eq_set->filt_cascade_td);
- if (err)
- return (err);
- }
-
- eq_set->domain |= EQ_FILTER_DOMAIN_TIME;
+ ia_eq_set_struct* eq_set) {
+ WORD32 err, i, eq_frame_size_subband;
+
+ eq_set->domain = EQ_FILTER_DOMAIN_NONE;
+
+ if (sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF) {
+ if (str_eq_instructions->td_filter_cascade_present == 1) {
+ err = impd_calc_filt_cascade(
+ str_eq_coeff->unique_td_filt_ele, str_eq_coeff->str_filter_block,
+ &str_eq_instructions->str_td_filter_cascade,
+ str_eq_instructions->eq_ch_group_count, eq_set->filt_cascade_td);
+ if (err) return (err);
}
- if (sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF)
- {
- switch (sub_band_domain_mode)
- {
- case SUBBAND_DOMAIN_MODE_QMF64:
- if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_QMF64)
- {
- return (-1);
- }
- eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
- break;
- case SUBBAND_DOMAIN_MODE_QMF71:
- if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_QMF71)
- {
- return (-1);
- }
- eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71;
- break;
- case SUBBAND_DOMAIN_MODE_STFT256:
- if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_STFT256)
- {
- return (-1);
- }
- eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
- break;
- default:
- return (-1);
- break;
+
+ eq_set->domain |= EQ_FILTER_DOMAIN_TIME;
+ }
+ if (sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF) {
+ switch (sub_band_domain_mode) {
+ case SUBBAND_DOMAIN_MODE_QMF64:
+ if (str_eq_coeff->eq_subband_gain_count !=
+ AUDIO_CODEC_SUBBAND_COUNT_QMF64) {
+ return (-1);
}
- if (str_eq_instructions->subband_gains_present== 1)
- {
- err = impd_calc_subband_gains(str_eq_coeff,
- str_eq_instructions->eq_ch_group_count,
- str_eq_instructions->subband_gains_index,
- sample_rate,
- eq_frame_size_subband,
- eq_set->subband_filt);
- if (err)
- return (err);
+ eq_frame_size_subband =
+ drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
+ break;
+ case SUBBAND_DOMAIN_MODE_QMF71:
+ if (str_eq_coeff->eq_subband_gain_count !=
+ AUDIO_CODEC_SUBBAND_COUNT_QMF71) {
+ return (-1);
}
- else
- {
- if (str_eq_instructions->td_filter_cascade_present== 1)
- {
- err = impd_calc_subband_gains_td_cascade(str_eq_coeff->unique_td_filt_ele,
- str_eq_coeff->str_filter_block,
- &str_eq_instructions->str_td_filter_cascade,
- str_eq_coeff->eq_subband_gain_format,
- str_eq_instructions->eq_ch_group_count,
- sample_rate,
- eq_frame_size_subband,
- eq_set->subband_filt);
- if (err)
- return (err);
- }
-
+ eq_frame_size_subband =
+ drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71;
+ break;
+ case SUBBAND_DOMAIN_MODE_STFT256:
+ if (str_eq_coeff->eq_subband_gain_count !=
+ AUDIO_CODEC_SUBBAND_COUNT_STFT256) {
+ return (-1);
}
- eq_set->domain |= EQ_FILTER_DOMAIN_SUBBAND;
+ eq_frame_size_subband =
+ drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
+ break;
+ default:
+ return (-1);
+ break;
}
- eq_set->audio_num_chan = str_eq_instructions->eq_channel_count;
- eq_set->eq_ch_group_count = str_eq_instructions->eq_ch_group_count;
-
- for (i=0; i<str_eq_instructions->eq_channel_count; i++)
- {
- eq_set->eq_ch_group_of_channel[i] = str_eq_instructions->eq_ch_group_of_channel[i];
+ if (str_eq_instructions->subband_gains_present == 1) {
+ err = impd_calc_subband_gains(
+ str_eq_coeff, str_eq_instructions->eq_ch_group_count,
+ str_eq_instructions->subband_gains_index, sample_rate,
+ eq_frame_size_subband, eq_set->subband_filt);
+ if (err) return (err);
+ } else {
+ if (str_eq_instructions->td_filter_cascade_present == 1) {
+ err = impd_calc_subband_gains_td_cascade(
+ str_eq_coeff->unique_td_filt_ele, str_eq_coeff->str_filter_block,
+ &str_eq_instructions->str_td_filter_cascade,
+ str_eq_coeff->eq_subband_gain_format,
+ str_eq_instructions->eq_ch_group_count, sample_rate,
+ eq_frame_size_subband, eq_set->subband_filt);
+ if (err) return (err);
+ }
}
+ eq_set->domain |= EQ_FILTER_DOMAIN_SUBBAND;
+ }
+ eq_set->audio_num_chan = str_eq_instructions->eq_channel_count;
+ eq_set->eq_ch_group_count = str_eq_instructions->eq_ch_group_count;
+
+ for (i = 0; i < str_eq_instructions->eq_channel_count; i++) {
+ eq_set->eq_ch_group_of_channel[i] =
+ str_eq_instructions->eq_ch_group_of_channel[i];
+ }
- return (0);
+ return (0);
}
-VOID impd_process_filt_sect(ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX],
- WORD32 channel,
- FLOAT32* audio_out,
- WORD32 section_count)
-{
- WORD32 i;
-
- for(i = 0; i < section_count; i++)
- {
- ia_filt_sect_state_struct* filt_sect_state = &filt_section[i].filt_sect_state[channel];
- FLOAT32 audio_in = *audio_out;
- *audio_out = audio_in + filt_section[i].b1 * filt_sect_state->in_state_1
- + filt_section[i].b2 * filt_sect_state->in_state_2
- - filt_section[i].a1 * filt_sect_state->out_state_1
- - filt_section[i].a2 * filt_sect_state->out_state_2;
-
- filt_sect_state->in_state_2 = filt_sect_state->in_state_1;
- filt_sect_state->in_state_1 = audio_in;
- filt_sect_state->out_state_2 = filt_sect_state->out_state_1;
- filt_sect_state->out_state_1 = *audio_out;
- }
- return;
+VOID impd_process_filt_sect(
+ ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX],
+ WORD32 channel, FLOAT32* audio_out, WORD32 section_count) {
+ WORD32 i;
+
+ for (i = 0; i < section_count; i++) {
+ ia_filt_sect_state_struct* filt_sect_state =
+ &filt_section[i].filt_sect_state[channel];
+ FLOAT32 audio_in = *audio_out;
+ *audio_out = audio_in + filt_section[i].b1 * filt_sect_state->in_state_1 +
+ filt_section[i].b2 * filt_sect_state->in_state_2 -
+ filt_section[i].a1 * filt_sect_state->out_state_1 -
+ filt_section[i].a2 * filt_sect_state->out_state_2;
+
+ filt_sect_state->in_state_2 = filt_sect_state->in_state_1;
+ filt_sect_state->in_state_1 = audio_in;
+ filt_sect_state->out_state_2 = filt_sect_state->out_state_1;
+ filt_sect_state->out_state_1 = *audio_out;
+ }
+ return;
}
-VOID impd_fir_filt_process(ia_fir_filter_struct* fir_filter,
- WORD32 channel,
- FLOAT32 audio_in,
- FLOAT32* audio_out)
-{
- WORD32 i;
- FLOAT32* coeff = fir_filter->coeff;
- FLOAT32* state = fir_filter->state[channel];
- FLOAT32 sum;
- sum = coeff[0] * audio_in;
- for (i=1; i<fir_filter->coeff_count; i++)
- {
- sum += coeff[i] * state[i-1];
- }
- *audio_out = sum;
- for (i=fir_filter->coeff_count-2; i>0; i--)
- {
- state[i] = state[i-1];
- }
- state[0] = audio_in;
- return;
+VOID impd_fir_filt_process(ia_fir_filter_struct* fir_filter, WORD32 channel,
+ FLOAT32 audio_in, FLOAT32* audio_out) {
+ WORD32 i;
+ FLOAT32* coeff = fir_filter->coeff;
+ FLOAT32* state = fir_filter->state[channel];
+ FLOAT32 sum;
+ sum = coeff[0] * audio_in;
+ for (i = 1; i < fir_filter->coeff_count; i++) {
+ sum += coeff[i] * state[i - 1];
+ }
+ *audio_out = sum;
+ for (i = fir_filter->coeff_count - 2; i > 0; i--) {
+ state[i] = state[i - 1];
+ }
+ state[0] = audio_in;
+ return;
}
VOID impd_audio_delay_process(ia_audio_delay_struct* audio_delay,
- WORD32 channel,
- FLOAT32 audio_in,
- FLOAT32* ptr_audio_out)
-{
- WORD32 i;
- FLOAT32* state = audio_delay->state[channel];
- if (audio_delay->delay > 0)
- {
- *ptr_audio_out = state[audio_delay->delay-1];
- for (i=audio_delay->delay-1; i>0; i--)
- {
- state[i] = state[i-1];
- }
- state[0] = audio_in;
- }
- else
- {
- *ptr_audio_out = audio_in;
+ WORD32 channel, FLOAT32 audio_in,
+ FLOAT32* ptr_audio_out) {
+ WORD32 i;
+ FLOAT32* state = audio_delay->state[channel];
+ if (audio_delay->delay > 0) {
+ *ptr_audio_out = state[audio_delay->delay - 1];
+ for (i = audio_delay->delay - 1; i > 0; i--) {
+ state[i] = state[i - 1];
}
- return;
+ state[0] = audio_in;
+ } else {
+ *ptr_audio_out = audio_in;
+ }
+ return;
}
-
VOID impd_pole_zero_filt_process(ia_pole_zero_filt_struct* pstr_pole_zero_filt,
- WORD32 channel,
- FLOAT32 audio_in,
- FLOAT32* ptr_audio_out)
-{
- FLOAT32 inp = audio_in;
- FLOAT32 out = inp;
-
- impd_process_filt_sect(pstr_pole_zero_filt->filt_section, channel, &out, pstr_pole_zero_filt->section_count);
- inp = out;
+ WORD32 channel, FLOAT32 audio_in,
+ FLOAT32* ptr_audio_out) {
+ FLOAT32 inp = audio_in;
+ FLOAT32 out = inp;
- if (pstr_pole_zero_filt->filt_coeffs_flag == 1)
- {
- impd_fir_filt_process(&pstr_pole_zero_filt->fir_filter, channel, inp, &out);
- inp = out;
- }
- impd_audio_delay_process(&pstr_pole_zero_filt->audio_delay, channel, inp, &out);
-
- *ptr_audio_out = out;
- return ;
-}
+ impd_process_filt_sect(pstr_pole_zero_filt->filt_section, channel, &out,
+ pstr_pole_zero_filt->section_count);
+ inp = out;
+ if (pstr_pole_zero_filt->filt_coeffs_flag == 1) {
+ impd_fir_filt_process(&pstr_pole_zero_filt->fir_filter, channel, inp, &out);
+ inp = out;
+ }
+ impd_audio_delay_process(&pstr_pole_zero_filt->audio_delay, channel, inp,
+ &out);
+ *ptr_audio_out = out;
+ return;
+}
VOID impd_subband_filter_process(ia_subband_filt_struct* pstr_subband_filt,
FLOAT32* ptr_audio_real_buff,
- FLOAT32* ptr_audio_imag_buff)
-{
- WORD32 i,j;
- WORD32 eq_frame_size_subband = pstr_subband_filt->eq_frame_size_subband;
- WORD32 coeff_count = pstr_subband_filt->coeff_count;
-
- FLOAT32* ptr_subband_coeff = pstr_subband_filt->subband_coeff;
-
- for (i=0; i < eq_frame_size_subband; i++)
- {
- for (j=0; j < coeff_count; j++)
- {
- ptr_audio_real_buff[j] *= ptr_subband_coeff[j];
- ptr_audio_imag_buff[j] *= ptr_subband_coeff[j];
- }
- ptr_audio_real_buff += coeff_count;
- ptr_audio_imag_buff += coeff_count;
- }
- return;
-}
+ FLOAT32* ptr_audio_imag_buff) {
+ WORD32 i, j;
+ WORD32 eq_frame_size_subband = pstr_subband_filt->eq_frame_size_subband;
+ WORD32 coeff_count = pstr_subband_filt->coeff_count;
+ FLOAT32* ptr_subband_coeff = pstr_subband_filt->subband_coeff;
+ for (i = 0; i < eq_frame_size_subband; i++) {
+ for (j = 0; j < coeff_count; j++) {
+ ptr_audio_real_buff[j] *= ptr_subband_coeff[j];
+ ptr_audio_imag_buff[j] *= ptr_subband_coeff[j];
+ }
+ ptr_audio_real_buff += coeff_count;
+ ptr_audio_imag_buff += coeff_count;
+ }
+ return;
+}
-VOID impd_phase_align_filt_process(ia_ph_alignment_filt_struct* ph_alignment_filt,
- WORD32 channel,
- FLOAT32* ptr_audio_out)
-{
- FLOAT32 audio_in = *ptr_audio_out;
- FLOAT32 inp = audio_in;
- FLOAT32 out = inp;
+VOID impd_phase_align_filt_process(
+ ia_ph_alignment_filt_struct* ph_alignment_filt, WORD32 channel,
+ FLOAT32* ptr_audio_out) {
+ FLOAT32 audio_in = *ptr_audio_out;
+ FLOAT32 inp = audio_in;
+ FLOAT32 out = inp;
- impd_process_filt_sect(ph_alignment_filt->filt_section, channel, &out, ph_alignment_filt->section_count);
- inp = out;
+ impd_process_filt_sect(ph_alignment_filt->filt_section, channel, &out,
+ ph_alignment_filt->section_count);
+ inp = out;
- impd_audio_delay_process(&ph_alignment_filt->audio_delay, channel, inp, &out);
+ impd_audio_delay_process(&ph_alignment_filt->audio_delay, channel, inp, &out);
- *ptr_audio_out = out * ph_alignment_filt->gain;
- return;
+ *ptr_audio_out = out * ph_alignment_filt->gain;
+ return;
}
+VOID impd_eq_filt_element_process(
+ ia_eq_filt_block_struct str_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX],
+ WORD32 channel, FLOAT32 audio_in, FLOAT32* ptr_audio_out,
+ WORD32 block_count) {
+ WORD32 i;
+ FLOAT32 inp = audio_in;
+ FLOAT32 out = inp;
+ WORD32 k, j;
+ WORD32 element_count;
+ for (j = 0; j < block_count; j++) {
+ FLOAT32 sum = 0.0f;
+ element_count = str_eq_filt_block[j].element_count;
+ for (k = 0; k < element_count; k++) {
+ switch (str_eq_filt_block[j].eq_filt_element[k].format) {
+ case FILTER_ELEMENT_FORMAT_POLE_ZERO:
+ impd_pole_zero_filt_process(
+ &str_eq_filt_block[j].eq_filt_element[k].pstr_pole_zero_filt,
+ channel, inp, &out);
+ break;
+ case FILTER_ELEMENT_FORMAT_FIR:
+ impd_fir_filt_process(
+ &str_eq_filt_block[j].eq_filt_element[k].fir_filter, channel, inp,
+ &out);
+ break;
+ default:
+ break;
+ }
+ out *= str_eq_filt_block[j].eq_filt_element[k].elementGainLinear;
-VOID impd_eq_filt_element_process(ia_eq_filt_block_struct str_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX],
- WORD32 channel,
- FLOAT32 audio_in,
- FLOAT32* ptr_audio_out,
- WORD32 block_count)
-{
- WORD32 i;
- FLOAT32 inp = audio_in;
- FLOAT32 out = inp;
- WORD32 k,j;
- WORD32 element_count;
- for(j = 0; j < block_count; j++)
- {
- FLOAT32 sum = 0.0f;
- element_count = str_eq_filt_block[j].element_count;
- for (k=0; k < element_count; k++)
- {
- switch (str_eq_filt_block[j].eq_filt_element[k].format)
- {
- case FILTER_ELEMENT_FORMAT_POLE_ZERO:
- impd_pole_zero_filt_process(&str_eq_filt_block[j].eq_filt_element[k].pstr_pole_zero_filt, channel, inp, &out);
- break;
- case FILTER_ELEMENT_FORMAT_FIR:
- impd_fir_filt_process(&str_eq_filt_block[j].eq_filt_element[k].fir_filter, channel, inp, &out);
- break;
- default:
- break;
- }
- out *= str_eq_filt_block[j].eq_filt_element[k].elementGainLinear;
-
- for (i=0; i < str_eq_filt_block[j].eq_filt_element[k].num_ph_align_filt; i++)
- {
- inp = out;
- impd_phase_align_filt_process(&str_eq_filt_block[j].eq_filt_element[k].ph_alignment_filt[i],
- channel,
- &out);
- }
- sum += out;
- }
- inp = sum;
+ for (i = 0; i < str_eq_filt_block[j].eq_filt_element[k].num_ph_align_filt;
+ i++) {
+ inp = out;
+ impd_phase_align_filt_process(
+ &str_eq_filt_block[j].eq_filt_element[k].ph_alignment_filt[i],
+ channel, &out);
+ }
+ sum += out;
}
- *ptr_audio_out = inp;
- return;
+ inp = sum;
+ }
+ *ptr_audio_out = inp;
+ return;
}
-
WORD32 impd_process_eq_set_time_domain(ia_eq_set_struct* pstr_eq_set,
- WORD32 channel,
- FLOAT32 *ptr_audio_in,
- FLOAT32 *ptr_audio_out,
- WORD32 frame_size)
-{
- WORD32 g=pstr_eq_set->eq_ch_group_of_channel[channel],i,j;
- //FLOAT32 sum = 0.0f;
- //FLOAT32 temp1 = 0.0f;
-
- if(pstr_eq_set==NULL || g<0)
- return 0;
-
- if (pstr_eq_set->domain | EQ_FILTER_DOMAIN_TIME)
- {
- for(i=0;i<frame_size;i++)
- {
- impd_eq_filt_element_process((pstr_eq_set->filt_cascade_td[g].pstr_eq_filt_block),
- channel,
- ptr_audio_in[i],
- &ptr_audio_out[i],
- pstr_eq_set->filt_cascade_td[g].block_count);
-
- for (j=0; j<pstr_eq_set->filt_cascade_td[g].num_ph_align_filt; j++)
- {
- impd_phase_align_filt_process(&pstr_eq_set->filt_cascade_td[g].ph_alignment_filt[j],
- channel,
- &ptr_audio_out[i]);
- }
-
- ptr_audio_out[i] = ptr_audio_out[i] * pstr_eq_set->filt_cascade_td[g].cascade_gain_linear;
- }
- }
- else
- {
- return -1;
+ WORD32 channel, FLOAT32* ptr_audio_in,
+ FLOAT32* ptr_audio_out,
+ WORD32 frame_size) {
+ WORD32 g = pstr_eq_set->eq_ch_group_of_channel[channel], i, j;
+ // FLOAT32 sum = 0.0f;
+ // FLOAT32 temp1 = 0.0f;
+
+ if (pstr_eq_set == NULL || g < 0) return 0;
+
+ if (pstr_eq_set->domain | EQ_FILTER_DOMAIN_TIME) {
+ for (i = 0; i < frame_size; i++) {
+ impd_eq_filt_element_process(
+ (pstr_eq_set->filt_cascade_td[g].pstr_eq_filt_block), channel,
+ ptr_audio_in[i], &ptr_audio_out[i],
+ pstr_eq_set->filt_cascade_td[g].block_count);
+
+ for (j = 0; j < pstr_eq_set->filt_cascade_td[g].num_ph_align_filt; j++) {
+ impd_phase_align_filt_process(
+ &pstr_eq_set->filt_cascade_td[g].ph_alignment_filt[j], channel,
+ &ptr_audio_out[i]);
+ }
+
+ ptr_audio_out[i] = ptr_audio_out[i] *
+ pstr_eq_set->filt_cascade_td[g].cascade_gain_linear;
}
- return 0;
+ } else {
+ return -1;
+ }
+ return 0;
}
WORD32 impd_process_eq_set_subband_domain(ia_eq_set_struct* pstr_eq_set,
WORD32 channel,
FLOAT32* ptr_audio_real_buff,
- FLOAT32* ptr_audio_imag_buff)
-{
- WORD32 g;
-
- if (pstr_eq_set != NULL)
- {
- g = pstr_eq_set->eq_ch_group_of_channel[channel];
- if (g >= 0)
- {
- if (pstr_eq_set->domain == 0)
- {
- return(-1);
- }
- else
- {
- impd_subband_filter_process(&pstr_eq_set->subband_filt[g],
- &ptr_audio_real_buff[0],
- &ptr_audio_imag_buff[0]);
- }
- }
+ FLOAT32* ptr_audio_imag_buff) {
+ WORD32 g;
+
+ if (pstr_eq_set != NULL) {
+ g = pstr_eq_set->eq_ch_group_of_channel[channel];
+ if (g >= 0) {
+ if (pstr_eq_set->domain == 0) {
+ return (-1);
+ } else {
+ impd_subband_filter_process(&pstr_eq_set->subband_filt[g],
+ &ptr_audio_real_buff[0],
+ &ptr_audio_imag_buff[0]);
+ }
}
- return (0);
+ }
+ return (0);
}
-
-
-
-