news 2026/9/1 13:42:15

时域与频域特征提取全解析:从FFT到故障诊断的工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
时域与频域特征提取全解析:从FFT到故障诊断的工程实践

简介:本资源是一份面向信号处理初学者与工程实践者的Python特征提取工具脚本,聚焦时域与频域两类核心特征的快速计算与理解。针对振动分析、故障诊断、生物电信号处理等实际场景,提供可直接运行的代码实现,解决特征手动计算繁琐、公式与代码脱节的问题。压缩包仅含1个Python源文件(.py),大小2KB,轻量简洁,涵盖方差、标准差、峭度、裕度、峰值、斜度等6类时域指标,以及功率谱密度、谐波、带宽、中心频率等4种频域特征的完整计算逻辑,全部基于numpy和scipy标准库,无需额外依赖。目前已有1799人学习下载,读者可即刻运行脚本输入任意一维信号数组,获得结构化特征输出,并结合注释深入理解各指标物理意义与工程适用性,是入门信号特征工程的实用型参考脚本。 做信号处理的人,十有八九都遇到过这种场景:数据采了一大堆,波形在屏幕上密密麻麻扭成一片,人眼根本盯不出规律。领导问设备有没有异常,你说“波形有点乱”,这不算结论,因为乱是一个没法量化、没法复现、没法写进报告的词。真正能解决问题的是特征提取——把一条时间轴上的原始信号,按照特定规则压缩成一组具有物理含义的数字,用这些数字代替波形去做判断。

时域和频域是这个领域最基础的两种切入角度。时域回答“信号值随时间怎么变”,频域回答“信号由哪些频率成分按什么强度组成”。两者不是对立关系,而是对同一段信号的两种投影方式。特征提取的核心工作,就是从这两个投影面中分别捞出真正有判别力的指标。这篇文章我会把时域、频域特征提取的完整逻辑讲透,包括每个特征值的物理含义、计算公式、适用场景,以及工程中容易踩的坑。尤其会重点处理一个网上被反复问的问题:Matlab里拿到一组非整数时间间隔的数据,怎么转频域并挑出某一频率。适合刚接触信号处理的初学者,也适合做故障诊断、语音分析、工业监测但一直停留在“画图看图”阶段的工程师参考。

1. 为什么“时域”和“频域”总是成对出现

1.1 同一个信号的两张“身份证”

先想一个问题:一段声音,是一秒内鼓点、人声、吉他声混合叠加后的结果。你在时域里看到的是空气压强随时间的连续波动,这个波形的形状取决于所有声源瞬时叠加后的总和。人耳虽然能分辨鼓点和人声,但只看时域波形,你分不清哪个部分是鼓、哪个部分是人声。频谱的作用就是把这团混合物重新拆解成一个个频率分量,让你看到在某个频点上能量有多强。

这就是傅里叶变换干的事。它不改变信号本身包含的信息,只是把信息从“时间坐标系”搬到了“频率坐标系”。更准确地说,原始时域信号是一个函数,它把每个时刻映射成一个幅度值。傅里叶变换把这个函数分解成一组正弦波基函数的加权叠加,每个正弦波有自己的频率、幅度和相位。分解完以后,原来的全部信息仍然在,但视角完全不同。

我经常用交通类比来解释。时域数据像高速路口的实时车流量记录,某个时刻冲过去多少辆车,这是瞬时的密度变化。频域数据更像把所有车辆按目的地分类后的统计报表,不管它们什么时间通过,只看哪些目的地(频率)占了多大比例(幅度)。交通管理既要看瞬时流量变化,也要看周期性拥堵的主要路段,两种视角缺一不可。

1.2 特征提取的本质:降维而不是丢失

很多初学者有个误解,认为特征提取就是把信号“简化”了,损失了真实信息。这话对了一半。特征提取确实是降维,但是一种在保留关键判别信息的前提下主动丢弃冗余信息的降维。

以电机轴承状态监测为例。原始振动信号以50kHz采样率记录,一秒钟就是5万个数据点。如果直接把这段波形交给分类模型,模型要处理的特征维度是五万维,计算量巨大、过拟合风险高。但仔细观察你会发现,不同故障状态的振动信号,在时域统计量和频域能量分布上表现出明显的差异。健康的轴承振动近似随机白噪声叠加微弱的转频成分;外圈故障时往往出现与通过频率有关的周期冲击;内圈故障的冲击幅度又受负载调制。这些差异可以用几十个特征数字完整表达。从五万个点到几十个点,这就是特征提取的降维作用。

它没有“丢失真实信息”,因为那5万个原始数据点里其实包含了大量重复的、噪声性的、对故障判别没有贡献的信息。特征提取帮你把注意力集中到信号真正携带判别能力的位置上。

1.3 时域特征与频域特征的分工差异

