Files
AC707N/SDK/interface/media/cvp/cvp_dms.h
T
2025-12-03 11:12:34 +08:00

448 lines
20 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _CVP_DMS_H_
#define _CVP_DMS_H_
#include "generic/typedef.h"
#include "cvp_common.h"
/*降噪版本定义*/
#define DMS_V100 0xA1
#define DMS_V200 0xA2
//dms_cfg:
typedef struct {
u8 mic_again; //DAC增益,default:3(0~14)
u8 dac_again; //MIC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ans*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
/*common*/
float global_minsuppress; //default:0.0,range[0.0:0.09]
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
/*debug*/
u8 output_sel;/*dms output选择*/
} _GNU_PACKED_ AEC_DMS_CONFIG;
//dms_flexible_cfg:
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC0增益,default:10(0~14)
u8 mic1_again; //MIC1增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块 NS:BIT(2) ENC:BIT(3) AGC:BIT(4)
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 reserved[2];
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ans*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
float enc_suppress_pre; //ENC前级压制,越大越强 default:0.6f,range[0:1]
float enc_suppress_post; //ENC后级压制,越大越强 default:0.15f,range[0:1]
float enc_minsuppress; //ENC后级压制下限 default:0.09f,range[0:1]
float enc_disconverge_erle_thr; //滤波器发散控制阈值,越大控制越强 default:-6.f,range[-20:5]
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择*/
} _GNU_PACKED_ DMS_FLEXIBLE_CONFIG;
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC增益,default:3(0~14)
u8 fb_mic_again; //FB MIC增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 agc_type; //AGC类型选择,0AGC_EXTERNAL1AGC_INTERNAL
union {
/*AGC*/
struct {
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -30 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -30 dB)
} agc_ext;
/*JLSP AGC*/
struct {
int min_mag_db_level;//语音能量放大下限阈值,范围:-90 ~ -35 db,默认-50,单位:dB
int max_mag_db_level;//语音能量放大上限阈值,范围:-90 ~ 0 dB,默认-3 ,单位dB
int addition_mag_db_level;//语音补偿能量值,范围:0 ~ 20 dB,默认0 ,单位dB
int clip_mag_db_level;//语音最大截断能量值,范围:-10 ~ 0 dB,默认-3,单位dB
int floor_mag_db_level;//语音最小截断能量值,范围:-90 ~ -35 dB,默认-70,单位dB
} agc_int;
} agc;
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*dns*/
int dns_process_maxfrequency; //default:8000,range[3000:8000]
int dns_process_minfrequency; //default:0,range[0:1000]
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
float snr_db_T0; //sir设定阈值
float snr_db_T1; //sir设定阈值
float floor_noise_db_T;
float compen_db; //mic增益补偿, dB
/*wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择: 0:Default, 1:Master Raw, 2:Slave Raw, 3:Fbmic Raw*/
} _GNU_PACKED_ DMS_HYBRID_CONFIG;
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC增益,default:3(0~14)
u8 fb_mic_again; //FB MIC增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 agc_type; //AGC类型选择,0AGC_EXTERNAL1AGC_INTERNAL
union {
/*AGC*/
struct {
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -30 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -30 dB)
} agc_ext;
/*JLSP AGC*/
struct {
int min_mag_db_level;//语音能量放大下限阈值,范围:-90 ~ -35 db,默认-50,单位:dB
int max_mag_db_level;//语音能量放大上限阈值,范围:-90 ~ 0 dB,默认-3 ,单位dB
int addition_mag_db_level;//语音补偿能量值,范围:0 ~ 20 dB,默认0 ,单位dB
int clip_mag_db_level;//语音最大截断能量值,范围:-10 ~ 0 dB,默认-3,单位dB
int floor_mag_db_level;//语音最小截断能量值,范围:-90 ~ -35 dB,默认-70,单位dB
} agc_int;
} agc;
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*dns*/
int dns_process_maxfrequency; //default:8000,range[3000:8000]
int dns_process_minfrequency; //default:0,range[0:1000]
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择: 0:Default, 1:Master Raw, 2:Slave Raw, 3:Fbmic Raw*/
} _GNU_PACKED_ DMS_AWN_CONFIG;
struct dms_attr {
u8 ul_eq_en: 1;
u8 wideband: 1;
u8 wn_en: 1;
u8 dly_est : 1;
u8 aptfilt_only: 1;
u8 reserved: 3;
u8 dst_delay;/*延时估计目标延时*/
u8 EnableBit;
u8 FB_EnableBit;
u8 packet_dump;
u8 SimplexTail;
u8 output_sel;/*dms output选择*/
u16 hw_delay_offset;/*dac hardware delay offset*/
u16 wn_gain;/*white_noise gain*/
u8 agc_type; /*agc类型*/
/*AGC*/
float AGC_NDT_fade_in_step; //in dB
float AGC_NDT_fade_out_step; //in dB
float AGC_NDT_max_gain; //in dB
float AGC_NDT_min_gain; //in dB
float AGC_NDT_speech_thr; //in dB
float AGC_DT_fade_in_step; //in dB
float AGC_DT_fade_out_step; //in dB
float AGC_DT_max_gain; //in dB
float AGC_DT_min_gain; //in dB
float AGC_DT_speech_thr; //in dB
float AGC_echo_present_thr; //In dB
int AGC_echo_look_ahead; //in ms
int AGC_echo_hold; // in ms
/*AEC*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*NLP*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ANS*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75db,range[-100:-30]
/*ENC*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
/*BCS*/
int bone_process_maxfreq;
int bone_process_minfreq;
float bone_init_noise_lvl;
int Bone_AEC_Process_MaxFrequency;
int Bone_AEC_Process_MinFrequency;
/*common*/
float global_minsuppress; //default:0.0,range[0.0:0.09]
/*data handle*/
int (*cvp_advanced_options)(void *aec,
void *nlp,
void *ns,
void *enc,
void *agc,
void *wn,
void *mfdt);
int (*aec_probe)(short *mic0, short *mic2, short *mic3, short *ref, u16 len);
int (*aec_post)(s16 *dat, u16 len);
int (*aec_update)(u8 EnableBit);
int (*output_handle)(s16 *dat, u16 len);
/*flexible enc*/
int flexible_af_length; //default:512 range[128、256、512、1024]
int sir_minfreq; //default:100,range[0:8000]
int SIR_mean_MaxFrequency; //default:1000,range[0:8000]
int SIR_mean_MinFrequency; //default:100,range[0:8000]
float ENC_CoheFlgMax_gamma; //default:0.5f,range[0:1]
float coheXD_thr; //default:0.5f,range[0:1]
float Disconverge_ERLE_Thr; //default:-6.f,range[-20:5]
/*WN*/
float wn_detect_time; //in second
float wn_detect_time_ratio_thr; //0-1
float wn_detect_thr; //0-1
float wn_minsuppress; //0-1
/*Extended-Parameters*/
u32 ref_sr;
u16 ref_channel; /*参考数据声道数*/
u16 adc_ref_en; /*adc回采参考数据使能*/
u8 mic_bit_width; /*麦克风数据位宽*/
u8 ref_bit_width; /*参考数据位宽*/
/*DNS Parameters*/
float DNS_highGain; //EQ强度 range[1.0:3.5]
float DNS_rbRate; //混响强度 range[0:0.9];
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
/*jlsp hybrid enc*/
float snr_db_T0;
float snr_db_T1;
float floor_noise_db_T;
float compen_db;
float *transfer_func;
/*jlsp hybrid dns*/
int dns_process_maxfrequency;
int dns_process_minfrequency;
/*jlsp hybrid agc*/
int min_mag_db_level;
int max_mag_db_level;
int addition_mag_db_level;
int clip_mag_db_level;
int floor_mag_db_level;
/*jlsp dms hybrid wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
};
s32 aec_dms_init(struct dms_attr *attr);
s32 aec_dms_exit();
s32 aec_dms_fill_in_data(void *dat, u16 len);
int aec_dms_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_fill_ref_data(void *data0, void *data1, u16 len);
void aec_dms_toggle(u8 toggle);
int aec_dms_cfg_update(AEC_DMS_CONFIG *cfg);
int aec_dms_reboot(u8 enablebit);
u8 get_cvp_dms_rebooting();
s32 aec_dms_flexible_init(struct dms_attr *attr);
s32 aec_dms_flexible_exit();
s32 aec_dms_flexible_fill_in_data(void *dat, u16 len);
int aec_dms_flexible_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_flexible_fill_ref_data(void *data0, void *data1, u16 len);
void aec_dms_flexible_toggle(u8 toggle);
int aec_dms_flexible_cfg_update(DMS_FLEXIBLE_CONFIG *cfg);
int aec_dms_flexible_reboot(u8 enablebit);
u8 get_cvp_dms_flexible_rebooting();
s32 aec_dms_hybrid_init(struct dms_attr *attr);
s32 aec_dms_hybrid_exit();
s32 aec_dms_hybrid_fill_in_data(void *dat, u16 len);
int aec_dms_hybrid_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_hybrid_fill_ref_data(void *data0, void *data1, u16 len);
int cvp_dms_hybrid_read_ref_data(void);
void aec_dms_hybrid_toggle(u8 toggle);
int aec_dms_hybrid_cfg_update(DMS_HYBRID_CONFIG *cfg);
int aec_dms_hybrid_reboot(u8 enablebit);
u8 get_cvp_dms_hybrid_rebooting();
s32 aec_dms_awn_init(struct dms_attr *attr);
s32 aec_dms_awn_exit();
s32 aec_dms_awn_fill_in_data(void *dat, u16 len);
int aec_dms_awn_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_awn_fill_ref_data(void *data0, void *data1, u16 len);
int cvp_dms_awn_read_ref_data(void);
void aec_dms_awn_toggle(u8 toggle);
int aec_dms_awn_cfg_update(DMS_AWN_CONFIG *cfg);
int aec_dms_awn_reboot(u8 enablebit);
u8 get_cvp_dms_awn_rebooting();
/*获取风噪的检测结果,1:有风噪,0:无风噪*/
int cvp_dms_get_wind_detect_state(void);
/*单双麦切换状态
* 0: 正常双麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
int cvp_dms_get_malfunc_state(void);
/*
* 获取mic的能量值,开了MFDT_EN才能用
* mic: 0 获取主麦能量
* mic1 获取副麦能量
* return:返回能量值,[0~90.3],返回-1表示错误
*/
float cvp_dms_get_mic_energy(u8 mic);
typedef enum {
DMS_FLEXIBLE_DUAL_MIC = 0, //双mic
DMS_FLEXIBLE_USE_TALK_MIC, //通话mic(主麦)
DMS_FLEXIBLE_USE_REF_MIC, //参考mic(副麦)
} DMS_FLEXIBLE_MIC;
/* 话务耳机切换使用的mic
* DMS_FLEXIBLE_DUAL_MIC :正常双麦话务耳机
* DMS_FLEXIBLE_USE_TALK_MIC :使用主麦
* DMS_FLEXIBLE_USE_REF_MIC :使用副麦
*/
int aec_dms_flexible_selete_mic(DMS_FLEXIBLE_MIC mic);
int cvp_dms_read_ref_data(void);
int cvp_dms_flexible_read_ref_data(void);
/*
* 获取风噪检测信息
* wd_flag: 0 没有风噪,1 有风噪
* 风噪强度r: 0~BIT(16)
* wd_lev: 风噪等级,0:弱风,1:中风,2:强风
* */
int jlsp_get_wind_detect_info(int *wd_flag, int *wd_val, int *wd_lev);
#endif/*_CVP_DMS_H_*/