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

头文件宏定义

#define BLOCKL_MAX          160 // 最大处理块长度:160
#define ANAL_BLOCKL_MAX     256 // 最大分析块长度:256
#define HALF_ANAL_BLOCKL    129 // 半最大分析块长度加1
#define NUM_HIGH_BANDS_MAX  2   // 最大高频带数量:2

#define QUANTILE            (float)0.25 // 分位数,用于某些统计计算

#define SIMULT              3 // 同时处理的帧数
#define END_STARTUP_LONG    200 // 长启动结束阶段的帧数
#define END_STARTUP_SHORT   50  // 短启动结束阶段的帧数
#define FACTOR              (float)40.0 // 在某些公式中使用的乘数因子
#define WIDTH               (float)0.01 // 在某些概率映射中使用的宽度参数

 // FFT工作数组的长度。
#define IP_LENGTH (ANAL_BLOCKL_MAX >> 1) // 必须至少为ceil(2 + sqrt(ANAL_BLOCKL_MAX/2))
#define W_LENGTH (ANAL_BLOCKL_MAX >> 1) // W数组的长度

// 新方法的参数
#define DD_PR_SNR           (float)0.98 // 先验信噪比的DD更新
#define LRT_TAVG            (float)0.50 // LRT的tavg参数,之前是0.90
#define SPECT_FL_TAVG       (float)0.30 // 频谱平坦度测量的tavg参数
#define SPECT_DIFF_TAVG     (float)0.30 // 频谱差分测量的tavg参数
#define PRIOR_UPDATE        (float)0.10 // 先验模型的更新参数
#define NOISE_UPDATE        (float)0.90 // 噪声的更新参数
#define SPEECH_UPDATE       (float)0.99 // 可能为语音时的更新参数
#define WIDTH_PR_MAP        (float)4.0  // 先验模型中sigmoid映射的宽度参数
#define LRT_FEATURE_THR     (float)0.5  // LRT特征的默认阈值
#define SF_FEATURE_THR      (float)0.5  // 频谱平坦度特征的默认阈值
#define PROB_RANGE          (float)0.20 // 噪声状态在语音/噪声可能性中的概率阈值
#define HIST_PAR_EST         1000       // 参数估计的直方图大小
#define GAMMA_PAUSE         (float)0.05 // 保守噪声估计的更新
//
#define B_LIM               (float)0.5  // 最终能量增益因子计算中的阈值

NSParaExtract结构体

	typedef struct NSParaExtract_ {
		// 直方图的箱体大小。
		float binSizeLrt;                // LRT(长时平均谱能比)的箱体大小。
		float binSizeSpecFlat;           // 频谱平坦度的箱体大小。
		float binSizeSpecDiff;           // 频谱差异的箱体大小。

		// 计算LRT阈值的直方图范围。
		float rangeAvgHistLrt;           // LRT的直方图平均范围。

		// 缩放参数:将直方图的主要峰值乘以缩放因子,以获得先验模型的阈值。
		float factor1ModelPars;          // 用于LRT和频谱差异。
		float factor2ModelPars;          // 用于频谱平坦度:当噪声比语音更平坦时使用。

		// 频谱平坦度的峰值限制(变化范围在0到1之间)。
		float thresPosSpecFlat;          // 频谱平坦度的阈值限制。

		// 直方图中两个最高峰的间距限制:间距由箱体大小决定。
		float limitPeakSpacingSpecFlat;  // 频谱平坦度的峰间距限制。
		float limitPeakSpacingSpecDiff;  // 频谱差异的峰间距限制。

		// 第二峰重要性的限制。
		float limitPeakWeightsSpecFlat;  // 频谱平坦度的峰权重限制。
		float limitPeakWeightsSpecDiff;  // 频谱差异的峰权重限制。

		// LRT特征波动的限制。
		float thresFluctLrt;             // LRT波动的阈值。

		// 特征阈值的最大值和最小值限制。
		float maxLrt;                    // LRT的最大阈值。
		float minLrt;                    // LRT的最小阈值。
		float maxSpecFlat;               // 频谱平坦度的最大阈值。
		float minSpecFlat;               // 频谱平坦度的最小阈值。
		float maxSpecDiff;               // 频谱差异的最大阈值。
		float minSpecDiff;               // 频谱差异的最小阈值。

		// 接受/拒绝特征的直方图峰值权重标准。
		int thresWeightSpecFlat;         // 频谱平坦度特征的权重阈值。
		int thresWeightSpecDiff;         // 频谱差异特征的权重阈值。

	} NSParaExtract;