时域特征最擅长捕捉三类信息:信号的总体幅值水平、瞬时的冲击/突变、信号随时间变化的统计规律。它不需要做复杂的数学变换,计算代价低,而且物理意义非常直白——均值、峰值、方差、峭度,每一个都能直接和设备的某种运行状态挂钩。

频域特征则擅长回答另一类问题:信号在哪些频率上聚集了能量?这些频率成分的分布形态是怎样的?旋转机械的转频、齿轮啮合频率、轴承故障特征频率、电气设备的工频及其谐波,这些都只能在频域里被精准定位。如果只靠时域统计量,你顶多能判断“信号幅值变大、波动变强”,但判断不了“是1倍频变大还是2倍频变大”,也就锁不住故障源。

所以成熟的诊断方案几乎都是双域联合:先用时域特征做快速筛查、发现异常征兆,再用频域特征定位异常成分、锁定故障机理。特征提取不是二选一,而是两套尺子配合着量。

2. 时域特征:把波形压缩成一组可比较的数字

2.1 最常用的时域统计量及其物理含义

时域特征从计算方式上看都很简单,但要真正用好,必须理解每个量到底在“感知”信号的哪个侧面。我把实际项目里最常用的一组列出来:

特征名称计算公式感知的信号侧面典型应用场景
均值(\frac{1}{N}\sum_{i=1}^{N}x_i)信号的直流分量、静态偏置传感器零漂检测、静态差异对比
均方根值(RMS)(\sqrt{\frac{1}{N}\sum_{i=1}^{N}x_i^2})信号的总体能量水平振动烈度评价、噪声等级测量
峰峰值(\max(x)-\min(x))信号的最大摆动幅度冲击检测、间隙评估
方差/标准差(\frac{1}{N}\sum_{i=1}^{N}(x_i-\bar{x})^2)信号相对均值的波动程度信号平稳性判断
峭度(\frac{1}{N}\sum_{i=1}^{N}(\frac{x_i-\bar{x}}{\sigma})^4)信号分布的“尖峰”程度轴承早期故障、局部冲击敏感检测
偏度(\frac{1}{N}\sum_{i=1}^{N}(\frac{x_i-\bar{x}}{\sigma})^3)信号分布的不对称性不对中、摩擦类故障的辅助判断
波形因子(RMS / \frac{1}{N}\sumx_i)
峰值因子(\maxx_i/ RMS)

这里我想特别强调峭度。正常轴承振动信号近似高斯分布,峭度值在3附近。当轴承表面出现局部剥落或裂纹时,每次滚珠经过缺陷位置都会产生一个窄而尖的冲击脉冲。这种脉冲在时域波形上只占几个采样点,对RMS的影响微乎其微,但它的幅度很大,会显著抬高信号分布的四阶矩,使得峭度值迅速上升到5以上。所以峭度是轴承早期局部故障非常灵敏的指示器,这类故障在峰峰值和RMS变化还不明显的时候,峭度往往已经报警了。

峰值因子也有类似的逻辑:一个高幅值尖脉冲会把峰值因子推得很高,而连续的平稳振动即使RMS很大,峰值因子也维持在较低水平。所以峰值因子适合区分“少数几次剧烈冲击”和“整体性高振动”。

2.2 时域特征的适用场景与局限性

时域特征的最大优势是计算简单、实时性好。在嵌入式设备或PLC里,不需要做复杂的FFT,只要能跑加减乘除和开方,就能实时计算RMS、峭度、峰值因子。国内很多设备状态监测系统的报警逻辑至今还在用“振动速度RMS是否超ISO 10816标准限值”这一条,门槛很低但非常实用。

但时域特征有个显著短板:无法定位频率。如果设备出现共振或某个齿轮的啮合频率成分异常增大,时域统计量可能几乎不变,因为总能量没变,只是能量在频谱上的分布位置变了。这种情况需要频域特征出手。

另外时域特征受噪声和异常值影响较大。采集系统中偶尔出现的尖峰干扰、通信毛刺,会直接影响峰峰值和峭度的计算结果。因此在实际做时域特征提取之前,一定要做预处理:去除异常值、必要时做带通滤波。我见过不止一个项目,峭度一直偏高报警,查到最后发现是传感器线缆接触不良,每隔几百个点就跳一个尖峰。预处理做完,峭度就回到正常水平了。

2.3 预处理决定时域特征的可靠性

很多人忽略的一个细节是:特征提取不是对原始数据直接算,而是对预处理后的数据算。最基本的预处理链路包括:

  • 去均值:把信号减去自身均值,消除直流偏置,否则后续计算方差、峭度时直流分量会严重干扰结果。
  • 去除毛刺:设定合理的幅度阈值,超过阈值且持续时间极短的点判断为干扰,用邻域插值代替。
  • 带通滤波:根据研究对象的特征频率范围,设计带通滤波器保留有效频段、抑制无关低频漂移和高频噪声。旋转机械振动的有效分析频段通常在10Hz到10kHz之间。
  • 加窗分段:对长时间连续信号,按固定长度(如1024点或1秒时长)切分,对每个分段分别计算特征。这样既能观察特征值随时间的变化趋势,也便于后续做统计分析和机器学习建模。

