Files
99_7018_lmx/apps/common/icsd/adt/icsd_adt.c

504 lines
15 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#include "app_config.h"
#if ((defined TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN) && TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN && \
TCFG_AUDIO_ANC_ENABLE)
#include "system/task.h"
#include "icsd_adt.h"
#include "icsd_adt_app.h"
#include "classic/tws_api.h"
#include "icsd_anc.h"
#include "tone_player.h"
#include "icsd_anc_user.h"
#define ICSD_ADT_TASK_NAME "icsd_adt"
const u8 VDT_TRAIN_EN = 0;
u8 adt_task = 0;
u8 src_task = 0;
int (*adt_printf)(const char *format, ...);
int (*wat_printf)(const char *format, ...);
int (*ein_printf)(const char *format, ...);
int printf_off(const char *format, ...)
{
return 0;
}
#define ADT_DATA_DEBUG 0
void icsd_adt_run_output(__adt_result *adt_result)
{
u8 voice_state = adt_result->voice_state;
u8 wind_lvl = adt_result->wind_lvl;
u8 wat_result = adt_result->wat_result;
u8 ein_state = adt_result->ein_state;
#if ADT_DATA_DEBUG
extern void icsd_adt_output_demo(__adt_result * adt_result);
icsd_adt_output_demo(adt_result);
#else
void audio_acoustic_detector_output_hdl(u8 voice_state, u8 wind_lvl, u8 wat_result);
audio_acoustic_detector_output_hdl(voice_state, wind_lvl, wat_result);
#endif
}
#define AUDIO_ADC_CH0 BIT(0)
#define AUDIO_ADC_CH1 BIT(1)
#define AUDIO_ADC_CH2 BIT(2)
#define AUDIO_ADC_CH3 BIT(3)
void icsd_adt_mic_ch_analog_open(u32 ch)
{
if (ch & AUDIO_ADC_CH0) {
/*close mic0 analog config*/
SFR(JL_ADDA->ADA_CON4, 15, 1, 0); // AUDADC_MICA_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON4, 14, 1, 0); // AUDADC_MICA_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON4, 4, 1, 1); // AUDADC_MICA_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 8, 1, 1); // AUDADC_CHA_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 7, 1, 1); // AUDADC_CHA_EN_10v
SFR(JL_ADDA->ADA_CON1, 6, 1, 1); // AUDADC_CHA_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH1) {
/*close mic1 analog config*/
SFR(JL_ADDA->ADA_CON5, 15, 1, 0); // AUDADC_MICB_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON5, 14, 1, 0); // AUDADC_MICB_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON5, 4, 1, 1); // AUDADC_MICB_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 11, 1, 1); // AUDADC_CHB_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 10, 1, 1); // AUDADC_CHB_EN_10v
SFR(JL_ADDA->ADA_CON1, 9, 1, 1); // AUDADC_CHB_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH2) {
/*close mic2 analog config*/
SFR(JL_ADDA->ADA_CON6, 15, 1, 0); // AUDADC_MICC_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON6, 14, 1, 0); // AUDADC_MICC_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON6, 4, 1, 1); // AUDADC_MICC_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 14, 1, 1); // AUDADC_CHC_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 13, 1, 1); // AUDADC_CHC_EN_10v
SFR(JL_ADDA->ADA_CON1, 12, 1, 1); // AUDADC_CHC_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH3) {
/*close mic3 analog config*/
SFR(JL_ADDA->ADA_CON7, 15, 1, 0); // AUDADC_MICD_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON7, 14, 1, 0); // AUDADC_MICD_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON7, 4, 1, 1); // AUDADC_MICD_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 17, 1, 1); // AUDADC_CHD_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 16, 1, 1); // AUDADC_CHD_EN_10v
SFR(JL_ADDA->ADA_CON1, 15, 1, 1); // AUDADC_CHD_BIAS_EN_10v
}
}
void icsd_adt_mic_ch_analog_close(u32 ch)
{
if (ch & AUDIO_ADC_CH0) {
/*close mic0 analog config*/
SFR(JL_ADDA->ADA_CON4, 15, 1, 0); // AUDADC_MICA_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON4, 14, 1, 0); // AUDADC_MICA_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON4, 4, 1, 0); // AUDADC_MICA_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 8, 1, 0); // AUDADC_CHA_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 7, 1, 0); // AUDADC_CHA_EN_10v
SFR(JL_ADDA->ADA_CON1, 6, 1, 0); // AUDADC_CHA_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH1) {
/*close mic1 analog config*/
SFR(JL_ADDA->ADA_CON5, 15, 1, 0); // AUDADC_MICB_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON5, 14, 1, 0); // AUDADC_MICB_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON5, 4, 1, 0); // AUDADC_MICB_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 11, 1, 0); // AUDADC_CHB_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 10, 1, 0); // AUDADC_CHB_EN_10v
SFR(JL_ADDA->ADA_CON1, 9, 1, 0); // AUDADC_CHB_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH2) {
/*close mic2 analog config*/
SFR(JL_ADDA->ADA_CON6, 15, 1, 0); // AUDADC_MICC_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON6, 14, 1, 0); // AUDADC_MICC_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON6, 4, 1, 0); // AUDADC_MICC_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 14, 1, 0); // AUDADC_CHC_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 13, 1, 0); // AUDADC_CHC_EN_10v
SFR(JL_ADDA->ADA_CON1, 12, 1, 0); // AUDADC_CHC_BIAS_EN_10v
}
if (ch & AUDIO_ADC_CH3) {
/*close mic3 analog config*/
SFR(JL_ADDA->ADA_CON7, 15, 1, 0); // AUDADC_MICD_BUFP_EN_10v
SFR(JL_ADDA->ADA_CON7, 14, 1, 0); // AUDADC_MICD_BUFN_EN_10v
SFR(JL_ADDA->ADA_CON7, 4, 1, 0); // AUDADC_MICD_AMP_EN_10v
SFR(JL_ADDA->ADA_CON1, 17, 1, 0); // AUDADC_CHD_S2_RSTB_10v
SFR(JL_ADDA->ADA_CON1, 16, 1, 0); // AUDADC_CHD_EN_10v
SFR(JL_ADDA->ADA_CON1, 15, 1, 0); // AUDADC_CHD_BIAS_EN_10v
}
}
u8 talk_mic_analog_close = 0;
u8 audio_adt_talk_mic_analog_close()
{
if (talk_mic_analog_close == 0) {
printf("-----------audio_adt_talk_mic_analog_close\n");
u8 talk_mic_ch = icsd_get_talk_mic_ch();
icsd_adt_mic_ch_analog_close(talk_mic_ch);
talk_mic_analog_close = 1;
return 1;
}
return 0;
}
u8 audio_adt_talk_mic_analog_open()
{
if (talk_mic_analog_close) {
printf("-----------audio_adt_talk_mic_analog_open\n");
u8 talk_mic_ch = icsd_get_talk_mic_ch();
icsd_adt_mic_ch_analog_open(talk_mic_ch);
talk_mic_analog_close = 0;
return 1;
}
return 0;
}
float adt_pow10(float n)
{
float pow10n = exp_float((float)n / log10_float(exp_float((float)1.0)));
return pow10n;
}
u32 icsd_adt_get_role()
{
return tws_api_get_role();
}
u32 icsd_adt_get_tws_state()
{
return tws_api_get_tws_state();
}
#define TWS_FUNC_ID_SDADT_M2S TWS_FUNC_ID('A', 'D', 'T', 'M')
REGISTER_TWS_FUNC_STUB(icsd_adt_m2s) = {
.func_id = TWS_FUNC_ID_SDADT_M2S,
.func = icsd_adt_m2s_cb,
};
#define TWS_FUNC_ID_SDADT_S2M TWS_FUNC_ID('A', 'D', 'T', 'S')
REGISTER_TWS_FUNC_STUB(icsd_adt_s2m) = {
.func_id = TWS_FUNC_ID_SDADT_S2M,
.func = icsd_adt_s2m_cb,
};
void icsd_adt_tws_m2s(u8 cmd)
{
local_irq_disable();
s8 data[8];
icsd_adt_m2s_packet(data, cmd);
int ret = tws_api_send_data_to_sibling(data, 8, TWS_FUNC_ID_SDADT_M2S);
local_irq_enable();
}
void icsd_adt_tws_s2m(u8 cmd)
{
local_irq_disable();
s8 data[8];
icsd_adt_s2m_packet(data, cmd);
int ret = tws_api_send_data_to_sibling(data, 8, TWS_FUNC_ID_SDADT_S2M);
local_irq_enable();
}
void icsd_adt_anc_dma_on(u8 out_sel, int *buf, int len)
{
anc_dma_on_double(out_sel, buf, len);
}
void icsd_adt_dma_done()
{
icsd_acoustic_detector_ancdma_done();
}
void icsd_adt_hw_suspend()
{
anc_core_dma_ie(0);
anc_core_dma_stop();
}
void icsd_adt_hw_resume()
{
audio_acoustic_detector_updata();
icsd_adt_szout_init();
}
void icsd_adt_FFT_radix256(int *in_cur, int *out)
{
u32 fft_config;
fft_config = hw_fft_config(256, 8, 1, 0, 1);
hw_fft_run(fft_config, in_cur, out);
}
void icsd_adt_FFT_radix128(int *in_cur, int *out)
{
u32 fft_config;
fft_config = hw_fft_config(128, 7, 1, 0, 1);
hw_fft_run(fft_config, in_cur, out);
}
void icsd_adt_FFT_radix64(int *in_cur, int *out)
{
u32 fft_config;
fft_config = hw_fft_config(64, 6, 1, 0, 1);
hw_fft_run(fft_config, in_cur, out);
}
void icsd_post_anctask_msg(u8 cmd)
{
audio_anc_post_msg_adt(cmd);
}
void icsd_post_adttask_msg(u8 cmd)
{
if (adt_task == 1) {
os_taskq_post_msg("icsd_adt", 1, cmd);
}
}
void icsd_post_srctask_msg(u8 cmd)
{
if (src_task == 1) {
os_taskq_post_msg("icsd_src", 1, cmd);
}
}
void icsd_adt_task(void *priv)
{
int res = 0;
int msg[30];
while (1) {
res = os_taskq_pend(NULL, msg, ARRAY_SIZE(msg));
if (res == OS_TASKQ) {
icsd_adt_task_handler(msg[1]);
}
}
}
void icsd_adt_task_create()
{
if (adt_task == 0) {
task_create(icsd_adt_task, NULL, ICSD_ADT_TASK_NAME);
adt_task = 1;
}
}
void icsd_adt_task_kill()
{
if (adt_task == 1) {
task_kill(ICSD_ADT_TASK_NAME);
adt_task = 0;
}
}
void icsd_src_task(void *priv)
{
int res = 0;
int msg[30];
while (1) {
res = os_taskq_pend(NULL, msg, ARRAY_SIZE(msg));
if (res == OS_TASKQ) {
icsd_src_task_handler(msg[1]);
}
}
}
void icsd_src_task_create()
{
if (src_task == 0) {
task_create(icsd_src_task, NULL, "icsd_src");
src_task = 1;
}
}
void icsd_src_task_kill()
{
if (src_task == 1) {
task_kill("icsd_src");
src_task = 0;
}
}
void icsd_adt_start()
{
adt_printf = _adt_printf;
wat_printf = _wat_printf;
ein_printf = _ein_printf;
printf("icsd_adt_start====================================\n");
}
void icsd_adt_szout_init()
{
#if ADT_USE_ADAPTIVE_SZ
extern float icsd_anc_sz_data[120 + 40];
extern float icsd_anc_pz_data[120 + 40];
extern u8 sz_out_exist;//需要打开自适应ANC库中的 自适应SZ输出使能:ANC_SZ_OUT_EN
icsd_adt_szout_set(icsd_anc_sz_data, icsd_anc_pz_data, sz_out_exist);
#else
icsd_adt_szout_set(0, 0, 0);
#endif
}
const u16 ADT_DEBUG_INF = 0;//ADT_INF_1;//state
//state = 1, pwr = 7, dov = 8, angle_err = 7, angle_tlk = 3
const u8 adt_errpxx_dB_thr = 80;//60;
const u8 adt_err_zcv_thr = 10;//12;
const u8 pwr_inside_even_flag0_thr = 5; //pwr
const u8 angle_err_even_flag0_thr = 3;//4; //angle_err
const u8 angle_talk_even_flag0_thr = 2; //angle_tlk
const u16 f1f2_angsum_thr = 200;
#ifndef ADT_CLIENT_BOARD
const u8 final_speech_even_thr = 4; //dov
const u8 ADT_TWS_MODE = 1;
const u8 ADT_DET_VER = 6;
const u8 ADT_PATH_CONFIG = ADT_PATH_DAC_SRC_EN | ADT_PATH_3M_EN;
const u8 ADT_EIN_VER = ADT_EIN_TWS_V0;
const float ref_gain_sel = 3;
const float err_gain_sel = 3;
u8 pnc_ref_pwr_thr = 160;
u8 pnc_err_pwr_thr = 100;
u8 tpc_ref_pwr_thr = 120;
u8 tpc_err_pwr_thr = 100;
u8 anc_ref_pwr_thr = 120;
u8 anc_err_pwr_thr = 100;
const float wat_pn_gain = 0.22;
const float wat_bypass_gain = 16;
const float wat_anc_gain = 0.22;
const float wdac_senc = 0.7; //越小播音乐时灵敏度越高
const float wdac[8] = { 0.35, 0.54, 0.57, 0.48, 0.37, 0.22, 0.38, 0.37};//播放音乐/100
const float wref[8] = {1.62, 0.90, 0.71, 0.60, 0.54, 0.50, 0.47, 0.46};//播放外部噪声
const float wref_tran[8] = {1.82, 1.80, 1.58, 1.30, 1.16, 1.12, 1.11, 1.12};
const float wref_ancs[8] = {1.92, 0.48, 0.07, 0.03, 0.05, 0.06, 0.06, 0.04 };
const float fdac[8] = {0.18, 0.051, 0.02, 0.02, 0.02, 0.02, 0.02, 0.05};//播放音乐/1000
u8 icsd_get_ang_flag(float *_target_angle)
{
u8 af1 = _target_angle[1] > 15 || _target_angle[1] < -130;
u8 af2 = _target_angle[2] > 15 || _target_angle[2] < -130;
u8 af3 = _target_angle[3] > 15 || _target_angle[3] < -130;
u8 ang_flag = af1 && af2 && af3;
/* printf("get ang flag:%d\n", ang_flag); */
return ang_flag;
}
void icsd_adt_ein_parm_HT03(__icsd_adt_parm *_ADT_PARM)
{
_ADT_PARM->anc_in_pz_sum = -80;
_ADT_PARM->anc_out_pz_sum = 0;
_ADT_PARM->anc_in_sz_mean = 1;
_ADT_PARM->anc_out_sz_mean = -12;
_ADT_PARM->anc_in_fb_sum = 60;
_ADT_PARM->anc_out_fb_sum = 30;
_ADT_PARM->pnc_in_pz_sum = -80;
_ADT_PARM->pnc_out_pz_sum = 0;
_ADT_PARM->pnc_in_sz_mean = 1;
_ADT_PARM->pnc_out_sz_mean = -12;
_ADT_PARM->pnc_in_fb_sum = 60;
_ADT_PARM->pnc_out_fb_sum = 30;
_ADT_PARM->trans_in_pz_sum = 2;
_ADT_PARM->trans_out_pz_sum = 26;
_ADT_PARM->trans_in_sz_mean = 2;
_ADT_PARM->trans_out_sz_mean = -7;
_ADT_PARM->trans_in_fb_sum = 20;
_ADT_PARM->trans_out_fb_sum = -20;
}
void icsd_adt_voice_board_data()
{
__icsd_adt_parm *ADT_PARM;
ADT_PARM = zalloc(sizeof(__icsd_adt_parm));
extern const float HT03_ADT_FLOAT_DATA[];
extern const float HT03_sz_out_data[28];
extern const float HT03_pz_out_data[28];
ADT_PARM->adt_float_data = (void *)HT03_ADT_FLOAT_DATA;
ADT_PARM->sz_inptr = (float *)HT03_sz_out_data;
ADT_PARM->pz_inptr = (float *)HT03_pz_out_data;
icsd_adt_ein_parm_HT03(ADT_PARM);
icsd_adt_parm_set(ADT_PARM);
free(ADT_PARM);
icsd_adt_szout_init();
}
#else
#include "icsd_adt_client_board.c"
#endif/*ADC_CLIENT_BOARD*/
//=======================================================================================================
#if ADT_DATA_DEBUG
void icsd_play_num0()
{
icsd_adt_tone_play(ICSD_ADT_TONE_NUM0);
}
void icsd_play_num1()
{
icsd_adt_tone_play(ICSD_ADT_TONE_NUM1);
}
void icsd_play_num2()
{
icsd_adt_tone_play(ICSD_ADT_TONE_NUM2);
}
void icsd_play_num3()
{
icsd_adt_tone_play(ICSD_ADT_TONE_NUM3);
}
void icsd_play_normal()
{
icsd_adt_tone_play(ICSD_ADT_TONE_NORMAL);
}
void icsd_adt_output_demo(__adt_result *adt_result)
{
#if ADT_EAR_IN_EN
static u8 hold = 0;
static u8 hold_flg = 0;
static int hold_time = 0;
if (adt_result->ein_state == 0) {
hold = 1;
hold_flg = 1;
hold_time = 0;
printf("------------------------------------------------------------------ein state:0\n");
} else {
if (hold_flg) {
hold_flg = 0;
hold_time = jiffies;
printf("set hold time:%d\n", hold_time);
}
if ((hold_time > 0) && (hold)) {
if (jiffies > (hold_time + 100)) {
printf("hold time out:%d\n", jiffies);
hold = 0;
}
}
printf("--------------------------------ein state:1\n");
}
if (hold) {
//return;
}
#endif
if (adt_result->wind_lvl) {
printf("------wind lvl:%d\n", adt_result->wind_lvl);
}
if (adt_result->voice_state) {
icsd_play_normal();
}
switch (adt_result->wat_result) {
case 2:
icsd_play_num2();
break;
case 3:
icsd_play_num3();
break;
default:
break;
}
}
#endif /*ADT_DATA_DEBUG*/
#endif /*(defined TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN) && TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/