直方图的作用
直方图是一种用于表示数据分布的图形。在ANS中,直方图被用来分析和计算音频信号的各种特征,如长时平均谱能比(LRT)、频谱平坦度和频谱差异。通过直方图,可以确定这些特征在不同情况下的分布,从而帮助设定阈值,以区分语音信号和噪声信号。

LRT(长时平均谱能比)
LRT(Long-term Spectral Energy Ratio)是用来比较语音信号与背景噪声的一种特征。它表示在较长时间窗口内,语音信号的能量与噪声信号的能量之比。LRT越高,说明语音信号的能量越大,反之则说明噪声信号的能量较大。

LRT阈值(rangeAvgHistLrt 和 thresFluctLrt)
rangeAvgHistLrt:这是用于计算LRT直方图平均值的范围。通过这个范围,可以确定LRT值在不同情况下的分布。
thresFluctLrt:这是LRT波动的阈值,用于限制LRT特征的波动性。过大的波动可能会影响到语音信号与噪声信号的区分效果。

频谱平坦度(Spectral Flatness)
频谱平坦度是用来衡量信号在频谱上的平滑程度。对于噪声信号,频谱通常比较平滑,而语音信号则会在特定频率上有较高的能量峰值。因此,通过频谱平坦度,可以帮助区分语音和噪声信号。

频谱平坦度阈值(thresPosSpecFlat)
thresPosSpecFlat:这是频谱平坦度的阈值限制,用于确定频谱平坦度的变化范围(0到1之间)。通过设置这个阈值,可以更好地区分语音信号和平坦的噪声信号。

频谱差异(Spectral Difference)
频谱差异是用来衡量信号在不同时间帧之间的频谱变化程度。语音信号的频谱变化通常较大,而噪声信号的频谱变化较小。通过频谱差异,可以进一步区分语音和噪声信号。

缩放参数(factor1ModelPars 和 factor2ModelPars)
factor1ModelPars:这是用于LRT和频谱差异的缩放因子。通过将直方图的主要峰值乘以缩放因子,可以获得更准确的先验模型阈值。
factor2ModelPars:这是用于频谱平坦度的缩放因子,特别是当噪声信号比语音信号更平坦时使用。

峰间距和权重限制(limitPeakSpacing 和 limitPeakWeights)
limitPeakSpacingSpecFlat 和 limitPeakSpacingSpecDiff:这是频谱平坦度和频谱差异的峰间距限制。通过限制两个最高峰的间距,可以避免误判。
limitPeakWeightsSpecFlat 和 limitPeakWeightsSpecDiff:这是频谱平坦度和频谱差异的峰权重限制,用于衡量第二峰的重要性。

特征阈值(maxLrt, minLrt, maxSpecFlat, minSpecFlat, maxSpecDiff, minSpecDiff)
这些参数定义了各个特征(LRT、频谱平坦度、频谱差异)的最大和最小阈值限制。通过设置这些限制,可以确保在不同噪声环境下,特征值的计算和应用都在合理范围内。

直方图峰值权重标准(thresWeightSpecFlat 和 thresWeightSpecDiff)
thresWeightSpecFlat 和 thresWeightSpecDiff:这是频谱平坦度和频谱差异特征的权重阈值,用于接受或拒绝特征。通过设置这个阈值,可以确定哪些特征是有效的,从而更好地进行噪声抑制。
总结
NSParaExtract结构体中的参数用于自适应噪声抑制算法,通过对音频信号的LRT、频谱平坦度和频谱差异等特征进行分析和计算,设定适当的阈值和限制,从而实现更有效的噪声抑制。这些参数帮助区分语音信号和噪声信号,确保在不同环境下都能获得良好的语音质量。