我在实际项目中的习惯是:先画一段原始波形,肉眼判断是否有明显异常点;然后做去均值和毛刺处理;再对处理后的信号计算全部时域特征。如果计算后的特征值仍然不符合预期,回头检查预处理环节,几乎没有一次是预处理白做的。

3. 频域特征:FFT之后你到底在看什么

3.1 从时域到频域的跳转规则

要把时域信号转成频域,目前工程上几乎都用FFT(快速傅里叶变换),但FFT只是傅里叶变换的一种高效算法实现,它有几个输入前提和输出特性,不理解清楚很容易得到错误结论。

第一是采样定理。要分析的最高频率不能超过采样率的一半,这个频率叫奈奎斯特频率。假设采样率是10kHz,那FFT结果中最高可靠频率就是5kHz,超过这个范围的信息会被“混叠”折返到低频段里,造成假峰。所以设置采样率之前,一定要先想清楚目标信号集中在哪个频段、需要用到的高频上限是多少。工程经验是采样率至少设置为最大关注频率的5到10倍,而不是刚好两倍。留出余量以便后处理滤波。

第二是频谱分辨率。FFT输出的频率点间隔是采样率除以FFT点数。采样率10kHz、FFT点数1024,分辨率为10Hz。这意味着你只能区分相隔10Hz以上的两个频率分量,如果两个峰只差5Hz,在频谱上会糊成一个峰。要提高频率分辨率,不能靠提高采样率(这会拉低分辨率),而要增加FFT点数。增加点数的办法是延长截取信号的时长。FFT点数由采样率fs和信号时长T共同决定,N = fs * T。想要0.1Hz的分辨率,在10kHz采样率下需要10万点、10秒的数据长度。这是很多入门者在频域分析中碰到的第一堵墙:数据长度不够,频率分辨率到不了目标值。

第三是窗函数。对有限长信号做FFT,相当于在无限长信号上截取了一段矩形窗,这会带来频谱泄漏——频率成分的能量泄漏到相邻频点上,形成“裙边”。抑制泄漏的办法是在截取时加窗函数,如汉宁窗、汉明窗、布莱克曼窗。加窗的代价是主瓣变宽,频率分辨能力略有下降,但旁瓣泄漏显著减少。对于连续周期信号,我常用汉宁窗;对于冲击类信号,矩形窗反而更合适,因为加窗会削弱冲击的幅度和边缘特征。

3.2 从频谱中提取常用的频域特征

FFT算完以后,你会得到一组复数,包含每个频率分量的幅度和相位。幅度谱是最常用的,它告诉你每个频率上信号强不强。但直接拿几百上千条幅度谱线去建模,维度依然太高,还需要进一步压缩成频域特征。下面几个是工业界实践中最常使用的:

  • 主频(谱峰频率):幅度谱中最大峰值对应的频率,代表信号能量最集中的频率位置。旋转机械的轴频、电机工频及其倍频,往往就是主频所在的位置。
  • 谱质心(重心频率):所有频率分量按能量加权后的平均频率,反映信号频谱的能量中心。谱质心可用于描述声音的明亮度、振动的频率重心变化。
  • 频带能量:把整个频段划分成若干个子频段,分别计算每个子频段的能量和。这是故障诊断界最经典、最常用的做法,因为不同故障类型往往在不同频带产生异常能量。
  • 频率集中度:主频能量占总能量的比例,描述信号能量是否集中在少数几个频率上。齿轮均匀磨损时,啮合频率及其谐波能量集中度会发生变化。
  • 边频带能量:主频两侧以故障特征频率为间隔的边带能量之和,常用于调制类故障(如齿轮局部断齿、轴承故障引起的振动调制)的识别。

重点说下谱质心。它的计算公式是:

[ SC = \frac{\sum_{i=1}^{K} f_i \cdot P_i}{\sum_{i=1}^{K} P_i} ]

其中 (f_i) 是第 (i) 个频率值,(P_i) 是频率点 (i) 的功率谱值。可以直观地理解:谱质心是把整个频谱看成一根质量分布不均匀的杆子,能量集中的地方质量大,谱质心就是这根杆子的质量平衡点。它落在哪个频率位置,就说明信号的主要能量集中在这个频率附近。设备启动过程中转速升高,谱质心会随之上升;轴承出现严重磨损时,高频振动能量增加,谱质心也会向高频方向偏移。这是一个能反映频谱总体迁移趋势的好指标。

3.3 功率谱密度与自谱

