api_nr.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. #ifndef _API_NR_H
  2. #define _API_NR_H
  3. #define _MAX_GAIN (0x800000)
  4. #define SOFT_DIG_P0DB (_MAX_GAIN * 1.000000)
  5. #define SOFT_DIG_P1DB (_MAX_GAIN * 1.122018)
  6. #define SOFT_DIG_P2DB (_MAX_GAIN * 1.258925)
  7. #define SOFT_DIG_P3DB (_MAX_GAIN * 1.412538)
  8. #define SOFT_DIG_P4DB (_MAX_GAIN * 1.584893)
  9. #define SOFT_DIG_P5DB (_MAX_GAIN * 1.778279)
  10. #define SOFT_DIG_P6DB (_MAX_GAIN * 1.995262)
  11. #define SOFT_DIG_P7DB (_MAX_GAIN * 2.238721)
  12. #define SOFT_DIG_P8DB (_MAX_GAIN * 2.511886)
  13. #define SOFT_DIG_P9DB (_MAX_GAIN * 2.818383)
  14. #define SOFT_DIG_P10DB (_MAX_GAIN * 3.162278)
  15. #define SOFT_DIG_P11DB (_MAX_GAIN * 3.548134)
  16. #define SOFT_DIG_P12DB (_MAX_GAIN * 3.981072)
  17. #define SOFT_DIG_P13DB (_MAX_GAIN * 4.466836)
  18. #define SOFT_DIG_P14DB (_MAX_GAIN * 5.011872)
  19. #define SOFT_DIG_P15DB (_MAX_GAIN * 5.623413)
  20. #define SOFT_DIG_P16DB (_MAX_GAIN * 6.309573)
  21. #define SOFT_DIG_P17DB (_MAX_GAIN * 7.079458)
  22. #define SOFT_DIG_P18DB (_MAX_GAIN * 7.943282)
  23. #define SOFT_DIG_P19DB (_MAX_GAIN * 8.912509)
  24. #define SOFT_DIG_P20DB (_MAX_GAIN * 10.000000)
  25. #define SOFT_DIG_P21DB (_MAX_GAIN * 11.220185)
  26. #define SOFT_DIG_P22DB (_MAX_GAIN * 12.589254)
  27. #define SOFT_DIG_P23DB (_MAX_GAIN * 14.125375)
  28. #define SOFT_DIG_P24DB (_MAX_GAIN * 15.848932)
  29. #define SOFT_DIG_P25DB (_MAX_GAIN * 17.782794)
  30. #define SOFT_DIG_P26DB (_MAX_GAIN * 19.952623)
  31. #define SOFT_DIG_P27DB (_MAX_GAIN * 22.387211)
  32. #define SOFT_DIG_P28DB (_MAX_GAIN * 25.118864)
  33. #define SOFT_DIG_P29DB (_MAX_GAIN * 28.183829)
  34. #define SOFT_DIG_P30DB (_MAX_GAIN * 31.622777)
  35. #define SOFT_DIG_P31DB (_MAX_GAIN * 35.481339)
  36. enum {
  37. DUMP_MIC_TALK = 0, //主MIC数据
  38. DUMP_MIC_FF, //副MIC数据
  39. DUMP_MIC_NR, //降噪后数据
  40. DUMP_AEC_INPUT, //AEC输入数据
  41. DUMP_AEC_FAR, //AEC远端数据
  42. DUMP_AEC_OUTPUT, //AEC输出数据
  43. DUMP_FAR_NR_INPUT, //远端降噪输入数据
  44. DUMP_FAR_NR_OUTPUT, //远端降噪输出数据
  45. DUMP_EQ_OUTPUT, //MIC EQ输出数据
  46. DUMP_SCO_MAX_NB,
  47. };
  48. #define DUMP_SNDP_MASK 0x000f
  49. #define DUMP_AEC_MASK 0x00f0
  50. #define NR_CFG_TYPE_MASK 0x1F
  51. //call param
  52. enum NR_TYPE {
  53. NR_TYPE_NONE = 0,
  54. NR_TYPE_AINS,
  55. NR_TYPE_SNDP_SM,
  56. NR_TYPE_SNDP_DM,
  57. NR_TYPE_SNDP_FBDM,
  58. NR_TYPE_SMIC_AI, //自研单MIC AI降噪算法
  59. NR_TYPE_SMIC_PRO_AI, //自研单MIC 大模型AI降噪算法
  60. NR_TYPE_SMIC_AIAEC, //自研单MIC + AIAEC降噪算法
  61. NR_TYPE_DMIC_AI, //NR_TYPE_DMDNN
  62. NR_TYPE_USER,
  63. };
  64. enum AEC_TYPE {
  65. AEC_TYPE_NONE = 0,
  66. AEC_TYPE_DEFAULT, //默认硬件频域AEC
  67. };
  68. enum AEC_NR_MODE {
  69. AEC_NR_MODE0 = 0, //AEC(线性+非线性) + NR
  70. AEC_NR_MODE1, //AEC(线性) + NR + AEC(非线性)
  71. AEC_NR_MODE2, //NR + AEC(线性) + AEC(非线性)
  72. };
  73. typedef struct {
  74. u8 level; //稳态最大降噪量,范围0~29dB
  75. u8 dnn_level; //dnn最大降噪量,范围0~29dB
  76. u8 param_printf;
  77. const u32 *coef; //声加配置资源,非0:使用声加工具配置(从资源读取)
  78. } sndp_sm_cb_t;
  79. typedef struct {
  80. u8 distance;
  81. //小于保护角的语音被保留,大于抑制角的语音被抑制,中间平滑过渡
  82. u8 degree; //语音保护角,范围0~90度
  83. u8 degree1; //语音抑制角 = degree + degree1,范围0~90度
  84. u8 level; //稳态最大降噪量,范围0~29dB
  85. u8 dnn_level; //dnn最大降噪量,范围0~29dB
  86. u8 param_printf;
  87. int bf_upper; //固定波束频率上限, 默认128
  88. const u32 *coef; //声加配置资源,非0:使用声加工具配置(从资源读取)
  89. } sndp_dm_cb_t;
  90. typedef struct {
  91. u8 level; //稳态最大降噪量,范围0~29dB
  92. u8 dnn_level; //dnn最大降噪量,范围0~29dB
  93. u8 param_printf;
  94. u8 noiserms_th0; //混音阈值,范围0~100
  95. const u32 *coef; //声加配置资源,非0:使用声加工具配置(从资源读取)
  96. } sndp_fbdm_cb_t;
  97. enum NR_CFG_EN {
  98. NR_CFG_FAR_EN = BIT(0), //使能远端降噪
  99. NR_CFG_NEAR_AINS2_EN = BIT(1), //使能声加单麦前AINS2
  100. NR_CFG_TRUMPET_EN = BIT(2), //使能汽车喇叭声降噪
  101. NR_CFG_SCO_FADE_EN = BIT(3), //使能通话前500ms淡入
  102. NR_CFG_DAC_DNR_EN = BIT(4), //使能通话下行————动态降噪
  103. NR_CFG_DAC_DRC_EN = BIT(5), //使能通话下行————DRC
  104. };
  105. typedef struct {
  106. u32 nt;
  107. u8 prior_opt_idx;
  108. u8 ns_ps_rate;
  109. u8 trumpet_en;
  110. u8 nt_post;
  111. u8 exp_range;
  112. } ains_cb_t;
  113. typedef struct {
  114. u8 distance; //双mic间距:mm(步进1mm)
  115. u8 degree; //语音角度(小于90度):10+5*N (5度步进,N<17)
  116. u8 max_degree; //最大保护角度(小于90度):10+5*N (5度步进,N<17)
  117. u8 level; //降噪强度:2*N(2dB步进,N<30)
  118. u8 wind_level;
  119. u8 param_printf; //使能参数打印
  120. u8 rfu[1];
  121. const int *filter_coef; //int coef[512]
  122. int maxIR; //Q18
  123. int maxIR2; //Q18
  124. u16 windnoise_conditioned_eq_x0; //风噪抑制起始频段(Hz)
  125. u16 windnoise_conditioned_eq_x1; //风噪抑制终止频段(Hz)
  126. int windnoise_conditioned_eq_y1; //风噪抑制的终止大小(db), 最小为0db
  127. u8 snr_x0_level; //如果在一般信噪比下,降噪不足,就适当调大(0~0.4 步进0.05),默认0.1
  128. u8 snr_x1_level; //如果低信噪比下,语音断断续续,就适当调小(0.5~1 步进0.05),默认0.8
  129. } dmic_cb_t;
  130. typedef struct {
  131. u16 nt;
  132. u8 nt_post;
  133. s16 exp_range_H;
  134. s16 exp_range_L;
  135. u8 model_select;
  136. u16 min_value;
  137. u16 nostation_floor;
  138. u8 wind_thr;
  139. u8 wind_en;
  140. u8 noise_ps_rate;
  141. u8 prior_opt_idx;
  142. u8 prior_opt_ada_en;
  143. u8 wind_level;
  144. u16 wind_range;
  145. u16 low_fre_range;
  146. u16 low_fre_range0;
  147. u8 pitch_filter_en;
  148. u8 param_printf; //使能参数打印
  149. u16 mask_floor;
  150. u8 mask_floor_r;
  151. u8 music_lev;
  152. u8 comforN_level;
  153. u16 gain_expand;
  154. u8 nn_only;
  155. u16 nn_only_len;
  156. u16 gain_assign;
  157. u8 sin_gain_post_en;
  158. u16 sin_gain_post_len;
  159. u16 sin_gain_post_len_f;
  160. } dnn_cb_t;
  161. typedef struct {
  162. u16 gain_floor;
  163. //u8 nt_post;
  164. //s16 exp_range_H;
  165. //s16 exp_range_L;
  166. u8 noise_ps_rate;
  167. u8 prior_opt_idx;
  168. u8 prior_opt_ada_en;
  169. //u8 wind_level;
  170. //u16 wind_range;
  171. u16 low_fre_range;
  172. u8 param_printf; //使能参数打印
  173. u8 music_lev;
  174. u8 nn_only;
  175. u16 nn_only_len;
  176. u16 gain_assign;
  177. u8 sin_gain_post_en;
  178. u16 sin_gain_post_len;
  179. u16 sin_gain_post_len_f;
  180. } dnn_pro_cb_t;
  181. typedef struct {
  182. s16 gamma;
  183. u8 nlp_en;
  184. u8 nlp_level;
  185. s16 nt;
  186. u8 param_printf;
  187. u8 music_lev;
  188. //s16 exp_range_H;
  189. //s16 exp_range_L;
  190. u8 noise_ps_rate;
  191. u8 prior_opt_idx;
  192. u8 prior_opt_ada_en;
  193. u8 wind_level;
  194. u16 wind_range;
  195. s16 mask_floor;
  196. u16 low_fre_range;
  197. u8 nn_only;
  198. u16 nn_only_len;
  199. u8 sin_gain_post_en;
  200. u16 sin_gain_post_len;
  201. u16 sin_gain_post_len_f;
  202. u8 smooth_en;
  203. u16 far_post_thr;
  204. u32 dtd_post_thr;
  205. s16 gain_assign;
  206. u16 echo_gain_floor;
  207. s16 dtd_smooth;
  208. s16 single_floor;
  209. s16 gain_assign_nlp;
  210. u16 gain_st_thr;
  211. s32 intensity;
  212. } dnn_aec_ns_cb_t;
  213. typedef struct {
  214. u8 param_printf; //使能参数打印
  215. u8 mic_cfg; //主副麦选择
  216. u8 bf_type; //beamforming类型
  217. s16 distance; //双麦间距
  218. u16 degree; //拾音角度方向
  219. s16 nt; //普通降噪量
  220. u8 nt_post; //后滤波降噪量
  221. s16 exp_range;
  222. //u8 fast_convergence_en; //快速收敛功能,对人声有影响,默认不开
  223. //u16 lowside_corr; //下支路相关系数
  224. // u8 trumpet_en; //喇叭声抑制
  225. u8 cmp_tbl_dis;
  226. u8 dm_dnn_en; //是否使能双麦AI算法
  227. u8 noise_ps_rate;
  228. u8 comp_mic_fre; //双麦+AI的参数
  229. u16 comp_mic_fre_L; //传统双麦的参数
  230. u16 comp_mic_fre_H; //传统双麦的参数
  231. u8 prior_opt_idx;
  232. u16 low_fre_ns0_range;
  233. u8 wind_sig_choose;
  234. u8 bf_choose;
  235. u8 tf_en;
  236. u8 post_filter_en;
  237. u8 phase_comp_en;
  238. u8 phase_comp_en_B;
  239. u8 low_bf_lim;
  240. s32 NSC;
  241. u16 tf_len;
  242. u8 tf_norm_en;
  243. u8 tf_norm_only_en;
  244. s32 opt_limit;
  245. s16 exp_range_H;
  246. s16 exp_range_L;
  247. u8 music_lev;
  248. u16 gain_expand;
  249. u8 nn_only;
  250. u16 nn_only_len;
  251. u8 hi_fre_en;
  252. u16 gain_assign;
  253. u8 sin_gain_post_en;
  254. u16 b_frein2_floor;
  255. u16 Gcoh_thr;
  256. u16 Gcoh_sum_thr;
  257. u8 wind_or_en;
  258. u8 v_white_en;
  259. //u8 wind_type;
  260. s16 sin_gain_post_len_f;
  261. u8 enlarge_v;
  262. s16 mask_floor;
  263. u16 mask_floor_hi;
  264. s16 wind_state_lim;
  265. s16 wind_sup_floor;
  266. u8 wind_sup_open;
  267. u8 wind_a_pow_en;
  268. u8 bfrein_en;
  269. u8 bfrein3_ns;
  270. u16 wind_len_used;
  271. u8 bfrein3_en;
  272. s32 gu_value;
  273. u8 TCtrigger_sta;
  274. u8 white_approach_shape;
  275. u8 low_grad_prot;
  276. s32 grad_gain_floor;
  277. } dmns_cb_t; //dmns和dmdnn共用一套结构体
  278. typedef struct {
  279. u8 param_printf; //使能参数打印
  280. u8 mic_cfg; //主副麦选择
  281. // u8 bf_type; //beamforming类型
  282. s16 distance; //双麦间距
  283. u16 degree; //拾音角度方向
  284. s16 nt; //普通降噪量
  285. u8 nt_post; //后滤波降噪量
  286. s16 exp_range;
  287. //u8 fast_convergence_en; //快速收敛功能,对人声有影响,默认不开
  288. //u16 lowside_corr; //下支路相关系数
  289. // u8 trumpet_en; //喇叭声抑制
  290. u8 cmp_tbl_dis;
  291. u8 dm_dnn_en; //是否使能双麦AI算法
  292. u8 noise_ps_rate;
  293. u8 comp_mic_fre; //双麦+AI的参数
  294. u16 comp_mic_fre_L; //传统双麦的参数
  295. u16 comp_mic_fre_H; //传统双麦的参数
  296. u8 prior_opt_idx;
  297. u16 low_fre_ns0_range;
  298. u8 wind_sig_choose;
  299. s16 wind_state_lim;
  300. s16 wind_sup_floor;
  301. u8 wind_sup_open;
  302. u8 wind_a_pow_en;
  303. u8 bf_choose;
  304. u8 tf_en;
  305. //u8 low_bf_lim;
  306. u16 tf_len;
  307. u8 tf_norm_en;
  308. u8 tf_norm_only_en;
  309. s16 exp_range_H;
  310. s16 exp_range_L;
  311. u8 music_lev;
  312. u16 gain_expand;
  313. u8 nn_only;
  314. u16 nn_only_len;
  315. u8 hi_fre_en;
  316. u16 gain_assign;
  317. u8 sin_gain_post_en;
  318. u16 b_frein2_floor;
  319. u16 Gcoh_thr;
  320. u16 Gcoh_sum_thr;
  321. u8 wind_or_en;
  322. u8 v_white_en;
  323. //u8 wind_type;
  324. s16 sin_gain_post_len_f;
  325. u8 enlarge_v;
  326. s16 mask_floor;
  327. u16 mask_floor_hi;
  328. s32 gu_value;
  329. u8 bfrein3_ns;
  330. u16 wind_len_used;
  331. u16 Ftrust;
  332. } ldmdnn_cb_t;
  333. typedef struct {
  334. u8 mode; //auto or manual mode
  335. u8 level; // 降噪量
  336. u8 min_range1; // 噪声谱更新系数
  337. u8 min_range2; // 噪声谱更新系数
  338. u8 min_range3; // 噪声谱更新系数
  339. u8 min_range4; // 噪声谱更新系数
  340. u8 anksnr_en; // 是否使能ank snr
  341. u16 nera_val; // anksnr_en为0时有效,alp1固定值
  342. u32 block_cnt;
  343. } peri_nr_cfg_t;
  344. typedef struct {
  345. u8 agc_en;
  346. u16 sampleHzIn;
  347. u8 bit;
  348. u8 compress_agcDb;
  349. u8 target_agcDbfs;
  350. u8 low_signal_en;
  351. u8 max_gain;
  352. } agc_cb_t;
  353. typedef struct {
  354. u8 nr_type; //近端降噪类型
  355. u8 nr_cfg_en; //远端降噪、喇叭声降噪、500ms淡入等降噪配置
  356. u32 dump_en;
  357. u8 rfu[2];
  358. u8 calling_voice_pow; //用于呼出电话,响铃之前动态降噪
  359. u8 calling_voice_cnt;
  360. u8 calling_voice_temp_cnt;
  361. void *far_nr; //远端降噪算法配置
  362. int dac_dnr_thr;
  363. agc_cb_t agc_cb;
  364. } nr_cb_t;
  365. typedef struct {
  366. u32 type :4;
  367. u32 mode :1; //auto or manual mode
  368. u32 nlp_bypass :1; //aec nlp bypass
  369. u32 nlp_only :1; //aec nlp only select
  370. u32 nlp_level :4;
  371. u32 nlp_part :2;
  372. u32 comforn_level :4;
  373. u32 comforn_floor :10;
  374. u32 comforn_en :1;
  375. u32 xe_add_corr :16;
  376. u32 upbin :8;
  377. u32 lowbin :8;
  378. u32 diverge_th :4;
  379. u32 gamma :16;
  380. u32 aggrfact :16;
  381. u32 depre_mode :1;
  382. u32 mic_ch :1;
  383. u32 dig_gain :24;
  384. u32 echo_th ;
  385. u16 far_offset;
  386. u8 ff_mic_ref_en;
  387. u32 qidx;
  388. } aec_cfg_t;
  389. typedef struct {
  390. u8 alc_en;
  391. u8 rfu[1];
  392. u8 fade_in_step;
  393. u8 fade_out_step;
  394. u8 fade_in_delay;
  395. u8 fade_out_delay;
  396. s32 far_voice_thr;
  397. } alc_cb_t;
  398. typedef struct {
  399. aec_cfg_t aec;
  400. alc_cb_t alc;
  401. nr_cb_t nr;
  402. u8 rfu[3];
  403. u8 mic_eq_en : 1;
  404. u8 mic_drc_en : 1;
  405. int post_gain;
  406. } call_cfg_t;
  407. void bt_call_init(call_cfg_t *p);
  408. void bt_call_exit(void);
  409. bool bt_sco_dnn_en(void);
  410. bool bt_sco_dac_drc_init(u8 *drc_addr, int drc_len);
  411. bool bt_sco_far_cache_write(u8 *inbuf, u32 wlen);
  412. bool bt_sco_far_cache_read(u8 *outbuf, u32 rlen);
  413. void bt_sco_far_cache_init(void);
  414. void bt_ldmdnn_init(void *alg_cb);
  415. void bt_ldmdnn_exit(void);
  416. void bt_dmns_init(void *alg_cb);
  417. void bt_dmns_exit(void);
  418. void bt_dnn_init(void *alg_cb);
  419. void bt_dnn_exit(void);
  420. void bt_dnn_pro_init(void *alg_cb);
  421. void bt_dnn_pro_exit(void);
  422. void bt_aiaec_dnn_init(void *alg_cb);
  423. void bt_aiaec_dnn_exit(void);
  424. void bt_sndp_sm_init(void *alg_cb);
  425. void bt_sndp_sm_exit(void);
  426. void bt_ains_init(void *alg_cb);
  427. void bt_ains_exit(void);
  428. void bt_sndp_fbdm_init(void *alg_cb);
  429. void bt_sndp_fbdm_exit(void);
  430. void bt_sndp_dm_init(void *alg_cb);
  431. void bt_sndp_dm_exit(void);
  432. void bt_agc_init(void);
  433. void bt_sco_agc_proc(s16 *buf);
  434. void trumpet_denoise_init(u8 level);
  435. void trumpet_denoise(int *fft_in);
  436. void nr_init(u16 nt);
  437. void nr_process(s16 *data); //data:64个点
  438. u32 nr_gain_radio_convert(u8 dB);
  439. void bt_peri_nr_init(void);
  440. void bt_peri_nr_exit(void);
  441. bool bt_peri_nr_wait_done(void);
  442. void bt_sco_far_nr_int(void *cfg);
  443. void bt_sco_far_peri_nr_process(s16 *ptr, u16 samples);
  444. void peri_nr_isr(void);
  445. void wnr_init(void);
  446. void wnr_detect(s32 *p);
  447. void wnr_process(s32 *re, s32 *im);
  448. void aec_nlms_process(u8 mic_sel);
  449. void aec_nlp_process(void);
  450. void aec_far_process(void);
  451. void aec_init(void);
  452. bool aec_isr(void);
  453. void aec_exit(void);
  454. void alc_init(void);
  455. bool alc_isr(void);
  456. void alc_exit(void);
  457. #endif