// 参见fft4g.c文件以获取文档。
/*
这个函数是执行实数离散傅立叶变换(RDFT)的快速算法。
- 参数n:变换的点数。
- 参数isgn:变换的方向,1代表正向变换,-1代表逆向变换。
- 参数a:输入/输出数组,根据isgn的值,输入实数序列或输出序列。
- 参数ip:工作区数组。
- 参数w:余弦/正弦表。
*/
void WebRtc_rdft(size_t n, int isgn, float *a, size_t *ip, float *w);
/****************************************************************************
* WebRtcNs_InitCore(...)
*
* 该函数用于初始化一个噪声抑制实例。
*
* 输入:
* - self : 需要初始化的实例。
* - fs : 采样频率。
*
* 输出:
* - self : 已初始化的实例。
*
* 返回值 : 0 - 成功
* -1 - 出错
*/
int WebRtcNs_InitCore(NoiseSuppressionC *self, uint32_t fs);
/****************************************************************************
* WebRtcNs_set_policy_core(...)
*
* 该函数用于改变噪声抑制方法的攻击性。
*
* 输入:
* - self : 需要设置策略的实例。
* - mode : 0: 轻度 (6dB), 1: 中等 (10dB), 2: 强力 (15dB)
*
* 输出:
* - self : 设置策略后的实例。
*
* 返回值 : 0 - 成功
* -1 - 出错
*/
int WebRtcNs_set_policy_core(NoiseSuppressionC *self, int mode);
/****************************************************************************
* WebRtcNs_AnalyzeCore
*
* 估计背景噪声。
*
* 输入:
* - self : 需要分析的实例。
* - speechFrame : 低频带的输入语音帧。
*
* 输出:
* - self : 更新后的实例。
*/
void WebRtcNs_AnalyzeCore(NoiseSuppressionC *self, const int16_t *speechFrame);
/*
这个函数用于分析和估计给定语音帧的背景噪声。
- 参数self:操作的噪声抑制实例。
- 参数speechFrame:需要分析的语音帧,通常为低频带数据。
*/
/****************************************************************************
* WebRtcNs_ProcessCore
*
* 执行噪声抑制。
*
* 输入:
* - self : 应该被初始化的实例
* - inFrame : 每个频带的输入语音帧
* - num_bands : 频带数量
*
* 输出:
* - self : 更新后的实例
* - outFrame : 每个频带的输出语音帧
*/
void WebRtcNs_ProcessCore(NoiseSuppressionC *self,
const int16_t *const *inFrame,
size_t num_bands,
int16_t *const *outFrame);
/*
* 这个函数创建一个浮点噪声抑制的实例。
*/
NsHandle *WebRtcNs_Create();
/*
* 这个函数释放指定噪声抑制实例的动态内存。
*
* 输入:
* - NS_inst : 应该被释放的NS实例的指针
*/
void WebRtcNs_Free(NsHandle *NS_inst);
/*
* 这个函数初始化一个NS实例,在进行任何其他处理之前必须被调用。
*
* 输入:
* - NS_inst : 应该被初始化的实例
* - fs : 采样频率
*
* 输出:
* - NS_inst : 初始化后的实例
*
* 返回值 : 0 - 正常
* -1 - 错误
*/
int WebRtcNs_Init(NsHandle *NS_inst, uint32_t fs);
/*
* 改变噪声抑制方法的攻击性。
*
* 输入:
* - NS_inst : 噪声抑制实例。
* - mode : 0: 温和, 1: 中等, 2: 强力
*
* 输出:
* - NS_inst : 更新后的实例。
*
* 返回值 : 0 - 正常
* -1 - 错误
*/
int WebRtcNs_set_policy(NsHandle *NS_inst, int mode);
/*
* 这个函数估计插入的语音帧的背景噪声。
* 输入和输出信号应始终为10ms(80或160个样本)。
*
* 输入:
* - NS_inst : 噪声抑制实例。
* - spframe : 指向L频带的语音帧缓冲区的指针
*
* 输出:
* - NS_inst : 更新后的NS实例
*/
void WebRtcNs_Analyze(NsHandle *NS_inst, const int16_t *spframe);
/*
* 这个函数对插入的语音帧进行噪声抑制。
* 输入和输出信号应始终为10ms(80或160个样本)。
*
* 输入:
* - NS_inst : 噪声抑制实例。
* - spframe : 指向每个频带的语音帧缓冲区的指针
* - num_bands : 频带数量
*
* 输出:
* - NS_inst : 更新后的NS实例
* - outframe : 指向每个频带的输出帧的指针
*/
void WebRtcNs_Process(NsHandle *NS_inst,
const int16_t *const *spframe,
size_t num_bands,
int16_t *const *outframe);
/* 返回当前帧使用的内部先前语音概率。
* 也有一个基于频率bin的,不应与之混淆。
*
* 输入:
* - handle : 噪声抑制实例。
*
* 返回值 : 先前语音概率在[0.0, 1.0]区间。
* -1 - 空指针或未初始化的实例。
*/
float WebRtcNs_prior_speech_probability(NsHandle *handle);
/*
* 这个函数改变噪声抑制方法的攻击性。
*
* 输入:
* - NS_inst : 噪声抑制实例。
* - mode : 0: 温和,1: 中等,2: 激进
*
* 输出:
* - NS_inst : 更新后的实例。
*
* 返回值 : 0 - 成功
* -1 - 错误
*/
int WebRtcNs_set_policy(NsHandle *NS_inst, int mode);
/*
* 此函数估计插入的语音帧的背景噪声。输入和输出信号应始终为10ms(80或160个样本)。
*
* 输入
* - NS_inst : 噪声抑制实例。
* - spframe : 指向L频带语音帧缓冲区的指针
*
* 输出:
* - NS_inst : 更新后的NS实例
*/
void WebRtcNs_Analyze(NsHandle *NS_inst, const int16_t *spframe);
/*
* 此函数对插入的语音帧进行噪声抑制。输入和输出信号应始终为10ms(80或160个样本)。
*
* 输入
* - NS_inst : 噪声抑制实例。
* - spframe : 指向每个频带语音帧缓冲区的指针
* - num_bands : 频带数量
*
* 输出:
* - NS_inst : 更新后的NS实例
* - outframe : 指向每个频带输出帧的指针
*/
void WebRtcNs_Process(NsHandle *NS_inst,
const int16_t *const *spframe,
size_t num_bands,
int16_t *const *outframe);
/* 返回当前帧的内部使用的先前语音概率。这个是基于频率的,不应与其他的混淆。
*
* 输入
* - handle : 噪声抑制实例。
*
* 返回值 : 先前语音概率在[0.0, 1.0]区间内的值。
* -1 - 空指针或未初始化的实例。
*/
float WebRtcNs_prior_speech_probability(NsHandle *handle);
/* 返回指向每个频率bin噪声估计的指针。使用WebRtcNs_num_freq()可以提供频率bins的数量。
*
* 输入
* - handle : 噪声抑制实例。
*
* 返回值 : 指向每个频率bin噪声估计的指针。
* 如果输入是一个空指针或未初始化的实例,则返回NULL。
*/
const float *WebRtcNs_noise_estimate(const NsHandle *handle);
/* 返回频率bins的数量,这是噪声估计的长度,例如。
*
* 返回值 : 频率bins的数量。
*/
size_t WebRtcNs_num_freq();
以下是函数调用的典型流程:
创建和初始化实例:
NsHandle *ns_inst = WebRtcNs_Create();
WebRtcNs_Init(ns_inst, fs);
WebRtcNs_set_policy(ns_inst, mode);
分析和处理语音帧:
WebRtcNs_Analyze(ns_inst, spframe);
WebRtcNs_Process(ns_inst, spframe, num_bands, outframe);
获取结果:
float prior_prob = WebRtcNs_prior_speech_probability(ns_inst);
const float *noise_est = WebRtcNs_noise_estimate(ns_inst);
size_t num_freq = WebRtcNs_num_freq();
释放资源:
WebRtcNs_Free(ns_inst);
在内部,核心函数(如WebRtcNs_InitCore、WebRtcNs_set_policy_core、WebRtcNs_AnalyzeCore和WebRtcNs_ProcessCore)可以在WebRtcNs_Init、WebRtcNs_set_policy、WebRtcNs_Analyze和WebRtcNs_Process中被调用,以实现具体的噪声抑制逻辑。同时,FFT变换(WebRtc_rdft)在分析和处理过程中可能会被使用。