news 2026/10/13 1:29:28

语音短时时域分析:短时能量、过零率、自相关与AMDF详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
语音短时时域分析:短时能量、过零率、自相关与AMDF详解

做语音处理这一行,入门第一课基本都会撞上“短时时域分析”。我第一次跑语音识别前端时,对着示波器里一整段录音发愣:明明一句话里有停顿、有起伏,为什么程序就是分不清哪里是说话、哪里是静音?后来才想明白,症结不在阈值调得太差,而在我没有先把语音信号拆成“一小段一小段”来看。语音信号是典型的非平稳信号,但它在极短的时间范围内又表现出相对平稳的特性,这种“宏观非平稳、微观平稳”的双重性格,决定了所有经典语音分析都必须先做分帧加窗,再做时域或频域处理。这篇文章就把短时时域分析最常用的四个参数——短时能量、短时过零率、短时自相关函数和短时平均幅度差函数——连同背后的物理含义、代码实现细节和工程应用场景一次讲透,适合刚接触语音处理的学生,也适合正在调端点检测或基音估计算法的工程师参考。

1. 为什么语音信号必须“切短了看”

1.1 非平稳与短时平稳假设

语音不是一段稳定的波形。说话时声带在振动,但基频不是恒定不变的;声道形状随发音动作不断改变,导致共振峰位置频频移动;气流强度也在变化,响度随之起伏。这些因素叠加起来,会让整段语音的统计特性从头到尾一直在变。如果直接拿整段信号做傅里叶变换,得到的是整个时间范围内的平均结果,相当于把几百毫秒里的不同发音混在一起,频谱上很难看清某一个音素的真实结构。更麻烦的是,很多时域参数——比如过零率、自相关峰值——对整段信号完全没有意义,因为不同性质的语音段混叠在一起,算出来的数字只是某种“加权平均”,既不能代表浊音段,也不能代表清音段。

工程上解决这个问题的方式很简单:把连续语音切成20到50毫秒的短段,认为在这么短的时间窗内,声带振动频率、声道形状和气流强度都几乎没有变化,于是每一段可以近似当作平稳信号来处理。这就是短时分析的基本假设。你可以把它类比成看电影:连续的画面是动态的,但把每一帧单独抽出来看,几乎就是静止图像;逐帧分析这些静止图像,反而能还原出完整的动作轨迹。对语音来说,这个“帧”就是时间窗,帧与帧之间通常还有一小段重叠,避免窗口边界处信息被截断。

1.2 时域分析为什么至今不可替代

很多初学者会有个疑问:现在主流语音技术都用深度学习,短时能量、过零率这些传统时域参数是不是过时了?但从工程角度看,时域分析不仅没过时,反而是整套语音前端里最便宜、最稳定的一环。它计算量极小,一个普通处理器都能实时跑完几千帧参数提取,不需要显卡,不需要预训练模型,非常适合嵌入式唤醒词检测、对讲机消噪、助听器前端这类低功耗场景。而且时域参数物理意义非常直白:能量高就是响了,过零率大就是波形密,自相关峰值对应基音周期,这些结论可以直接支撑工程判断。

频域分析当然重要,共振峰、频谱包络、梅尔特征都必须靠频域获得,但频域计算的代价高、延迟大,在实时性敏感的系统里往往不适合做逐帧的前置筛选。实际工程里常见做法是:先用时域参数快速判断“这段是不是语音”“是清音还是浊音”“基音大概是多少”,然后再决定要不要进入更复杂的频域分析或模型推理。这样既能降低无效计算,也能提高整体鲁棒性。下面这张表可以直观看出两者的分工。

对比项时域分析频域分析
计算量低,乘加运算为主高,需要FFT或滤波器组
实时性好,逐帧即时出结果一般,累积窗内数据后计算
主要产出能量、过零率、周期频谱包络、共振峰、谱特征
适合场景端点检测、基音粗估、VAD音色识别、声学建模、旋律提取

1.3 窗口选择:矩形窗、汉明窗、海宁窗

分帧不是简单地截一段数据,还要在后面乘一个窗函数。为什么不能直接截取?因为直接截断等于把边界处的信号强行砍断,在频谱上会产生严重的旁瓣泄漏,时域上则会让帧边界处出现突变。乘窗函数的目的是让帧内信号在两端平滑衰减到零,减少边界影响。矩形窗相当于不衰减,时间分辨率最高,但旁瓣泄漏最严重;汉明窗的旁瓣衰减比矩形窗好得多,是语音处理里最常用的默认选择;海宁窗在汉明窗基础上进一步平滑,适合需要连续帧波形拼接的场景,比如波形合成或变调处理。

