Hello,
We are using aer_c55l_cpuv3_3 17_0_0_0 the latest version algorithms with the TMS320C5517 DSP for echo cancellation in our voip system. handsfree mode. It can cancel echo very well, but the only issue is that when AER in the near end (NE) turning on , and far end (FE) sending dial tone(450Hz), the FE cann't receive DTMF signal from NE. only when FE stop sending dial tone, it can recive the DTMF signal from NE.
There seem half-duplex, not the full duplex when double talk. We follow the AER_Quick_Tuning_Guide and adjust the two main NLP parameters:
increasing nlp_combloss_target to 32767 and decreasing nlp_clip_agg_l2 to -10, There seem no effect and only half duplex performance.
Our NE AER parameter mainly refer from aertest_c55I_C55L_COFF in hand free mode, use DRC and AGC:
/*== AER valid bitfield 0 ==*/
aer_ctl.valid_bitfield_0 = aer_CTL_VALID0_MODES_CTL0
| aer_CTL_VALID0_MODES_CTL1
| aer_CTL_VALID0_RX_EQ_PARAMS
| aer_CTL_VALID0_TX_EQ_PARAMS;
/* Set AER operation modes: siu_setup->aer_ctl_bitfield_0 and
siu_setup->aer_ctl_bitfield_1 are set through simulation configuration
file: aersimcfg.txt.
* The mask is set to 0xffff to set all bits, either to 0 or to 1. */
aer_ctl.modes_0.mask = 0xffff;
aer_ctl.modes_0.value = 0x1887;
aer_ctl.modes_1.mask = 0xffff;
aer_ctl.modes_1.value = 0x01c6;
/* Load equalizer coefficients (unity tap) in both tx and rx directions */
aer_ctl.rxeq_params = (aerEqConfig_t *)&sampleEqBqParamsRx;
aer_ctl.txeq_params = (aerEqConfig_t *)&sampleEqBqParamsTx;
/*== AER valid bitfield 1 ==*/
/* configure NLP */
aer_ctl.valid_bitfield_1 = aer_CTL_VALID1_NLP_CLOSS_TARGET
| aer_CTL_VALID1_NLP_TX_CLIPAGG
| aer_CTL_VALID1_NLP_LINATTN_MAX_ERLE
| aer_CTL_VALID1_NLP_CLIPPER_MAX_ERLE
| aer_CTL_VALID1_NLP_TX_IN_TC
| aer_CTL_VALID1_NLP_TX_OUT_TC
| aer_CTL_VALID1_NLP_RX_IN_TC
| aer_CTL_VALID1_NLP_RX_OUT_TC
| aer_CTL_VALID1_GAIN_SPLIT_TC
| aer_CTL_VALID1_CNG_RX_LEVEL
| aer_CTL_VALID1_CNG_TX_LEVEL;
aer_ctl.nlp_combloss_target = 8192;
aer_ctl.nlp_clip_agg_l2 = -8;
aer_ctl.nlp_linattn_max_erle = 30;
aer_ctl.nlp_clipper_max_erle = 30;
aer_ctl.nlp_tx_in_tc = 4;
aer_ctl.nlp_tx_out_tc = 1;
aer_ctl.nlp_rx_in_tc = 4;
aer_ctl.nlp_rx_out_tc = 1;
aer_ctl.gain_split_tc = 3;
aer_ctl.cng_rx_level = -70;
aer_ctl.cng_tx_level = -70;
/*== AER valid bitfield 2 ==*/
aer_ctl.valid_bitfield_2 = aer_CTL_VALID2_TX_FDNLP_CNG_MAX
| aer_CTL_VALID2_NR_FBIN1_LIM
| aer_CTL_VALID2_NR_FBIN2_LIM
| aer_CTL_VALID2_NR_FBAND1_MAX_ATTEN
| aer_CTL_VALID2_NR_FBAND2_MAX_ATTEN
| aer_CTL_VALID2_NR_FBAND3_MAX_ATTEN
| aer_CTL_VALID2_NR_NOISE_THRESH;
aer_ctl.txfdnlp_cng_max = -40;
aer_ctl.nr_noise_thresh = -65;
aer_ctl.nr_fbin1_lim = 5;
aer_ctl.nr_fbin2_lim = 32;
aer_ctl.nr_fband1_max_atten = 9;
aer_ctl.nr_fband2_max_atten = 9;
aer_ctl.nr_fband3_max_atten = 9;
/*== AER valid bitfield 3 ==*/
aer_ctl.valid_bitfield_3 = aer_CTL_VALID3_HLC_THRESHOLD
| aer_CTL_VALID3_HLC_RAMP_OUT_TC
| aer_CTL_VALID3_HLC_POWER_TC
| aer_CTL_VALID3_COH_HANGOVER
| aer_CTL_VALID3_COH_RATIO_THRESH
| aer_CTL_VALID3_COH_CNT_THRESH;
aer_ctl.thresh_hlc = -20;
aer_ctl.ramp_out_tc_hlc = 700;
aer_ctl.power_tc_hlc = 1;
aer_ctl.coh_hangover = 600;
aer_ctl.coh_ratio_thresh= 6000;
aer_ctl.coh_cnt_thresh = 30;
/*== AER valid bitfield 4 ==*/
aer_ctl.valid_bitfield_4 = aer_CTL_VALID4_DT_THRESH
| aer_CTL_VALID4_CLIP_SCALE
| aer_CTL_VALID4_DT_HANGOVER;
aer_ctl.dt_thresh = 64;
aer_ctl.clip_scale_curve = 0x3c404050;
aer_ctl.dt_hangover = 1;
error_code = aerControl (aer_inst,(aerControl_t *)&aer_ctl);
if(error_code != aer_NOERR) {
printf("AER parameters configuration error!\n");
exit(0);
}
/*== AGC configuration ==*/
agcCtl.valid_bitfield = agc_CTL_VALID_MODES
| agc_CTL_VALID_SAT_THRESHOLD
| agc_CTL_VALID_SAT_HANGOVER
| agc_CTL_VALID_MIC_GAIN_MAX
| agc_CTL_VALID_MIC_GAIN_MIN
| agc_CTL_VALID_MICGAIN_SWING_MAX;
/* Set AGC operation modes: siu_setup->agc_ctl_bitfield is set through
simulation config file: aersimcfg.txt.
* The mask is set to 0xffff to set all bits, either to 0 or to 1.
*/
agcCtl.modes.mask = 0xffff;
agcCtl.modes.value = 3;
agcCtl.sat_threshold = AER_SIM_AGC_SAT_THRESHOLD;
agcCtl.sat_hangover = AER_SIM_AGC_SAT_HANGOVER;
agcCtl.max_micgain = AER_SIM_AGC_MICGAIN_MAX;
agcCtl.min_micgain = AER_SIM_AGC_MICGAIN_MIN;
agcCtl.max_micgain_swing = AER_SIM_AGC_GAINSWING_MAX;
error_code = agcControl (inst->agcHFInst,(agcControl_t *)&agcCtl);
if(error_code != agc_NOERR) {
printf("AGC parameters configuration error!\n");
exit(0);
}
I want to know which parameters can be adjusted to achieve the full duplex or something we need to pay attention to.
Best Regards,
Dudechao