WebRTC_ANS——noise_suppression.h基础讲解(2)

	// 参见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)在分析和处理过程中可能会被使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值