窗长一般与帧长保持一致,典型帧长在20到30毫秒。窗形会影响短时能量的数值——同样一段音频,乘汉明窗后的帧能量会比乘矩形窗略低,因为边缘采样点被压下去了。这不是错误,只要在阈值设计时保持一致即可。另外,过零率对窗形不那么敏感,但如果你用矩形窗且信号两端存在直流偏置,过零率会被严重抬高,这点在后续章节会展开说。

2. 短时时域分析四大参数拆解

2.1 短时能量:音量变化的时间曲线

短时能量刻画的是“某一帧里信号有多强”。最标准的定义为:

En = Σ_{m=0}^{N-1} x_n²(m)

其中x_n(m)表示第n帧第m个采样点。为什么用平方?因为平方能放大较大幅度的样本,让能量曲线更贴近人耳对响度的主观感受——响度增加一倍,平方能量增加四倍,很容易拉开差距。但平方运算对低幅度部分不敏感,而且运算量稍大,所以在嵌入式平台上常用绝对值代替,也就是:

En = Σ_{m=0}^{N-1} |x_n(m)|

两者都能用,绝对值版本计算快,平方版本动态范围大。实际工程里我通常先用平方能量做端点检测,因为语音段的能量峰值和噪声底之间差距足够大,平方后更容易分离开。画图时如果动态范围太大,可以对能量取对数,这样曲线会平缓很多,便于观察。

短时能量的物理含义是“这一帧声音响不响”。浊音段声带振动强烈,能量通常较高;清音段依靠气流摩擦发声,能量较低;静音段理论上是零,实际会残留环境噪声。这正是端点检测能成立的基础:语音段与静音段在能量上存在明显差异。但要注意,能量曲线对噪声很敏感,如果录音环境里有稳定的风扇声或电流声,静音段的能量可能并不低,这时候单靠能量判语音很容易误判。

2.2 短时过零率:一段信号里有多少次“过零”

过零率统计的是相邻两个采样点符号发生变化的次数。定义式可以写成:

ZCR_n = 0.5 × Σ_{m=1}^{N-1} |sgn[x_n(m)] - sgn[x_n(m-1)]|

sgn是符号函数,取值为1或-1。当相邻两个采样点一正一负时,差值的绝对值为2,乘0.5后计为一次过零。这个参数的含义很直观:波形振荡得越快,过零次数越多。因此过零率与信号的主频率有近似正相关关系,可以作为粗糙的频度指标。

语音里最有意思的现象是,清音和浊音的过零率差异非常明显。元音(比如a、i、u)主要由声带周期性振动产生,波形平滑,过零率低;摩擦音(比如s、sh)本质上是噪声,频率成分分散且偏高,过零率明显更高。这个特性直接支撑了清浊音判断:高过零率大概率是清音或噪声,低过零率大概率是浊音或静音。但这里有两个坑,我必须提醒。第一个是直流偏置,如果信号里混入了直流分量,波形被整体抬高,过零次数会显著减少甚至变成零,必须先做去均值处理,也就是 x = x - mean(x)。第二个是预加重的影响,预加重会放大高频成分,从而让过零率整体上升,这不是坏事,但设计阈值时必须基于经过同样预加重后的数据来计算。

2.3 短时自相关函数:在波形里寻找重复结构

短时自相关函数计算的是帧内信号与其自身延迟若干点后的相似度:

R_n(k) = Σ_{m=0}^{N-1-k} x_n(m) × x_n(m+k)

其中k是延迟量。当语音段是浊音时,波形具有明显的周期性,比如基频100Hz的信号周期为10毫秒,那么在k约等于对应周期长度的位置,x(m)和x(m+k)的波形几乎一样,乘法累加后会得到一个明显的高峰。这个峰值的位置就是基音周期的估计值。

为什么自相关能检测周期?打个比方,你在一列长度固定的波浪照片上平移一张同样的照片,当平移距离恰好等于波浪间距时,两张照片几乎完全重叠,相似度最高。自相关做的就是这种相似度计算。但自相关也有两个缺点:第一,乘法累加的计算量偏大,帧长为400点时做最大延迟200的自相关,要算几万次乘法,虽然现代处理器不在乎,但在老式DSP上会明显吃紧;第二,自相关峰值容易受共振峰干扰,有时候第一共振峰产生的次峰比基音峰还高,导致估计出来的周期其实是共振峰周期而不是基音周期。这也是后面要讲中心削波的原因。

