Files
99_7018_lmx/apps/common/icsd/anc/icsd_anc.h

458 lines
14 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#ifndef _SD_ANC_LIB_H
#define _SD_ANC_LIB_H
#include "asm/anc.h"
#include "timer.h"
#include "math.h"
#if 0
#define _anc_printf printf //打开自适应ANC参数调试信息
#else
extern int anc_printf_off(const char *format, ...);
#define _anc_printf anc_printf_off
#endif
#if 0
#define icsd_printf printf
#else
#define icsd_printf(...)
#endif
#define ANC_TRAIN_TIMEOUT_S 5//10//秒
#define TWS_STA_SIBLING_CONNECTED 0x00000002//tws已连接
#define ANC_USER_TRAIN_DMA_LEN 16384
#define TEST_JT_OFF 0
#define ANC_DEBUG_OFF 0
#define ANC_DEBUG_TONEL_SZ_DATA 1
#define ANC_DEBUG_TONER_SZ_DATA 2
#define ANC_DEBUG_PZ_DATA 3
#define ANC_DEBUG_BYPASS_SIGN 4
extern const u8 ICSD_ANC_DEBUG;
#define ANC_FUN_TARGET_SYNC BIT(0)
extern const u16 ICSD_ANC_FUN;
//FF_FB_EN
#define ICSD_DFF_AFB_EN BIT(7)
#define ICSD_AFF_DFB_EN BIT(6)
#define ICSD_FB_TRAIN_OFF BIT(5)
#define ICSD_FB_TRAIN_NEW BIT(4)
//TEST_ANC_COMBINATION
#define TEST_ANC_COMBINATION_OFF 0x00
#define TEST_TFF_TFB_TONE 0x01 // bypassl强制失败
#define TEST_TFF_TFB_BYPASS 0x02 // tonel强制失败
#define TEST_TFF_DFB 0x03 // FB训练强制失败
#define TEST_DFF_TFB 0x04 // PZ强制失败
#define TEST_DFF_DFB 0x05 // tonel,bypassl,PZ强制失败
#define TEST_DFF_DFB_2 0x06 // tonel,PZ强制失败
//TEST_ANC_TRAIN
#define TEST_ANC_TRAIN_OFF 0x01
#define TEST_FF_TRAIN_PASS 0x02 // 强制每次训练都成功
#define TEST_TRAIN_FAIL 0x03 // 强制每次训练都失败
#define TWS_TONE_BYPASS_MODE 1
#define TWS_BYPASS_MODE 2
#define HEADSET_TONE_BYPASS_MODE 3
#define HEADSET_BYPASS_MODE 4
#define HEADSET_TONES_MODE 5
#define TWS_TONE_MODE 6
//user_train_state------------------------
#define ANC_USER_TRAIN_DMA_READY BIT(0)
#define ANC_USER_TRAIN_TOOL_DATA BIT(1)
#define ANC_DAC_MODE_H1_DIFF BIT(2)
#define ANC_USER_TRAIN_DMA_EN BIT(3)
#define ANC_USER_TRAIN_TONEMODE BIT(4)
#define ANC_TRAIN_TONE_PLAY BIT(5)
#define ANC_TRAIN_TONE_END BIT(6)
#define ANC_TRAIN_TONE_FIRST BIT(7)
#define ANC_TRAIN_IIR_READY BIT(8)
#define ANC_MASTER_RX_PZSYNC BIT(9)
#define ANC_FB_IIR_AB_DONE BIT(10)
#define ANC_FF_IIR_AB_DONE BIT(11)
#define ANC_PZOUT_INITED BIT(12)
#define ANC_SZOUT_INITED BIT(13)
#define ANC_USER_TRAIN_RUN BIT(14)
#define ANC_TRAIN_TIMEOUT BIT(15)
#define ANC_TRAIN_DMA_ON BIT(16)
#define ANC_TONE_DAC_ON BIT(17)
#define ANC_TONE_ANC_READY BIT(18)
#define ANC_TONESMODE_BYPASS_OFF BIT(19)
#define ANC_RX_TARGET BIT(20)
#define ANC_TARGET_DONE BIT(21)
//icsd_anc_contral
#define ICSD_ANC_FORCED_EXIT BIT(0)
#define ICSD_ANC_SUSPENDED BIT(1)
#define ICSD_ANC_FADE_GAIN_RESUME BIT(2)
#define ICSD_ANC_TONE_END BIT(3)
#define ICSD_ANC_INITED BIT(4)
#define ICSD_ANC_FORCED_BEFORE_INIT BIT(5)
//anctask cmd
enum {
ANC_CMD_FORCED_EXIT = 0,
ANC_CMD_TONE_MODE_START,
ANC_CMD_TONEL_START,
ANC_CMD_TONER_START,
ANC_CMD_PZL_START,
ANC_CMD_PZR_START,
ANC_CMD_TONE_DACON,
ANC_CMD_TRAIN_AFTER_TONE,
ANC_CMD_TARGET_END,
ANC_CMD_TARGET_HANDLE,
};
//SZPZ->anc_err---------------------------
#define ANC_ERR_LR_BALANCE BIT(0)//左右耳不平衡
#define ANC_ERR_SOUND_PRESSURE BIT(1)//低声压
#define ANC_ERR_SHAKE BIT(2)//抖动
//icsd_anc_function-----------------------
#define ANC_ADAPTIVE_CMP BIT(0)
#define ANC_EARPHONE_CHECK BIT(1)
#define TARLEN 120
#define TARLEN_L 40
#define DRPPNT 10
#define ANC_FBANC_OUT_SEL_L 13
#define ANC_FFANC_OUT_SEL_L 12
struct icsd_anc_tws_packet {
s8 *data;
u16 len;
};
struct icsd_anc_board_param {
u8 iir_mode;
void *anc_db;
void *anc_data_l;
void *anc_data_r;
void *anc_double_data_l;
void *anc_double_data_r;
u8 default_ff_gain;
u8 default_fb_gain;
s8 tool_ffgain_sign;
s8 tool_fbgain_sign;
s8 tool_target_sign;
s8 tfb_sign;
s8 tff_sign;
s8 bfb_sign;
s8 bff_sign;
s8 bypass_sign;
float m_value_l; //80 ~ 200 //135 最深点位置中心值
float sen_l; //12 ~ 22 //18 最深点深度
float in_q_l; //0.4 ~ 1.2 //0.6 最深点降噪宽度
float m_value_r; //80 ~ 200 //135 最深点位置中心值
float sen_r; //12 ~ 22 //18 最深点深度
float in_q_r; //0.4 ~ 1.2 //0.6 最深点降噪宽度
float *mse_tar;
int gold_curve_en;
float gain_a_param;
u8 gain_a_en;
u8 cmp_abs_en;
u8 jt_en;
int idx_begin;
int idx_end;
u8 FB_NFIX;
u16 fb_w2r;
float sen_offset_l;
float sen_offset_r;
u8 gain_min_offset;
u8 gain_max_offset;
u8 ff_target_fix_num_l;
u8 ff_target_fix_num_r;
u8 pz_max_times;
u8 bypass_max_times;
u8 ff_yorder;
u8 fb_yorder;
u8 cmp_yorder;
int cmp_type[8];
float cmp_thd_low;
float cmp_thd_high;
float bypass_volume;
float minvld;
//ctl
u8 mode;
u8 FF_FB_EN;
u8 dma_belong_to;
u32 tone_jiff;
int IIR_NUM;// 4 3
int IIR_NUM_FIX;// 4 8-IIR_NUM
int IIR_COEF; //(IIR_NUM * 3+1)
u8 JT_MODE;
float *anc_szl_out;
float *anc_szr_out;
float sz_priority_thr;
};
extern struct icsd_anc_board_param *ANC_BOARD_PARAM;
struct icsd_anc_backup {
int gains_alogm;
u8 gains_l_ffmic_gain;
u8 gains_l_fbmic_gain;
u8 gains_r_ffmic_gain;
u8 gains_r_fbmic_gain;
float gains_l_ffgain;
float gains_l_fbgain;
float gains_r_ffgain;
float gains_r_fbgain;
double *lff_coeff;
double *lfb_coeff;
double *rff_coeff;
double *rfb_coeff;
u8 lff_yorder;
u8 lfb_yorder;
u8 rff_yorder;
u8 rfb_yorder;
u8 ff_1st_dcc;
u8 fb_1st_dcc;
u8 ff_2nd_dcc;
u8 fb_2nd_dcc;
u8 gains_drc_en;
};
extern volatile struct icsd_anc_backup *CFG_BACKUP;
struct icsd_anc {
audio_anc_t *param;
u16 *anc_fade_gain;
u8 mode;
u8 train_index;
u8 adaptive_run_busy; //自适应训练中
int *gains_alogm;
u8 *gains_l_ffmic_gain;
u8 *gains_l_fbmic_gain;
u8 *gains_r_ffmic_gain;
u8 *gains_r_fbmic_gain;
float *gains_l_ffgain;
float *gains_l_fbgain;
float *gains_l_cmpgain;
float *gains_r_ffgain;
float *gains_r_fbgain;
float *gains_r_cmpgain;
double **lff_coeff;
double **lfb_coeff;
double **lcmp_coeff;
double **rff_coeff;
double **rfb_coeff;
double **rcmp_coeff;
u8 *lff_yorder;
u8 *lfb_yorder;
u8 *lcmp_yorder;
u8 *rff_yorder;
u8 *rfb_yorder;
u8 *rcmp_yorder;
u8 *ff_1st_dcc;
u8 *fb_1st_dcc;
u8 *ff_2nd_dcc;
u8 *fb_2nd_dcc;
u8 *gains_drc_en;
void *src_hdl;
u32 dac_on_jiff;
u32 dac_on_slience;
int tone_delay;
};
extern volatile struct icsd_anc ICSD_ANC;
struct icsd_anc_tool_data {
int h_len;
int yorderb;//int fb_yorder;
int yorderf;//int ff_yorder;
int yorderc;//int cmp_yorder;
float *h_freq;
float *data_out1;//float *hszpz_out_l;
float *data_out2;//float *hpz_out_l;
float *data_out3;//float *htarget_out_l;
float *data_out4;//float *fb_fgq_l;
float *data_out5;//float *ff_fgq_l;
float *data_out6;//float *hszpz_out_r;
float *data_out7;//float *hpz_out_r;
float *data_out8;//float *htarget_out_r;
float *data_out9;//float *fb_fgq_r;,
float *data_out10;//float *ff_fgq_r;
float *data_out11;//float *cmp_fgq_l;
float *data_out12;//float *cmp_fgq_r;
float *data_out13;//float *tool_target_out_l;
float *data_out14;//float *tool_target_out_r;
float *wz_temp;
u8 result;
u8 anc_err;
u8 save_idx;
u8 use_idx;
u8 tws_use_idx;
u8 anc_combination;
u8 cmp_result;
};
extern volatile struct icsd_anc_tool_data *TOOL_DATA;
enum {
TFF_TFB = 0,
TFF_DFB,
DFF_TFB,
DFF_DFB,
};
enum {
ICSD_FULL_INEAR = 0,
ICSD_HALF_INEAR,
ICSD_HEADSET,
};
extern const u8 ICSD_EP_TYPE;
extern int (*anc_printf)(const char *format, ...);
extern int icsd_anc_id;
extern volatile u8 icsd_anc_function;
extern volatile u8 icsd_anc_contral;
extern volatile int user_train_state;
extern u32 train_time;
extern u16 icsd_time_out_hdl;
extern u8 icsd_anc_combination_test;
extern u8 icsd_anc_train_test;
extern const u8 TWS_MODE;
extern const u8 HEADSET_MODE;
extern const u8 NEW_PRE_TREAT;
extern const u8 icsd_dcc[4];
extern const u8 FF_VERSION;
extern const u8 cmp_iir_type[];
extern const u8 ff_iir_type[];
extern const u8 fb_iir_type[];
//LIB调用的算术函数
extern float complex_abs_float(float x, float y);
extern float sin_float(float x);
extern float cos_float(float x);
extern float cos_hq(float x);
extern float sin_hq(float x);
extern float log10_float(float x);
extern float exp_float(float x);
extern float root_float(float x);
extern float anc_pow10(float n);
extern float angle_float(float x, float y);
extern void icsd_anc_save_with_idx(u8 save_idx);
extern void audio_adc_mic_demo_close(void);
extern void icsd_anc_board_config();
//SDK调用的SDANC APP函数
extern void icsd_anc_dma_done();
extern void icsd_anc_end(audio_anc_t *param);
extern void icsd_anc_run();
extern void icsd_anc_setparam();
extern void icsd_anc_timeout_handler();
extern void icsd_anc_init(audio_anc_t *param, u8 mode, u8 seq, int tone_delay, u8 tws_balance_en);
extern u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);
extern void icsd_anc_tone_play_start();
extern void icsd_anctone_dacon(u32 slience_frames, u16 sample_rate);
extern u8 icsd_anc_train_result_get(struct icsd_anc_tool_data *TOOL_DATA);
//SDANC APP调用的库函数
extern void icsd_anc_cmd_packet(s8 *data, u8 cmd);
extern void icsd_anc_tws_sync_cmd(void *_data, u16 len, bool rx);
extern void icsd_anc_version();
extern void icsd_anc_lib_init();
extern void icsd_anc_htarget_data_send_end();
extern void icsd_anc_mode_init(int tone_delay);
extern void icsd_anc_train_after_tone();
extern void icsd_anc_m2s_packet(s8 *data, u8 cmd);
extern void icsd_anc_s2m_packet(s8 *data, u8 cmd);
extern void icsd_anc_msync_packet(struct icsd_anc_tws_packet *packet, u8 cmd);
extern void icsd_anc_ssync_packet(struct icsd_anc_tws_packet *packet, u8 cmd);
extern void icsd_anc_m2s_cb(void *_data, u16 len, bool rx);
extern void icsd_anc_s2m_cb(void *_data, u16 len, bool rx);
extern void icsd_anc_msync_cb(void *_data, u16 len, bool rx);
extern void icsd_anc_ssync_cb(void *_data, u16 len, bool rx);
extern void cal_wz(double *ab, float gain, int tap, float *freq, float fs, float *wz, int len);
extern void ff_fgq_2_aabb(double *iir_ab, float *ff_fgq);
extern float icsd_anc_vmdata_match(float *_vmdata, float gain);
extern void icsd_anc_tonemode_start();
extern float icsd_anc_default_match();
extern void icsd_anc_anctask_cmd_handle(u8 cmd);
extern void icsd_anc_board_param_init();
extern void icsd_anc_tool_data_init();
//SDANC APP调用的SDK函数
extern void icsd_biquad2ab_out(float gain, float f, float fs, float q, double *a0, double *a1, double *a2, double *b0, double *b1, double *b2, int type);
extern void biquad2ab_double(float gain, float f, float q, double *a0, double *a1, double *a2, double *b0, double *b1, double *b2, int type);
extern int tws_api_get_role(void);
extern int tws_api_get_tws_state();
extern void anc_dma_on(u8 out_sel, int *buf, int len);
extern void audio_anc_fade2(int gain, u8 en, u8 step, u8 slow);
extern void anc_user_train_process(audio_anc_t *param);
extern void audio_anc_post_msg_user_train_run(void);
extern void audio_anc_post_msg_user_train_setparam(void);
extern void audio_anc_post_msg_user_train_timeout(void);
extern unsigned int hw_fft_config(int N, int log2N, int is_same_addr, int is_ifft, int is_real);
extern void hw_fft_run(unsigned int fft_config, const int *in, int *out);
extern void anc_user_train_cb(u8 mode, u8 result, u8 forced_exit);
//库调用的SDANC APP函数
extern void icsd_anc_set_alogm(void *_param, int alogm);
extern void icsd_anc_set_micgain(void *_param, int lff_gain, int lfb_gain);
extern void icsd_anc_fade(void *_param);
extern void icsd_anc_long_fade(void *_param);
extern void icsd_anc_user_train_dma_on(u8 out_sel, u32 len, int *buf);
extern void icsd_anc_htarget_data_send();
extern void icsd_anc_fft(int *in, int *out);
extern u32 icsd_anc_get_role();
extern u32 icsd_anc_get_tws_state();
extern void icsd_anc_tws_m2s(u8 cmd);
extern void icsd_anc_tws_s2m(u8 cmd);
extern void icsd_anc_tws_msync(u8 cmd);
extern void icsd_anc_tws_ssync(u8 cmd);
extern void icsd_anc_train_timeout();
extern void icsd_anc_src_init(int in_rate, int out_rate, int (*handler)(void *, void *, int));
extern void icsd_anc_src_write(void *data, int len);
extern u8 icsd_anc_get_save_idx();
extern void icsd_anc_vmdata_num_reset();
extern u8 icsd_anc_get_vmdata_num();
extern u8 icsd_anc_min_diff_idx();
extern void icsd_anc_fgq_printf(float *ptr);
extern void icsd_anc_aabb_printf(double *iir_ab);
extern void icsd_anc_vmdata_by_idx(double *ff_ab, float *ff_gain, u8 idx);
extern void icsd_anc_vmdatar_by_idx(double *ff_ab, float *ff_gain, u8 idx);
extern void icsd_anc_config_inf();
extern void icsd_anc_ear_record_printf();
extern u8 icsd_anc_tooldata_select_vmdata(float *ff_fgq);
extern u8 icsd_anc_tooldata_select_vmdata_headset(float *ff_fgq_l, float *ff_fgq_r);
extern void icsd_audio_adc_mic_open(u8 mic_idx, u8 gain, u16 sr, u8 mic_2_dac);
extern void icsd_audio_adc_mic_close();
extern void sd_anc_exit();
extern void icsd_anc_tonel_start(void *priv);
extern void icsd_anc_toner_start(void *priv);
extern void icsd_anc_pzl_start(void *priv);
extern void icsd_anc_pzr_start(void *priv);
extern void anc_dmadata_debug();
extern void icsd_anc_fft256(int *in, int *out);
extern void icsd_anc_src_push();
extern void anc_core_dma_stop(void);
extern void anc_core_dma_ie(u8 en);
extern void icsd_anc_forced_exit();
extern void audio_anc_post_msg_icsd_anc_cmd(u8 cmd);
extern void icsd_anctone_dacon_handler();
extern void icsd_anc_forced_exit_end();
extern float anc_pow10(float n);
enum {
SD_ANC_TWS = 0,
SD_ANC_HEADSET,
};
struct icsd_anc_libfmt {
int lib_alloc_size; //算法ram需求大小
};
struct icsd_anc_infmt {
void *alloc_ptr; //外部申请的ram地址
};
extern void icsd_anc_set_infmt(struct icsd_anc_infmt *fmt);
extern void icsd_anc_get_libfmt(struct icsd_anc_libfmt *libfmt, u8 type);
extern const float THD_JT;
extern const float THD_JT_SAVE;
extern const float THD_JT2;
extern const float spl_tb [21];
extern const float spl_freq_tb [21];
extern const float target_cmp_dat[];
#endif