NoiseSuppressionC

	typedef struct NoiseSuppressionC_ {
		uint32_t fs; // 采样率
		size_t blockLen; // 处理块的长度
		size_t windShift; // 窗口移动的长度
		size_t anaLen; // 分析长度
		size_t magnLen; // 幅度长度
		float normMagnLen; // 幅度长度的归一化值
		int aggrMode; // 聚合模式
		const float *window; // 窗函数
		float analyzeBuf[ANAL_BLOCKL_MAX]; // 分析缓冲区
		float dataBuf[ANAL_BLOCKL_MAX]; // 数据缓冲区
		float syntBuf[ANAL_BLOCKL_MAX]; // 合成缓冲区

		int initFlag; // 初始化标志
		// 用于量化噪声估计的参数
		float density[SIMULT * HALF_ANAL_BLOCKL]; // 密度
		float lquantile[SIMULT * HALF_ANAL_BLOCKL]; // 低分位数
		float quantile[HALF_ANAL_BLOCKL]; // 分位数
		int counter[SIMULT]; // 计数器
		int updates; // 更新次数
		// 维纳滤波器的参数
		float smooth[HALF_ANAL_BLOCKL]; // 平滑参数
		float log_lut[HALF_ANAL_BLOCKL]; // 对数查找表
		float log_lut_sqr[HALF_ANAL_BLOCKL]; // 对数查找表的平方
		float overdrive; // 过驱动参数
		float denoiseBound; // 降噪界限
		int gainmap; // 增益映射
		// FFT工作数组
		size_t ip[IP_LENGTH]; // FFT工作数组ip
		float wfft[W_LENGTH]; // FFT工作数组wfft

		// 新方法的参数:一些不需要的参数将会被减少/清理
		int32_t blockInd; // 帧索引计数器
		int modelUpdatePars[4]; // 更新或估计的参数
		// 先验模型的阈值/权重
		float priorModelPars[7]; // 先验模型的参数
		float noise[HALF_ANAL_BLOCKL]; // 当前帧的噪声谱
		float noisePrev[HALF_ANAL_BLOCKL]; // 前一帧的噪声谱
		// 前一分析帧的幅度谱
		float magnPrevAnalyze[HALF_ANAL_BLOCKL];
		// 前一处理帧的幅度谱
		float magnPrevProcess[HALF_ANAL_BLOCKL];
		float logLrtTimeAvg[HALF_ANAL_BLOCKL]; // 带时间平滑的对数LRT因子
		float priorSpeechProb; // 语音/噪声的先验概率
		float featureData[7]; // 特征数据
		// 保守的噪声谱估计
		float magnAvgPause[HALF_ANAL_BLOCKL];
		float signalEnergy; // |幅度|的能量
		float sumMagn; // 幅度之和
		float whiteNoiseLevel; // 初始噪声估计
		float initMagnEst[HALF_ANAL_BLOCKL]; // 初始幅度谱估计
		float pinkNoiseNumerator; // 粉红噪声参数:分子
		float pinkNoiseExp; // 粉红噪声参数:频率的幂
		float parametricNoise[HALF_ANAL_BLOCKL]; // 参数化噪声
		// 特征提取的参数
		NSParaExtract featureExtractionParams; // 特征提取参数
		// 参数估计的直方图
		int histLrt[HIST_PAR_EST]; // LRT的直方图
		int histSpecFlat[HIST_PAR_EST]; // 频谱平坦度的直方图
		int histSpecDiff[HIST_PAR_EST]; // 频谱差异的直方图
		// 高频带估计的量
		float speechProb[HALF_ANAL_BLOCKL]; // 最终的语音/噪声概率:先验 + LRT
		// 高频带数据缓冲
		float dataBufHB[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX]; // 高频带数据缓冲区

	} NoiseSuppressionC;

基础参数
uint32_t fs:采样率,表示每秒钟处理的样本数。
size_t blockLen:处理块的长度,表示每次处理的音频数据的样本数。
size_t windShift:窗口移动的长度,表示每次处理时窗口移动的样本数。
size_t anaLen:分析长度,用于分析的样本数。
size_t magnLen:幅度长度,用于计算频谱幅度的样本数。
float normMagnLen:幅度长度的归一化值,用于归一化处理的幅度值。
int aggrMode:聚合模式,表示噪声抑制的强度或模式。
*const float window:窗函数,用于分析和处理时对信号应用的窗函数。

缓冲区
float analyzeBuf[ANAL_BLOCKL_MAX]:分析缓冲区,用于存储待分析的音频数据。
float dataBuf[ANAL_BLOCKL_MAX]:数据缓冲区,用于存储处理中的音频数据。
float syntBuf[ANAL_BLOCKL_MAX]:合成缓冲区,用于存储处理后的音频数据。