2.4 短时平均幅度差:自相关的嵌入式平替

短时平均幅度差(AMDF)换个思路,用差值的绝对值代替乘法:

D_n(k) = Σ_{m=0}^{N-1-k} |x_n(m) - x_n(m+k)|

如果信号是周期性的,当延迟k接近真实基音周期时,x(m)和x(m+k)几乎相同,差值累加值会跌到最低点。所以AMDF找的是“谷”,自相关找的是“峰”,两者在理论上等价,但AMDF的数值特性更稳定——它不涉及平方运算,对幅度变化不那么敏感,计算量也低。

实际工程中AMDF尤其适合低功耗设备,很多嵌入式基音检测方案用的都是AMDF而不是自相关。我在做某个实时语音调试工具时,对比过两种方法在8kHz采样率下的表现:干净语音环境下两者估计出的基音周期基本一致;但在带噪环境下,自相关峰值更尖锐但更容易被噪声干扰,AMDF谷值更平滑但偶尔会选错滞后位置。因此不少工程做法是两者都算,把自相关峰值和AMDF谷值对应的候选周期放在一起做投票或取中位数,这样抗错能力会强很多。

下面用表格汇总四个参数的核心用途:

参数计算公式物理含义典型用途
短时能量帧内采样平方和响度变化端点检测、VAD
短时过零率相邻符号变化次数频率密集程度清浊音区分、端点扩展
短时自相关延迟与逐点乘积和周期性重复度基音周期估计
短时AMDF延迟与绝对差和周期重复度的负向指标低功耗基音估计

3. 从零实现:预处理、分帧与核心代码

3.1 预加重:为什么要先做一阶高通

语音信号在产生过程中,高频成分的衰减速度远快于低频成分,所以原始录音往往听起来发闷,频谱上高频部分很弱。这对短时能量影响不大,但对过零率影响明显——高频成分衰减后,波形振荡不够活跃,过零率被低估。预加重用一阶高通滤波器补偿这种衰减:

y[n] = x[n] - α × x[n-1]

α通常取0.97左右。这样处理后,高频段每倍频程大约提升6dB,频谱变得平坦,后续的过零率、自相关乃至频域分析都更容易得到稳定结果。如果你做的只是简单的端点检测,预加重可以不做;但要计算自相关或过零率,我建议不要省这一步。另一个容易被忽略的细节是,预加重同时也放大了噪声中的高频成分,因此在低信噪比环境下,预加重系数要适当调低,比如0.9,避免把噪声的过零率抬得过高,干扰清浊判断。

3.2 帧长、帧移与窗函数的选择

帧长和帧移的选择有一套约定俗成的经验参数。以采样率16kHz为例,帧长取25毫秒对应400个采样点,帧移取10毫秒对应160个采样点,相邻帧重叠240点。为什么非要重叠?因为语音音素变化是渐进的,如果帧与帧完全衔接,一个音素正好落在帧边界上时,这帧信息就容易丢失,特征曲线也会出现阶梯状跳变。重叠50%以上可以保证对时间轴覆盖的连续性。

帧长不能随意设。基音估计要求帧内至少包含两个完整基音周期:男性基频最低可到80Hz,一个周期12.5毫秒,帧长至少25毫秒;如果采样率只有8kHz,25毫秒只对应200个点,做自相关时最大延迟还被限制在一半帧长,也就是100个点,对应80Hz刚好够用,但余量很小。所以做基音估计时,我一般会把帧长放宽到30到40毫秒,而做端点检测时20毫秒就够,因为端点检测对时间分辨率要求更高,帧太长会把短促的塞音或擦音糊掉。典型参数汇总如下。

采样率帧长帧移窗函数适用任务
8kHz20ms(160点)10ms(80点)汉明窗低带宽端点检测
8kHz30ms(240点)15ms(120点)汉明窗基音粗估
16kHz25ms(400点)10ms(160点)汉明窗语音识别前端
16kHz30ms(480点)15ms(240点)海宁窗基音估计与合成调试

3.3 Python实现:分帧、能量、过零率

下面给出一段可运行的Python代码,不依赖专门语音库,便于看清每一步在做什么。先用最简单的方式实现分帧和两个核心参数计算。

