xref: /OK3568_Linux_fs/external/common_algorithm/audio/rkaudio_algorithms/include/rkaudio_sed.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* Copyright (C)  RK
2 Written by Ryne
3 Date : 20221214  v1.2.1*/
4 
5 
6 #ifndef RKAUDIO_SED_H
7 #define RKAUDIO_SED_H
8 
9 #include <stdlib.h>
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #define JUMP_FRAME 20
16 
17 	typedef struct RKSEDAGCParam_
18 	{
19 		/* 新版AGC参数 */
20 		float              attack_time;  /* 触发时间,即AGC增益下降所需要的时间 */
21 		float			   release_time; /* 施放时间,即AGC增益上升所需要的时间 */
22 		float              max_gain; /* 最大增益,同时也是线性段增益,单位:dB */
23 		float 			   max_peak; /* 经AGC处理后,输出语音的最大能量,范围:单位:dB */
24 		float              fRth0;    /* 扩张段结束能量dB阈值,同时也是线性段开始阈值 */
25 		float              fRk0;     /* 扩张段斜率 */
26 		float              fRth1;    /* 压缩段起始能量dB阈值,同时也是线性段结束阈值 */
27 		/* 无效参数 */
28 		int            fs;                       /* 数据采样率 */
29 		int            frmlen;                   /* 处理帧长 */
30 		float          attenuate_time; /* 噪声衰减时间,即噪声段增益衰减到1所需的时间 */
31 		float          fRth2;                     /* 压缩段起始能量dB阈值 */
32 		float          fRk1;                      /* 扩张段斜率 */
33 		float          fRk2;                      /* 扩张段斜率 */
34 		float          fLineGainDb;               /* 线性段提升dB数 */
35 		int            swSmL0;                    /* 扩张段时域平滑点数 */
36 		int            swSmL1;                    /* 线性段时域平滑点数 */
37 		int            swSmL2;                    /* 压缩段时域平滑点数 */
38 	} RKSEDAGCParam;
39 
rkaudio_sedagc_param_init()40 	inline static RKSEDAGCParam* rkaudio_sedagc_param_init()
41 	{
42 		RKSEDAGCParam* param = (RKSEDAGCParam*)malloc(sizeof(RKSEDAGCParam));
43 		/* 新版AGC参数 */
44 		param->attack_time = 100.0;		/* 触发时间,即AGC增益上升所需要的时间 */
45 		param->release_time = 200.0;	/* 施放时间,即AGC增益下降所需要的时间 */
46 		param->max_gain = 15.0;		/* 最大增益,同时也是线性段增益,单位:dB */
47 		param->max_peak = -3.0;			/* 经AGC处理后,输出语音的最大能量,范围:单位:dB */
48 		param->fRk0 = 2;				/* 扩张段斜率 */
49 		param->fRth2 = -25;				/* 压缩段起始能量dB阈值,同时也是线性段结束阈值,注意 fRth2 + max_gain < max_peak */
50 		param->fRth1 = -45;				/* 扩张段结束能量dB阈值,同时也是线性段开始阈值 */
51 		param->fRth0 = -70;				/* 噪声门阈值 */
52 		/* 无效参数 */
53 		param->fs = 16000;                       /* 数据采样率 */
54 		param->frmlen = 256;                   /* 处理帧长 */
55 		param->attenuate_time = 1000; /* 噪声衰减时间,即噪声段增益衰减到1所需的时间 */
56 		param->fRk1 = 0.8;                      /* 扩张段斜率 */
57 		param->fRk2 = 0.4;                      /* 扩张段斜率 */
58 		param->fLineGainDb = -25.0f;               /* 低于该值,起始的attenuate_time(ms)内不做增益 */
59 		param->swSmL0 = 40;                    /* 扩张段时域平滑点数 */
60 		param->swSmL1 = 80;                    /* 线性段时域平滑点数 */
61 		param->swSmL2 = 80;                    /* 压缩段时域平滑点数 */
62 		return param;
63 	}
64 
65 	typedef struct SedAedParam_
66 	{
67 		float	snr_db; 	 // 信噪比大于snr输出1,单位为db
68 		float	lsd_db; 	 // 响度大于db值输出1, 最高为0db
69 		int 	policy; 	 // vad灵敏度,0—>2, 灵敏度等级提升。默认为1.
70 	} SedAedParam;
71 
72 	// 声音事件检测
73 	typedef struct SedParam_
74 	{
75 		int 	frm_len;		 // 统计帧长  建议长度:110-150
76 		int    nclass;          // 类别数目
77 		int    babycry_decision_len;     // 哭声确认帧长
78 		int    buzzer_decision_len;     //蜂鸣器确认帧长
79 		int    glassbreaking_decision_len;  //玻璃破碎声确认帧长
80 	} SedParam;
81 
82 	typedef struct RKAudioSedRes_
83 	{
84 		int snr_res;
85 		int lsd_res;
86 		int bcd_res;
87 		int buz_res;
88 		int gbs_res;
89 	} RKAudioSedRes;
90 
91 	typedef enum RKAudioSedEnable_
92 	{
93 		EN_AGC = 1 << 0,
94 		EN_AED = 1 << 1,
95 		EN_SED = 1 << 2,
96 	} RKAudioSedEnable;
97 
98 	typedef struct RKAudioSedParam_
99 	{
100 		int 	      model_en;
101 		RKSEDAGCParam* agc_param;
102 		SedAedParam	 *aed_param;
103 		SedParam* sed_param;
104 	} RKAudioSedParam;
105 
rkaudio_sed_param_aed()106 	static SedAedParam *rkaudio_sed_param_aed()
107 	{
108 		SedAedParam* param = (SedAedParam *)calloc(sizeof(SedAedParam), 1);
109 		param->snr_db	 = 10;
110 		param->lsd_db	 = -35;
111 		param->policy	 = 1;
112 		return param;
113 	}
114 
rkaudio_sed_param()115 	static SedParam* rkaudio_sed_param()
116 	{
117 		SedParam* param = (SedParam*)malloc(sizeof(SedParam));
118 		param->frm_len = 125;
119 		param->nclass = 3;
120 		param->babycry_decision_len = 100;
121 		param->buzzer_decision_len = 100;
122 		param->glassbreaking_decision_len = 30;
123 		return param;
124 	}
125 
rkaudio_sed_param_init()126 	inline static RKAudioSedParam *rkaudio_sed_param_init()
127 	{
128 		RKAudioSedParam *param = (RKAudioSedParam *)calloc(sizeof(RKAudioSedParam), 1);
129 
130 		param->model_en  = EN_AGC | EN_AED |  EN_SED ;
131 		param->agc_param = rkaudio_sedagc_param_init();
132 		param->aed_param = rkaudio_sed_param_aed();
133 		param->sed_param = rkaudio_sed_param();
134 		return param;
135 	}
136 
rkaudio_sed_param_destroy(RKAudioSedParam * param)137 	inline static void rkaudio_sed_param_destroy(RKAudioSedParam *param)
138 	{
139 		if (param == NULL)
140 			return;
141 		if (param->agc_param)
142 		{
143 			free(param->agc_param);
144 			param->agc_param = NULL;
145 		}
146 		if (param->aed_param)
147 		{
148 			free(param->aed_param);
149 			param->aed_param = NULL;
150 		}
151 		if (param->sed_param)
152 		{
153 			free(param->sed_param);
154 			param->sed_param = NULL;
155 		}
156 		free(param);
157 	}
158 
159 	void *rkaudio_sed_init(int fs, int bit, int chan, RKAudioSedParam *param);
160 	char rkaudio_sed_init_res(void* st_);
161 	void rkaudio_sed_destroy(void *st_);
162 	int rkaudio_sed_process(void *st_, short *in, int in_size, RKAudioSedRes *res);
163 	float rkaudio_sed_lsd_db(void *st_);
164 
165 #ifdef __cplusplus
166 }
167 #endif
168 
169 /** @}*/
170 #endif
171