除了直接FFT的幅度谱,工程上还常用功率谱密度(PSD)。PSD描述信号功率在频率轴上的分布密度,单位是 (V^2/Hz) 或 (g^2/Hz)。计算方式有两种:一种是对时域信号计算自相关函数,再对自相关函数做傅里叶变换,这叫自相关法(Wiener-Khinchin定理);另一种更常用的是Welch法——把长信号分段,每段加窗后做FFT,再将各段幅度平方后平均。

Welch法的优势在于通过分段平均来抑制频谱的随机起伏。单个样本的FFT频谱噪声很大,峰和谷的抖动明显;分成多段后,真实频率成分在每段都稳定出现,平均后保持不变,而随机噪声在各段表现不同,平均后会被压低。平均次数越多,频谱越平滑,稳定性和可重复性越高。但代价是频率分辨率降低——每段越短,能分辨的频率间隔越粗。

工程中做频域特征提取的推荐流程是:截取足够长的稳定运行数据,用Welch法计算PSD,然后基于PSD提取主频、谱质心、频带能量和边带能量。PSD比单次FFT幅度谱稳健得多,后续特征也不容易受随机噪声扰动。

4. 非整数时间间隔数据转频域并提取指定频率的完整实操

4.1 问题背景:非均匀采样为什么不能直接做FFT

网上关于“Matlab中如何将一组时域下的非整数数据转换为频域数据”的提问非常多。用到的场景很典型:从数据库导出的数据,时间戳不是整数秒,比如0.0012、0.0025、0.0041、0.0053……时间间隔忽大忽小,甚至中间有缺失。直接把这两列数据送入fft函数,Matlab并不会报错,但结果完全错误。因为fft函数假设输入数据是等时间间隔采样的,它把数据点顺序当成均匀时间轴上的相邻样本。如果间隔不均,频谱的频率轴位置就会严重错位,数据点之间的“时间关系”也失真。

再举一个网上常被问到的角度:时域掩蔽效应中的时域掩蔽。这个概念来自听觉感知,指的是一个强的声音在时间上遮蔽其后或之前较弱的听觉信号。人类听觉系统在时域上的分辨能力有限,瞬间强声过后会有一段听不到的短暂阶段。这虽然不是频域特征提取的直接组成,但说明时域上的时间分辨率与频域上的频率分辨率之间存在物理上的相互制约,这也是为什么时域和频域特征必须分开提取、结合起来使用的根本原因。

4.2 处理方案一:插值重采样到均匀时间轴

非均匀数据转频域,最直观的思路是先把数据变成均匀间隔,再做FFT。插值重采样的完整流程如下:

第一步,确定目标采样率。看数据平均时间间隔。比如0.001、0.002交替出现,取平均间隔0.0015秒,目标采样率约666.7Hz。如果对频率分辨率有要求,需要结合数据总时长和目标频率分辨率来倒推。建议设置的目标采样率不高于原始数据等效采样率的1.5倍,避免过度插值引入虚假信息。更稳妥的做法是:统计间隔的均值 (dt_{mean}),目标采样率 (fs_{new} = 1 / dt_{mean})。如果间隔变化很大,取较小的间隔作为目标采样率以保证不丢信息,但需要接受插值计算量增大的代价。

第二步,选择插值方法。Matlab中常见的方法有线性插值(interp1)、三次样条插值(spline)、pchip插值。线性插值简单、计算快,但会损失一部分高频信息,而且折角处不够光滑,可能引入额外的高频分量。三次样条插值光滑性最好,适合振动信号这种平滑波形的重采样。pchip则适合变化剧烈的数据,它不会像三次样条那样出现超调和过冲。

第三步,建立新的均匀时间轴。t_new = 0 : dt_new : t_end,或者用 linspace(0, t_end, N_new)。然后调用 interp1 完成重采样。

% 原始数据:t为非均匀时间戳,x为对应采样值 t = [0.0012 0.0025 0.0041 0.0053 0.0064 0.0079 0.0090]; x = [1.2 2.1 1.8 2.5 2.2 3.1 2.9]; % 1. 统计实际时间间隔与平均间隔 dt = diff(t); dt_mean = mean(dt); fs_new = round(1 / dt_mean); % 2. 构造新的均匀时间轴 t_new = t(1) : dt_mean : t(end); if t_new(end) < t(end) t_new = [t_new, t_new(end) + dt_mean]; % 确保覆盖完整段 end % 3. 三次样条插值 x_new = interp1(t, x, t_new, 'spline'); % 4. 验证重采样后的间隔 dt_check = mean(diff(t_new)); disp(['目标采样率: ', num2str(fs_new), ' Hz']); disp(['重采样后平均间隔: ', num2str(dt_check), ' 秒']); % 5. 做FFT N = length(x_new); X = fft(x_new - mean(x_new)); % 去直流后再FFT f = (0 : N-1) * (fs_new / N); % 频率轴 mag = abs(X) / N * 2; % 单边幅度谱