import numpy as np def pre_emphasis(x, alpha=0.97): y = np.zeros_like(x) y[0] = x[0] for i in range(1, len(x)): y[i] = x[i] - alpha * x[i - 1] return y def framing(x, fs, frame_len=0.025, frame_shift=0.010, win_type='hamming'): frame_len_samples = int(fs * frame_len) shift_samples = int(fs * frame_shift) if win_type == 'hamming': win = np.hamming(frame_len_samples) elif win_type == 'hanning': win = np.hanning(frame_len_samples) else: win = np.ones(frame_len_samples) num_frames = (len(x) - frame_len_samples) // shift_samples + 1 frames = np.zeros((num_frames, frame_len_samples)) for i in range(num_frames): start = i * shift_samples frames[i] = x[start:start + frame_len_samples] * win return frames, win def short_time_energy(frames): return np.sum(frames ** 2, axis=1) def short_time_zcr(frames): signs = np.sign(frames) diff = np.abs(np.diff(signs, axis=1)) return 0.5 * np.sum(diff, axis=1)

这段代码的核心逻辑不复杂,但有三个细节值得展开。第一,先预加重再分帧,顺序不能反。反过来会破坏窗函数对帧边界的平滑效果,导致帧与帧之间出现高频毛刺。第二,分帧时乘窗函数的位置在取完帧之后,而不是取帧之前,这样每一帧的窗函数都对齐到帧起点,才能保证短时能量和过零率对时间轴的一致性。第三,过零率用np.diff统计符号变化次数,这是向量化写法,比循环快得多。如果你处理的是实时流式数据,可以改成逐帧增量计算,但离线调试阶段用这段代码足够。

3.4 Python实现:自相关与AMDF的基音候选提取

自相关和AMDF的计算核心都是延迟比较。最大延迟限制在帧长的一半左右,是为了保证延迟k较大时还有足够多的数据点参与累加,数值才稳定。下面给出实现。

def autocorr_and_amdf(frame, max_lag_ratio=0.5): x = frame - np.mean(frame) n = len(x) max_lag = int(n * max_lag_ratio) lags = np.arange(1, max_lag + 1) ac = np.zeros(len(lags)) amdf = np.zeros(len(lags)) for k in lags: ac[k - 1] = np.sum(x[:n - k] * x[k:]) amdf[k - 1] = np.sum(np.abs(x[:n - k] - x[k:])) return lags, ac, amdf

使用的时候要特别注意,自相关的最大值几乎总是出现在k=1附近,因为延迟越小,重叠部分越多,累加值天然越大。所以不能直接把最大值位置当作基音周期,而要在合理搜索范围内找第一个显著峰值。搜索范围根据实际基频区间换算:比如目标基频80到500Hz,采样率16kHz,那么周期对应采样点数为32到200点,只在lags上这个区间内找峰。AMDF则相反,全局最小值也容易落在边界处,同样要限定搜索区间。更稳妥的做法是计算候选范围内的归一化峰谷度量,比如看峰值相对于周围区域的突出程度,而不是只看原始值。

3.5 可视化调试:波形叠能量、过零率怎么看

参数算出来之后,不要急着堆阈值,先把曲线画出来。我调试时习惯在同一张图上画三路信号:第一行是原始波形,第二行是短时能量曲线,第三行是过零率曲线,时间轴对齐。波形上能看到明显的浊音段振荡密集且幅度大,能量曲线上同一区域对应高值;清音段在波形上看起来像乱码,过零率曲线会在这段时期突然抬高。这种对照能帮你快速判断参数是否算反了、窗口长度是否合适、哪一段被截断了。

画图的意义在于培养直觉。我曾经调一个语音活动检测模块,能量曲线和过零率曲线单独看都正常,但合在一起后发现过零率总是提前于能量抬升,最后定位到是预加重系数过大,把噪声高频抬得太猛。这种问题如果不看图,只调门限会绕很久。所以建议任何短时分析的调参工作,都必须从可视化开始。

4. 应用落地:端点检测与基音估计的实战细节

4.1 双门限端点检测:能量和过零率如何配合

端点检测的目标是从连续录音里找出语音段的起止位置。最简单思路是看能量,但单靠能量不够,因为清音段能量低,容易被当成静音漏掉。双门限法用两套指标弥补这个缺陷:第一级用高能量门限粗略定位语音核心区,第二级从核心区向两侧扩展,结合低能量门限和过零率门限把清音段也拉回来。

