java vad_(转载)静音检测VAD算法

转:https://segmentfault.com/a/1190000015432946

最近把opus编码器里的VAD算法提取了出来,之前在网上没找到合适的开源VAD模块,就把代码放在这里吧,希望能帮助到人。

下面是.h文件和.cpp文件,使用的时候,需要调用silk_VAD_Get()这个函数,每次输入一个帧(我默认了帧长是20ms,采样率16khz,可以自己在silk_VAD_Get里修改),返回0或者1,代表该帧是否为静音帧。

.h文件代码:

#include

#include

#include

#include

int silk_VAD_Get(

//int state, /* Encoder state */

const short pIn[] /* I PCM input */

);

#define TYPE_NO_VOICE_ACTIVITY 0

#define TYPE_UNVOICED 1

#define TYPE_VOICED 2

#define SPEECH_ACTIVITY_DTX_THRES 0.05f

#define SILK_FIX_CONST( C, Q ) ((int)((C) * ((long)1 << (Q)) + 0.5))

#define silk_int16_MAX 0x7FFF /* 2^15 - 1 = 32767 */

#define silk_int16_MIN ((short)0x8000) /* -2^15 = -32768 */

#define silk_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647 */

#define silk_int32_MIN ((int)0x80000000) /* -2^31 = -2147483648 */

#define silk_memset(dest, src, size) memset((dest), (src), (size))

#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */

#define VAD_NOISE_LEVELS_BIAS 50

/* Sigmoid settings */

#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */

#define VAD_SNR_FACTOR_Q16 45000

/* smoothing for SNR measurement */

#define VAD_SNR_SMOOTH_COEF_Q18 4096

#define VAD_N_BANDS 4

#define VAD_INTERNAL_SUBFRAMES_LOG2 2

#define VAD_INTERNAL_SUBFRAMES ( 1 << VAD_INTERNAL_SUBFRAMES_LOG2 )

#define silk_uint8_MAX 0xFF /* 2^8 - 1 = 255 */

#define VARDECL(type, var) type *var

#define silk_RSHIFT32(a, shift) ((a)>>(shift))

#define silk_RSHIFT(a, shift) ((a)>>(shift))

#define silk_LSHIFT32(a, shift) ((a)<

#define silk_LSHIFT(a, shift) ((a)<

#define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size)))

#define silk_ADD16(a, b) ((a) + (b))

#define silk_ADD32(a, b) ((a) + (b))

#define silk_ADD64(a, b) ((a) + (b))

#define silk_SUB16(a, b) ((a) - (b))

#define silk_SUB32(a, b) ((a) - (b))

#define silk_SUB64(a, b) ((a) - (b))

#define silk_SMULWB(a32, b32) ((((a32) >> 16) * (int)((short)(b32))) + ((((a32) & 0x0000FFFF) * (int)((short)(b32))) >> 16))

#define silk_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (int)((short)(c32))) + ((((b32) & 0x0000FFFF) * (int)((short)(c32))) >> 16)))

#define silk_SAT16(a) ((a) > silk_int16_MAX ? silk_int16_MAX : \

((a) < silk_int16_MIN ? silk_int16_MIN : (a)))

#define silk_MLA(a32, b32, c32) silk_ADD32((a32),((b32) * (c32)))

#define silk_SMLABB(a32, b32, c32) ((a32) + ((int)((short)(b32))) * (int)((short)(c32)))

#define silk_ADD_POS_SAT32(a, b) ((((unsigned int)(a)+(unsigned int)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b)))

#define silk_ADD_POS_SAT32(a, b) ((((unsigned int)(a)+(unsigned int)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b)))

#define silk_DIV32_16(a32, b16) ((int)((a32) / (b16)))

#define silk_DIV32(a32, b32) ((int)((a32) / (b32)))

#define silk_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)

#define silk_SMULWW(a32, b32) silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16))

#define silk_min(a, b) (((a) < (b)) ? (a) : (b))

#define silk_max(a, b) (((a) > (b)) ? (a) : (b))

#define silk_ADD_LSHIFT32(a, b, shift) silk_ADD32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */

#define silk_MUL(a32, b32) ((a32) * (b32))

#define silk_SMULBB(a32, b32) ((int)((short)(a32)) * (int)((short)(b32)))

#define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \

: ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))

#define silk_LSHIFT_SAT32(a, shift) (silk_LSHIFT32( silk_LIMIT( (a), silk_RSHIFT32( silk_int32_MIN,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值