这里有几个细节要强调。fft之后计算幅度谱时,常用的归一化方式是幅度除以N再乘以2,得到单边幅度谱。但因为插值后的点数N不一定是2的幂次,fft内部对非2幂次长度会用混合基算法计算,速度稍慢但结果正确。如果数据点数特别多、想加快速度,可在重采样后截取前缀到2的幂次长度,或者直接调用fft不手动补零,因为补零只会使频谱更平滑,不会提高真实分辨率。

4.3 处理方案二:最小二乘频谱估计

插值重采样处理非均匀数据会引入一个隐患:插值本身相当于一个低通滤波过程,会平滑掉一部分高频细节。如果原始数据的间隔不均匀程度很大,插值结果与真实信号之间的偏差会明显增加。对这类数据,另一种更精确的方法是做Lomb-Scargle周期图,它能直接在非均匀采样点上估计功率谱,不需要插值。Matlab自带的 plomb 函数可以实现。

% 直接用非均匀采样数据计算Lomb-Scargle谱 t = [0.0012 0.0025 0.0041 0.0053 0.0064 0.0079 0.0090]; x = [1.2 2.1 1.8 2.5 2.2 3.1 2.9]; [pxx, f] = plomb(x, t, 'normalized'); plot(f, pxx); xlabel('Frequency (Hz)'); ylabel('Power');

plomb 返回的 pxx 是功率谱密度估计,f 是频率向量。它的好处是不用选择插值方法、不用重采样,直接代入原始数据即可。缺点是计算速度比FFT慢,尤其数据量大时差距明显。因此工程上建议:间隔偏差较小时用插值重采样法,间隔波动剧烈或数据量适中时用Lomb-Scargle法。

4.4 指定频率的提取技巧

重采样和FFT之后,真正的痛点往往变成“怎么把某个频率的幅值取出来”。比如你只关心256.3Hz这个频率上的幅值,怎么做最准?

频谱的频率轴是按固定间隔步进的,除非你运气特别好,否则256.3Hz很可能不落在任何一条谱线上。最接近它的谱线位置计算方式是:

f_target = 256.3; [~, idx] = min(abs(f - f_target)); amp_at_target = mag(idx); disp(['目标频率: ', num2str(f_target), ' Hz']); disp(['最近谱线频率: ', num2str(f(idx)), ' Hz']); disp(['对应幅值: ', num2str(amp_at_target)]);

如果只是取最近谱线的值,误差取决于频率分辨率。分辨率10Hz时,256.3Hz偏差可以到0.3Hz,幅度误差在5%以内;如果分辨率1Hz,误差就更小了。追求更准确的话,可在目标频率附近做抛物线插值(也叫谱峰插值),取峰值谱线及左右两条谱线,用三点抛物线拟合,得到的峰值频率更接近真值:

% 三点抛物线谱峰插值 if idx > 1 && idx < length(mag) y1 = mag(idx-1); y2 = mag(idx); y3 = mag(idx+1); delta = 0.5 * (y1 - y3) / (y1 - 2*y2 + y3); f_peak_corrected = f(idx) + delta * (f(2) - f(1)); amp_peak_corrected = y2 - 0.25 * (y1 - y3) * delta; disp(['插值后的峰值频率: ', num2str(f_peak_corrected), ' Hz']); disp(['插值后的峰值幅值: ', num2str(amp_peak_corrected)]); end

另一种常见需求是提取某个频带的总能量,比如关心230Hz到280Hz之间的总振动能量。做法是对该频带内所有谱线求能量和:

band_idx = find(f >= 230 & f <= 280); band_energy = sum(mag(band_idx).^2); % 频带能量,按幅度平方累加

注意计算频带能量时用幅度平方而不是直接用幅值,因为能量正比于幅值的平方。如果后续要做多段对比,建议把每条谱线先归一化再累加,减少不同信号总体幅值差异带来的干扰。

5. 容易被点名的进阶概念:MFCC、倍频程与时域掩蔽

5.1 MFCC特征提取的流程和用途

MFCC(Mel频率倒谱系数)是语音处理和音频识别中最经典的特征提取方法。它和普通频域特征最大的区别在于:它不是直接使用频谱值,而是在频谱基础上做了一层模拟人耳听觉特性的映射和压缩。

完整流程是:预加重、分帧、加窗、FFT、Mel滤波器组、取对数、离散余弦变换(DCT)、取前若干维系数。预加重是为了提升高频分量,因为语音中的高频能量通常偏弱。分帧是把连续信号切成20ms到40ms的小段,为了保证段与段之间连续,分帧时相邻帧有50%左右的重叠。每帧加汉明窗后做FFT,得到频谱。Mel滤波器组把频率轴按Mel尺度划分成若干个三角形滤波器,每个滤波器的输出代表该频带内的能量。然后取对数,模拟人耳对声音响度的对数感知,最后做DCT得到倒谱系数。