具体做法大致是这样。先算完整段语音的短时能量和过零率序列,然后用能量直方图的较高百分位设定高门限,比如取能量最大值的30%,找到高于这个门限的帧,标记为语音核心。再从这些核心帧向前后扩展,只要能量仍高于较低门限(比如最大值的10%),或者过零率高于设定的清音门限,就继续扩展,直到连续若干帧都不满足条件才停止。这个“向后扩展时过零率允许例外”的设计,正是为了把s、sh这类清音段包含进来——它们的能量可能不高,但过零率显著高于静音。

下面给一个精简的Python实现思路。

def dual_threshold_vad(energy, zcr, high_ratio=0.3, low_ratio=0.1, zcr_th=None, min_duration_frames=3): high_th = np.max(energy) * high_ratio low_th = np.max(energy) * low_ratio if zcr_th is None: zcr_th = np.mean(zcr) + 1.5 * np.std(zcr) active = energy > high_th # 从能量高帧向左右扩展 for i in range(len(active)): if active[i]: j = i - 1 while j >= 0 and (energy[j] > low_th or zcr[j] > zcr_th): active[j] = True j -= 1 j = i + 1 while j < len(active) and (energy[j] > low_th or zcr[j] > zcr_th): active[j] = True j += 1 # 去掉持续时间过短的毛刺 ... return active

这段代码只是示意,实际工程里还要加两个处理:一个是平滑能量曲线,可以用三到五帧的滑动平均,避免单独某帧能量抖动导致活动标记断续;另一个是最小持续时长约束,比如语音段至少持续100毫秒,否则视作鼠标点击或环境噪声。门限也不要直接用最大值乘以固定比例,因为最大值可能来自突发噪声,更稳的做法是用能量分布的90%分位数作基准。

4.2 基音估计:中心削波与峰值搜索

用自相关做基音估计时,中心削波几乎是必做的预处理。中心削波的核心是把小于某阈值的部分压成零,只保留大幅值部分:

y[n] = max(x[n] - T, 0) 如果 x[n] > T y[n] = min(x[n] + T, 0) 如果 x[n] < -T y[n] = 0 其他情况

阈值T一般取帧内最大幅度的60%到70%。削波后共振峰结构被大幅抑制,自相关峰值会主要集中在基音周期处,明显减少“峰值选错”的尴尬。代价是能量信息丢失,但基音估计本来就不需要能量信息,所以无伤大雅。

峰值搜索也不是直接找最大值了事。正确做法是:在基音周期对应的延迟范围内,先找出所有局部极大值,再从中挑最大值;有时还要加一个“峰值突出度”判断,要求该峰至少大于周围区域平均值的某个倍数,否则视为无周期。这一步在清音段尤其重要——清音段没有周期性,自相关曲线里即使有峰值也是噪声引起的,硬要找一个峰值会输出荒谬的基音值。

4.3 清浊音判断与搜索范围设计

基音估计不能对所有帧无脑执行。清音段和静音段的基音没有物理意义,先要做清浊音判断。常见的判断依据有两个:一个是短时能量是否高于某个底限,另一个是自相关峰值突出度是否够强。如果能量很低或峰值很弱,直接标记为“清音/静音”,不输出基音。这样下游模块不会拿到一堆随机基音值。

搜索范围也要根据人群和场景设定。成年男性基频大致在80到250Hz,成年女性在150到350Hz,儿童可以到400Hz以上。如果场景不确定,搜索范围放大到60到500Hz,然后通过后处理平滑排除跳变。搜索范围对估计精度影响很大:下限太低会导致倍频错误,比如把200Hz估计成100Hz;上限太高又可能把噪声尖峰当作基音。稳妥的做法是先按性别或年龄段锁定窄范围,再在细化阶段做动态调整。

4.4 鲁棒性优化:增益归一化与动态阈值

不同录音设备、不同录音距离,音量差异巨大。同样的端点检测算法,在一台设备上阈值是0.3倍最大值,换一台设备可能完全不工作。所以工程上要引入增益归一化:先把整段信号的能量归一化到固定范围,比如让最大能量等于1,再做阈值判断。实时系统里没有整段信号可用,可以改用自动增益控制,或基于过去几百毫秒的能量估计动态基准。

动态阈值的另一种实现方式是利用统计量。假设静音段能量服从某一分布,语音段能量明显偏高,那么可以把阈值设在能量均值和最大值之间的某个比例上,并定期更新均值和最大值。这种做法在信噪比大于10dB时表现稳定,信噪比低于5dB时无论怎么动态调整都比较吃力,这时候更适合先做噪声估计再减噪,或者引入谱特征辅助判断。