初始化和噪声估计参数
int initFlag:初始化标志,表示结构体是否已初始化。
float density[SIMULT * HALF_ANAL_BLOCKL]:密度,用于量化噪声估计的参数。
float lquantile[SIMULT * HALF_ANAL_BLOCKL]:低分位数,用于噪声估计的低分位数。
float quantile[HALF_ANAL_BLOCKL]:分位数,用于噪声估计的分位数。
int counter[SIMULT]:计数器,用于噪声估计更新的计数。
int updates:更新次数,表示噪声估计更新的次数。

维纳滤波器参数
float smooth[HALF_ANAL_BLOCKL]:平滑参数,用于对噪声谱进行平滑处理。
float log_lut[HALF_ANAL_BLOCKL]:对数查找表,用于快速计算对数值。
float log_lut_sqr[HALF_ANAL_BLOCKL]:对数查找表的平方,用于快速计算对数平方值。
float overdrive:过驱动参数,用于控制滤波器的过驱动程度。
float denoiseBound:降噪界限,用于限制降噪程度。
int gainmap:增益映射,用于控制滤波器的增益。

FFT工作数组
size_t ip[IP_LENGTH]:FFT工作数组ip,用于存储FFT算法的临时变量。
float wfft[W_LENGTH]:FFT工作数组wfft,用于存储FFT算法的临时变量。

新方法的参数
int32_t blockInd:帧索引计数器,用于记录当前处理的帧索引。
int modelUpdatePars[4]:更新或估计的参数,用于控制模型更新的参数。
float priorModelPars[7]:先验模型的参数,用于噪声估计的先验模型参数。
float noise[HALF_ANAL_BLOCKL]:当前帧的噪声谱,用于存储当前帧的噪声谱。
float noisePrev[HALF_ANAL_BLOCKL]:前一帧的噪声谱,用于存储前一帧的噪声谱。

前一分析帧和处理帧的幅度谱
float magnPrevAnalyze[HALF_ANAL_BLOCKL]:前一分析帧的幅度谱,用于存储前一分析帧的幅度谱。
float magnPrevProcess[HALF_ANAL_BLOCKL]:前一处理帧的幅度谱,用于存储前一处理帧的幅度谱。

对数LRT因子和先验概率
float logLrtTimeAvg[HALF_ANAL_BLOCKL]:带时间平滑的对数LRT因子,用于存储平滑后的对数LRT因子。
float priorSpeechProb:语音/噪声的先验概率,用于存储语音和噪声的先验概率。
特征数据

float featureData[7]:特征数据,用于存储特征提取的结果。

保守的噪声谱估计
float magnAvgPause[HALF_ANAL_BLOCKL]:用于存储在静音段期间计算的噪声谱平均值。
float signalEnergy:表示音频信号的能量。
float sumMagn:幅度之和,用于计算总幅度。
float whiteNoiseLevel:初始噪声估计的白噪声水平。
float initMagnEst[HALF_ANAL_BLOCKL]:初始幅度谱估计,用于存储初始的幅度谱估计。

粉红噪声参数
float pinkNoiseNumerator:粉红噪声参数的分子部分。
float pinkNoiseExp:粉红噪声参数的频率的幂。
float parametricNoise[HALF_ANAL_BLOCKL]:参数化噪声,用于存储参数化噪声谱。

特征提取参数和直方图
NSParaExtract featureExtractionParams:特征提取参数,用于存储特征提取的各种参数。
int histLrt[HIST_PAR_EST]:LRT的直方图,用于存储LRT的分布。
int histSpecFlat[HIST_PAR_EST]:频谱平坦度的直方图,用于存储频谱平坦度的分布。
int histSpecDiff[HIST_PAR_EST]:频谱差异的直方图,用于存储频谱差异的分布。

高频带估计和缓冲区
float speechProb[HALF_ANAL_BLOCKL]:最终的语音/噪声概率,包括先验概率和LRT。
float dataBufHB[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX]:高频带数据缓冲区,用于存储高频带的数据。

总结
NoiseSuppressionC结构体是一个复杂的结构体,它包含了自适应噪声抑制算法所需的各种参数和缓冲区。通过对这些参数和缓冲区的配置和使用,可以有效地实现对音频信号的噪声抑制,从而提高音频信号的质量。各个参数和缓冲区的作用在于不同的噪声环境下,对音频信号进行分析、处理和合成,以达到最佳的降噪效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值