DCT之后取前12到13个系数就是MFCC特征。它为什么有效?因为DCT具有非常好的去相关性,能把Mel谱上相邻滤波器输出之间的冗余信息压缩掉,让特征向量维度紧凑、独立性更强。语音识别系统几十年的实践证明,MFCC在干净环境和噪声环境下都优于直接使用FFT谱线或线性预测系数。

5.2 倍频程分析:从频谱到1/3倍频程

频域oct的原理是倍频程分析。倍频程(Octave)是指频率之比为2:1的频带范围。1/1倍频程就是把整个频段按每个频带的上限频率是下限频率的2倍来划分;1/3倍频程是每个频带的上限频率是下限频率的2的1/3次方倍,更细一些。划分后分别统计每个频带内的声压级或振动能量。

倍频程分析在噪声测量和声学工程中几乎是标配。ISO标准里的噪声评价、听力保护标准、建筑声学测量,都要求按1/1倍频程或1/3倍频程输出。原因很简单:人耳对频率的感知本来就是等比划分的,100Hz到200Hz之间和1000Hz到2000Hz之间的感知差异大致相当。而线性频率轴把低频段压得很窄、无法区分细节,倍频程轴则能反映人耳实际的频率感受。

Matlab频谱分析后做1/3倍频程的常见做法是定义标准中心频率(如25Hz、31.5Hz、40Hz……20kHz),按每个中心频率上下限滤波器或直接在频域积分频带能量。对于振动信号,1/3倍频程能量谱常用于评价机器在不同频段的振动等级,比只看总RMS更有诊断价值。

5.3 时域掩蔽效应与特征提取的关联

时域掩蔽(temporal masking)是听觉心理学中的一个概念,但在信号处理的特征提取环节里,它的思想经常被借用。比如语音增强算法里,分析一个强声之后的短时间内,人耳对弱声的感知阈值提高,于是这个时间段内的噪声即使幅度较大,感知上也不明显。基于这个掩蔽效应的算法,可以在不强求完全消除噪声的情况下,把感知噪声压到掩蔽阈值以下,从而在保持语音自然度的前提下提升主观听感。

在特征提取层面,理解时域掩蔽可以帮你想明白一个问题:为什么有些时候不必追求极高的时间分辨率?当你做短时频谱分析时,窗长越短,时间分辨率越高,但频率分辨率越差,这就是时域与频域分辨率的折中,本质上是时域不确定原理的体现。人耳的时域掩蔽说明人类听觉本身就接受这种折中。所以特征提取参数的选择,不是时间分辨率越高越好,而是需要根据目标频率精度来反推合适窗长。对语音识别,帧长20ms到30ms是经验最优区间;对旋转机械振动,窗长则应覆盖至少2到3个旋转周期。

5.4 滚动时域优化:一个常被混淆的“时域”名词

“滚动时域优化”在某些热搜里和特征提取放在一起,但它其实是控制理论中的概念。滚动时域优化(Receding Horizon Optimization)也叫模型预测控制(MPC)的核心——每个控制周期都基于当前状态预测未来一段时域内的系统行为,求解一个有限时域的优化问题,只执行第一步,然后下个周期滚动重复。它名字里的“时域”是指预测和控制的时间窗口,不是信号处理里的时域分析。如果在搜索信号处理特征提取资料时碰到这个词,不要混淆。它不参与MFCC、FFT之类的特征计算。

这里顺带澄清另一个相关热词“方位向压缩是压缩的频域还是时域”。这属于合成孔径雷达(SAR)成像里的概念。方位向压缩是在方位向(雷达平台运动方向)进行匹配滤波,本质上是把方位向信号与参考函数做相关运算,既可以视为时域卷积操作,也可以在频域通过相乘实现。因为匹配滤波在频域就是乘积,所以工程实现上通常放到频域做。它不是信号特征提取的范畴,但理解“在频域实现等效时域压缩”的思路,对理解频域处理的桥梁作用很有帮助。

6. 落地项目时绕不开的细节与取舍

6.1 频谱泄漏与窗函数选择的经验法则

FFT的频谱泄漏问题,很多入门者一开始意识不到。加矩形窗,信号截断的边缘会引入假的高频分量;加汉宁窗,泄漏减少了,但主瓣变宽,两个靠得很近的频率峰可能无法分开。

根据信号特点选择窗函数的基本经验是:

  • 分析连续平稳的振动信号、做常规频谱监测:用汉宁窗,频谱主瓣与旁瓣综合平衡最好。
  • 分析瞬态冲击信号:用矩形窗,保留冲击的完整时域特征。
  • 需要精确测量幅值:平顶窗(flat top)的幅值精度最高,但主瓣最宽。
  • 需要分离两个幅度差异很大、频率接近的成分:布莱克曼窗的旁瓣衰减最快,适合压制弱峰被强峰拖尾掩盖的问题。

