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