依托mediastreamer2的噪声门处理,代码已验证可执行,需要先对结构体初始化,执行process,最终释放malloc。
噪声门(Gate)原理:根据设定噪声门阈值取决是否开启,低于噪声门阈值置0即直接静音,高于噪声门阈值的数据不做处理。
typedef struct _DynamicRangeControlState{
int16_t *data;
int sample_rate;
int framesize;
double gate_threshold;
}DRCState;
static void DynamicRangeControl_init(DRCState *s){
s->sample_rate = SAMPLE_RATE; //设定采样率
s->framesize = TIME_PER_ROUND * (s->sample_rate/1000); //设定每轮执行时长(ms)
s->data = (int16_t *)malloc(s->framesize*sizeof(int16_t));
s->gate_threshold = -60;
}
static void DynamicRangeControl_uninit(DRCState *s){
free(s->data);
}
static double RMS_calculate_DB(int16_t* data, int len) {
double sum = 0.0;
for (int i = 0; i < len; i++) {
double sample = data[i] / 32768.0;
sum += sample * sample;
}
double rms = sqrt(sum / len);
if(rms!=0){
double db = 20 * log10(rms);
return db;
}else{
return 0;
}
}
static void NoiseGate_process(DRCState *s) {
s->db=RMS_calculate_DB(s->data,s->framesize);
if (s->db < s->gate_threshold) {
for (int i = 0; i < s->framesize; i++) {
s->data[i] = 0.0;
}
}
}