5. 踩坑记录:常见问题、排查思路与速查表

5.1 端点检测过分割或漏检

端点检测最常见的毛病是把一个词切成两段,或者把环境噪声当成语音。如果是过分割,先检查平滑窗口是否太短。能量曲线毛刺太多时,活动标记会在一个词内部频繁断开,这时把平滑窗口从三帧加到五帧往往就能解决。如果是漏检清音,检查扩展阶段是否启用了过零率门限,以及门限是否设得过高。清音段的过零率虽然高,但如果有直流偏置,过零率会被压低,这时先做去均值和预加重再看曲线。

还有一类情况是整段录音都有效果,但你的算法不工作,因为静音段本身噪声很大,能量底和语音段能量差别太小。这时候不要急着调阈值,先做信噪比估算。如果信噪比真的很低,任何纯时域端点检测都很难做好,要么换头戴式麦克风减少环境噪声,要么先在频域做噪声谱减法。

5.2 基音检测结果“跳变”或“翻倍”

基音估计结果在相邻帧之间突然翻倍或减半,是很典型的“倍频/半倍频错误”。例如真实基频是200Hz,算法输出100Hz,说明找到了第一个谐波的位置当作基音;输出400Hz,则可能是把基音峰旁的小峰当成了主峰。这种错误单靠峰值搜索很难完全避免,工程上常用中值滤波或平滑约束:假设基音在短时间内的变化是连续的,如果某一帧的估计值和前后帧差异过大,就用相邻帧的中位数替换。再配合中心削波和窄搜索范围,能把错误率压到很低。

如果是清音段输出的随机基音,那就不是倍频问题,而是清浊音判断失效。检查一下是否对所有帧都执行了基音搜索,以及清浊判断条件是否过松。自相关峰值突出度是一个不错的指标,可以在搜索范围内计算最大峰与次峰的比值,如果太小就判定为非周期性帧。

5.3 常见问题与参数速查表

下表整理了我实际调试中遇到的高频问题和对应解法,供你对照排查。

现象可能原因建议排查方向
能量曲线抖动剧烈帧长过短或窗旁瓣泄漏帧长加大到20ms以上,改用汉明窗
过零率在浊音段仍然很高工频干扰或预加重系数过大先加50Hz陷波,降低α到0.9
浊音段自相关主峰不明显共振峰干扰或幅度太小先中心削波,再检查帧长是否够两个基音周期
基音输出为低频倍频搜索范围下限过宽锁定搜索范围,限制最低频率为真实基频下限
基音输出在清音段乱跳清浊判断失效增加峰值突出度判断,清音段不输出基音
端点检测把鼠标声识别为语音活动段最短时长约束缺失增加最小持续时间,滤除短促噪声

6. 经验收尾

讲了这么多原理和代码,最后说几点这些年积累下来的体会。第一,短时分析的调参顺序很重要,我习惯先固定帧长、帧移和窗函数,只调门限和削波阈值,而不是同时改一堆参数。参数耦合会让问题来源变得不可控。第二,不要相信数字,要相信图形。每次改动参数后都把波形、能量曲线、过零率曲线叠在一起看一遍,很多问题一眼就能发现,比盯着几十帧的数值列表效率高得多。第三,短时能量和过零率从来不是孤立特征,把两者联合起来看能暴露很多细节:浊音段能量高、过零率低,清音段能量低、过零率高,噪声段往往两者都偏高或都不稳定。有次我调一个噪声环境下的VAD,单看能量曲线一直区分不开,把能量和过零率画成散点图后,语音点和噪声点分成了两个明显的簇,边界一下子就清楚了。做技术调试就是这样,大多数时候不是原理不够高大上,而是细节没有抠到位。希望这篇关于短时时域分析的文章能帮你减少一点摸索的时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 1:28:48

EMC设计前移:从原理图到量产的可量化风险评估方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:28:42

Python递归解迷宫:turtle可视化深度优先搜索与回溯

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:28:24

深度学习验证码识别:CNN多标签分类实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:28:00

OSG 3.6集成Qt 5.13:嵌入式三维渲染窗口的完整实现与踩坑记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:27:58

OpenCV Rect核心用法与避坑指南:从几何语义到ROI裁剪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:27:42

STM32 GPIO模拟三线时序驱动DS1302实时时钟完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华