这些选择直接影响后续频域特征(主频、谱质心、频带能量)的准确性。频谱泄漏严重的FFT做出来的谱质心会偏向高频方向,因为泄漏把低频主峰的能量向两侧铺开。

6.2 频带划分的实践原则

频带能量是故障诊断中使用频率最高的频域特征,但频带怎么划分,很多人凭感觉拍脑袋。划分方式不同,特征对故障的敏感度差别很大。

频带划分的基本原则是围绕设备的结构特征频率展开。旋转机械的振动频谱往往形成以转频 (f_r) 为基频、包含整数倍频的谱线族。诊断时可以按1倍频到10倍频逐条提取窄带能量,或者按低频段(<1倍频)、1倍频附近、2倍频附近、3到5倍频、6到10倍频、高频段(>10倍频)分成几大块。这样划分的物理含义很清晰:不平衡主要激起1倍频,不对中通常激起2倍频的显著增大,松动和裂纹往往在不同倍频上产生不同模式的响应。

齿轮箱诊断往往会按啮合频率 (f_m = Z \cdot f_r)(Z为齿数)及其上下边带频率来划分频带。啮合频率附近的边带能量增加,代表齿轮存在局部损伤或齿面磨损。轴承诊断则围绕轴承特征频率(外圈BPFO、内圈BPFI、滚动体BSF、保持架FTF)计算窄带能量。频带划分不该随意选择,应该根据对象结构的传动机理去定。

6.3 站在模型视角反推特征质量

如果你做特征提取的目的是喂给机器学习模型做故障分类,建议先想清楚模型需要什么样的特征,再决定提取方案,而不是先一股脑提取几百个特征再说。

特征的质量要从四个维度去评估:

  • 可分性:不同类别之间特征值的差异是否明显大于同类别内部的波动。可以用类间距离与类内方差的比值衡量。
  • 稳定性:同一设备在相同工况下反复测量,特征值重复性如何。时域RMS这类统计量稳定性好,而瞬时峰值的稳定性相对较差。
  • 物理可解释性:特征出了问题,能不能回到物理层面解释。峭度升高对应冲击,谱质心偏移对应能量重心改变——这些都可以解释。线性组合出来不知所云的抽象特征,用于论文可以,用于现场诊断要谨慎。
  • 鲁棒性:特征值在工况波动(转速、负载变化)下是否剧烈突变。如果转速从1000转/分跳到3000转/分,特征值变化比故障引起的还要大,必须做工况归一化或分段建模。

经验数据表明,在工业故障诊断项目中,往往20到30个精心挑选的时域加频域特征,配合树模型或线性模型,就能达到90%以上的分类准确率。不是特征越多越好,而是需要覆盖信号的不同侧面、有物理依据、计算稳定。真正决定模型上限的,往往是对特征物理含义的深度理解,而不是算法本身。

6.4 时域频域特征联合使用的典型套路

实际项目里最有效的做法不是单独使用时域特征或频域特征,而是把两组特征组合成一个向量,再进入分类器或回归模型。我惯用的组合方式是:

先计算时域特征包(均值、RMS、峰峰值、峭度、偏度、峰值因子),再从功率谱中提取频域特征包(主频、谱质心、1倍频到10倍频窄带能量、低中高频段能量占比)。然后把两组特征拼在一起,做特征归一化(一般用z-score),再送入模型训练。

归一化这步必须做,因为特征值的量纲差异很大:峭度可能在3到10之间,RMS可能是0.01到10,窄带能量可能是1e-5量级。如果不归一化,量纲大的特征在距离计算中会彻底压制量纲小的特征,模型就学不到峭度、峰值因子这些敏感指标的作用了。归一化参数必须只基于训练集计算,再用同一套参数对测试集做变换,否则会造成数据泄漏、高估模型性能。

另外,当转速或负载在工作过程中有变化时,建议先把特征值按转速/负载分箱归一化,再做建模。比如转速在1000转/分和3000转/分时,同样的故障引起的RMS会差出好几倍,不做工况归一化,模型会把转速差异误判为故障差异,误报率居高不下。

6.5 工程中容易忽略的几个小细节

最后分享几个经常在项目里踩到、但参考资料很少提起的细节。

第一,FFT之后取幅度谱时,别忘了去除FFT点数N造成的缩放效应。很多人直接用 abs(fft(x)) 取出来的值当幅值用,结果比自己预期大了N倍,懵了半天。完整的幅值计算是 abs(fft(x)) / N,单边谱再乘2。这个细节写进各种教程里都有,但实际项目里因为复制粘贴旧代码导致的结果错误,我遇见过不止一次。

第二,计算频带能量时,直流分量(0Hz)要单独处理或直接丢弃。直流分量反映的是传感器零偏或均值,不属于交流振动能量。如果不剔除,当传感器存在漂移时,低频段能量会被直流偏置严重影响,特征失真。

第三,波形数据采集时的抗混叠滤波器,比事后一切处理都重要。硬件上如果没有抗混叠滤波,高于奈奎斯特频率的信号会折叠回分析频带产生假峰。这类假峰在频域特征里要么造成主频错位,要么在高频段产生虚假能量。事后软件处理很难完全纠回,只能在采样环节就保证硬件的抗混叠设计合格。

第四,长时程数据的稳定性评估。做设备健康监测时,单条数据的特征值没有意义,必须连续采集多段数据,做特征值随时间的变化趋势分析。单独一次峭度从3升到4可能是噪声扰动,连续五段都稳定在4以上且持续升高,才是真正的异常征兆。趋势信息往往比单点阈值更具诊断价值。

6.6 什么时候该信时域特征,什么时候该信频域特征

把时域特征和频域特征放在一起对比后,我会给出一个简单的决策经验:

  • 当故障表现的差异主要体现在幅值水平剧烈变化、冲击特性突出时,时域特征优先。例如转子碰磨、轴承初期冲击、传感器松动。
  • 当故障差异主要体现在频率成分分布变化,而总体能量几乎不变时,频域特征优先。例如齿轮磨损引起的谐波变化、共振频率偏移、轴承损伤由外圈向内圈转移引起的特征频率变化。
  • 当两者结论矛盾时,先查数据质量,确认采集链路没有异常,再回到现场核对设备实际状态。数据质量问题的概率远高于算法问题。

能覆盖更多信号信息不等于越复杂越好。特征提取的核心是找到与目标物理过程强相关的可测量量,它需要数字上的可计算性,也需要物理上的可解释性。时域和频域只是两个入口,真正有价值的是你判断特征与对象状态关联的能力。

本文还有配套的精品资源,点击获取

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

LLM概率输出并非贝叶斯?量化内部一致性的方法与工程实践

LLM 输出概率看起来像“信念”&#xff0c;但严格说&#xff0c;它不一定符合贝叶斯规则。这个问题在越来越多团队里浮出水面&#xff1a;把大模型当“概率模型”用&#xff0c;拿它输出的置信度做筛选、排序、风险判断&#xff0c;结果经常出现矛盾。比如同一个模型对“明天下…

作者头像 李华
网站建设 2026/9/1 13:34:16

CNC程序传输实战:从RS-232到以太网,新手必学的机床通信指南

1. 背景与核心概念在制造业和机械加工领域&#xff0c;CNC加工中心是当之无愧的“工业母机”核心。对于刚入行的新手而言&#xff0c;面对庞大的机床、复杂的控制系统和密密麻麻的代码&#xff0c;常常感到无从下手。本系列教程旨在用30天的时间&#xff0c;系统性地带你从零基…

作者头像 李华
网站建设 2026/9/1 13:30:40

Python自动抢券脚本:精准卡点与并发请求实战

简介&#xff1a;这是一款面向电商活动抢券场景的自动抢券脚本可运行源码包&#xff0c;适合具备一定JavaScript与浏览器自动化基础的前端学习者参考实践。脚本围绕半自动化抢券需求&#xff0c;重点解决刷新时控制台代码保留、目标按钮定位与点击、脚本页面自动关闭等关键问题…

作者头像 李华
网站建设 2026/9/1 13:29:40

Obsidian+Codex:用AI打造自动化个人知识库工作流

很多朋友会把 Obsidian 当成一个“能打标签的 Markdown 编辑器”来用&#xff0c;结果笔记越堆越多&#xff0c;资料越存越乱。想把一个网页内容整理成笔记、把一段录音转成文字稿、把一堆零散灵感组织成一篇完整文章&#xff0c;都得靠手工完成&#xff0c;效率很低。 Obsidi…

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

联想技术服务与开发质量类笔试复盘:题型拆解与备考策略

秋招季投联想集团的人向来不少&#xff0c;但“技术服务&开发质量类”这个方向&#xff0c;很多同学直到笔试前都没完全搞明白自己到底在考什么。我今年亲身走完这一轮之后&#xff0c;最大的感受是&#xff1a;这个岗位的笔试并不难&#xff0c;但它考的东西很“杂”&…

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

Chatbox 快速指南:桌面AI客户端的3个实战场景

Chatbox 快速指南&#xff1a;桌面AI客户端的3个实战场景 【免费下载链接】chatbox Powerful AI Client 项目地址: https://gitcode.com/GitHub_Trending/ch/chatbox 如果你想在电脑上直接和 AI 聊天、写代码、出图&#xff0c;又不想折腾任何开发工具&#xff0c;Chatb…

作者头像 李华