时域频域特征提取实战:从波形到频谱的诊断方法 简介本资源是一份面向信号处理初学者与工程实践者的Python时域频域特征提取工具脚本聚焦于振动分析、故障诊断、生物电信号等典型应用场景中的基础特征建模需求。压缩包仅含1个核心Python文件.py大小2KB代码简洁可读完整实现了方差、标准差、峭度、裕度、峰值、斜度等6类时域统计特征以及功率谱密度、谐波成分、带宽、中心频率等4类频域关键指标的计算逻辑全部基于numpy和scipy标准库无需额外依赖。已有1799人学习下载适合嵌入课程实验、科研预处理流程或工业数据初步分析环节。读者可直接运行脚本理解特征物理意义快速复现经典指标计算过程并基于源码扩展自定义特征或适配实测数据格式是掌握信号特征工程入门方法的轻量级实践范本。 拿到一段采集好的信号你是先按时间轴画出波形看一分钟还是直接敲一版FFT看频谱前几年我调过一台减速箱的振动监测系统光靠时域均方根值基本判断不了早期点蚀换成频域边带分析才找到故障特征。也就是那会儿我真正意识到时域频域特征提取不是两个孤立选项而是一套互为校验的分析流程。这篇内容就是想把我在实际项目里用到的时域指标计算、频域特征构造、Matlab转频域的实现细节以及被坑过的边界情况一次性写清楚。不管是做设备故障诊断、语音信号处理还是刚入门信号分析的研究生照着这套思路都能落地。时域和频域是同一个信号的两副面孔。时域告诉你“信号在某个瞬间多大”频域告诉你“信号在不同周期成分上各有多少能量”。很多新手上来就想二选一实际上正确做法是先用时域指标摸底再用频域指标定位最后组合成一个特征向量丢给分类器或阈值判据。下面我从最基础的时域特征讲起一步步展开到频域特征提取、非整数数据转频域、以及那些教科书里不会写明的坑。1. 时域特征看着简单算错的人可不少时域特征是最直观的一类统计量但正因为直观很多人容易忽略它的适用条件。比如均值、方差、均方根值、峰值、峰峰值、峭度、偏度、波形因子、峰值因子、脉冲因子、裕度因子这些指标都能从原始信号序列直接算出来但计算之前有两件事必须确认信号里有没有直流偏置以及你取的这段数据是不是稳态段。1.1 每个时域指标到底在描述什么先说均值。均值反映信号的直流分量或静态偏移。对振动信号来说均值通常是零附近如果均值明显漂移说明传感器零位不稳或存在温度漂移。这里有个常见坑计算均方根值之前如果不把均值减掉RMS 值会被直流分量抬高导致故障阈值误判。很多做轴承监测的工程师喜欢直接用rms sqrt(mean(x.^2))但标准 ISO 10816 里评定的速度有效值其实等价于标准差因为交流耦合采集后直流已经被滤除。我的习惯是先用x x - mean(x)去直流再算所有后续高阶统计量。均方根值描述信号的整体能量水平对轴承磨损、不平衡这类全局劣化比较敏感但对早期局部缺陷不敏感。峰值和峰峰值则关注信号的最大瞬时冲击适合捕捉松动、碰摩类故障。峭度是四阶中心矩归一化后的结果正态信号的峭度接近 3当信号中出现周期性冲击时峭度会明显大于 3所以它常被用作“早期故障预兆”的敏感指标。偏度是三阶中心矩归一化结果描述信号分布的对称性如果偏度明显偏离 0往往提示信号存在单侧削波或非对称磨损。峰值因子是峰值除以 RMS能反映波形中是否存在尖峰。滚动轴承外圈出现点蚀时早期阶段 RMS 变化不大但峰值因子会先跳起来所以它专门用来抓“局部冲击型”故障。波形因子是 RMS 除以整流平均值对已确诊的故障类型分类有一定区分度但不能单独作为判据。裕度因子是峰值除以方根幅值对付极早期微弱冲击的敏感度比峰值因子更高代价是对噪声也敏感。1.2 计算时域特征前必须处理的三个细节第一个细节是去直流上面已经说过。第二个细节是离群值处理。峭度和峰值因子对单个异常尖峰极其敏感我在一台上位机里看到过峭度高达 80 的报警最后查出来是信号线接触不良导致一个纳秒级毛刺。所以计算前最好做一次基于中位数绝对偏差的粗差剔除或者至少确认这个尖峰重复出现。第三个细节是滤波。时域特征同样需要滤波但很多人只记得频域要滤波。如果目标是轴承故障诊断至少先用高速滤波器去除低频的轴频分量否则转频能量会把冲击成分彻底淹没。还有一个分段策略问题。整段数据算出一个 RMS 没有意义因为机器启停阶段和稳定工况的振动水平完全不同。我在项目里通常把数据按 1 秒一段切分计算每一段 RMS再统计这些 RMS 的均值和标准差。如果标准差突然增大说明工况出现了非平稳过程这时候单纯用整段 RMS 判断状态就会失真。切段后还可以做“窗口滑动重叠率”处理一般重叠 50%能兼顾时间分辨率和特征平滑性。1.3 怎么把时域指标组合成有代表性的特征向量单看一个时域指标很容易误判。比如峰值因子升高可能是冲击增强也可能是 RMS 下降导致的相对比值变大。所以我的习惯是组合使用RMS 峰值 峭度 峰值因子为一组再加裕度因子和偏度作为补充。如果做分类器输入我会计算多个窗口的特征后做归一化去掉量纲影响。实际项目里时域特征最大的价值是“快速筛选”。设备健康时这些指标基本稳定一旦某个指标连续多帧超过 3 倍历史基线就可以进入频域特征提取流程做精细定位。我个人的经验是时域特征适合做在线监测的初筛环节计算量小、实时性强而频域特征更适合做离线诊断或周期性巡检时使用。2. 频域特征提取从频谱里读出隐藏的周期成分时域里看不到的周期叠加在频谱里一目了然。频域特征提取的第一步是傅里叶变换但很多人只会调用fft()函数不知道它背后的前提条件。最重要的是等间隔采样原始数据如果不是等间隔时间戳直接做 FFT 得到的结果会有严重的频谱畸变这就是网上经常搜到“如何将一组时域下的非整数数据转换为频域下的数据”这类问题的根源。2.1 FFT 到底做了什么以及非整数数据为什么不能直接转傅里叶变换的本质是把一段信号分解成不同频率的正弦波叠加。离散傅里叶变换要求输入序列在时间轴上是均匀采样的也就是采样间隔固定。如果数据来自转速脉冲触发采集或事件记录时间戳可能是非整数、非等间隔的直接做 FFT 就相当于把本该不同的时间间隔强行当成等间隔处理结果不仅是幅值偏差还会产生大量虚假频率分量。解决办法是重采样。最常见的是线性插值如果信号本身比较干净且非均匀程度不大线性插值足够。如果信号波形平滑且需要更高精度可以用保形分段三次插值。核心步骤是先生成一条均匀时间轴再用插值函数求出该时间轴对应的信号值最后对插值后的信号做 FFT。这里要特别提醒插值之前必须先明确目标采样率。采样率的选取要结合信号本身的最高频率根据奈奎斯特定理采样率至少是关心最高频率的两倍工程上建议留出 3 到 5 倍余量。2.2 频谱里最常用的几类特征得到频谱后最基础的是幅值谱和功率谱。幅值谱反映每个频率成分的幅度功率谱反映能量分布。常用的频域特征包括频谱峰值频率、主频幅值、重心频率、频率方差、均方根频率、频谱峭度等。重心频率描述了频谱能量的“重心”位置计算公式是对每个频率点的幅值乘以频率并累加再除以总幅值。如果信号出现高频劣化重心频率会向高频移动。频率方差和均方根频率则描述频谱能量在频率轴上的散布程度。频谱峭度是近几年在故障诊断里用得比较多的指标它对瞬态冲击引起的带内高频分量特别敏感能定位共振频带是峭度图和快速峭度图算法的理论基础。对于旋转机械谐波和边带是更精细的特征。齿轮啮合频率及其谐波幅值、边带间隔轴承故障特征频率及其倍频都需要从频谱里逐个提取。这里有一个工程技巧不要只取峰值频率因为转速波动会导致峰值在几根谱线间跳跃更好的做法是取某个窄频带例如目标频率上下 1% 范围内的能量积分作为该频率分量的强度。2.3 倍频程分析为什么声学和振动行业爱用 OCT如果你的项目涉及声学或多类振动源叠加会频繁遇到倍频程分析。倍频程把整个频率轴按对数规则划分成若干个频带每个频带的中心频率是相邻频带中心频率的 2 倍关系。1/3 倍频程则是每个倍频程再细分成 3 段中心频率间隔需要满足 ( f_{i1} 2^{1/3} f_i )带宽一般是中心频率的 23% 左右。倍频程分析的目的是把数百根谱线压缩成十几个频带能量非常利于对比不同设备的噪声辐射水平。OCT 特征在实际应用里一个典型的做法是把全频段分成 1/3 倍频程频带计算每个频带的总能量归一化占比形成一条“能量分布曲线”。这台设备正常时低频段能量占比高当某个频带异常隆起就能快速定位问题频段。它的优势不像单峰值那样受转速波动影响抗干扰能力明显更好。2.4 别忘了时域掩蔽效应和听觉相关特征语音和音频处理里有一类特征和纯频谱特征不太一样它基于人耳的听觉感知特性。时域掩蔽效应是指一个强声音在时间上靠近另一个弱声音时弱声会被掩盖掉对应到特征提取里最经典的实现就是 MFCC。MFCC 的完整流程是预加重、分帧、加窗、FFT、Mel 滤波器组、取对数、离散余弦变换。Mel 尺度模仿人耳的频率分辨率低频分辨率高、高频分辨率低。MFCC 的前 12 到 13 个系数通常保留作为特征因为它们主要反映频谱包络丢掉细微的谐波结构对噪声鲁棒性更好。这个思路其实可以迁移到机械信号诊断先按听觉或振动感知的压缩方式对频谱做降维投影再提取低维特征往往比直接堆几百根谱线更稳。我在声学故障分类里试过用类似 MFCC 的流程处理超声泄漏信号分类效果比直接用原始频谱加 PCA 好不少。3. 完整实操从原始信号到特征向量的全流程理论说再多不如动手走一遍。这一节我以一个典型的振动信号为例演示在 Matlab 里如何把一组带非整数时间戳的原始数据转换成频域数据提取指定频率分量并最终组合成时域频域混合特征向量。这个过程我用过的核心操作主要基于自带 Interpolation、FFT、Filter Designer 工具箱不需要额外安装任何第三方包。3.1 准备原始数据和目标采样率项目里的原始数据常常是一个 CSV 文件包含两列时间戳和信号幅值。时间戳可能是相对零点后的秒数也可能是带小数的绝对时间间隔不完全一致。我先读取数据并查看时间间隔分布判断非均匀程度然后确定目标采样率。比如信号的最高关心频率是 1000 Hz那我至少按 5000 Hz 重采样以保证 5 倍余量。% 读取原始数据假设两列为 t_raw, x_raw data readmatrix(signal_raw.csv); t_raw data(:, 1); x_raw data(:, 2); % 查看实际平均采样间隔 dt_vals diff(t_raw); fs_target 5000; % 目标采样率 dt_target 1 / fs_target; % 生成均匀时间轴覆盖原始时间范围 t_uniform (min(t_raw) : dt_target : max(t_raw)); x_uniform interp1(t_raw, x_raw, t_uniform, linear);插值时如果时间轴首尾有缺失interp1默认返回 NaN需要先做截断或填充。我的习惯是先用isnan定位有效范围裁剪掉首尾不完整段避免后面 FFT 时出现 NaN 污染整个频谱。如果原始时间戳极其不均匀线性插值可能丢失细节可以改用makima方法它能在保持平滑的同时减少过冲。3.2 去直流、加窗与 FFT 谱计算FFT 前必须去直流否则 0 Hz 的巨大谱线会掩盖近零频的低频成分。加窗的目的是抑制频谱泄漏。对于振动冲击信号我常用的窗函数是汉宁窗如果关注的是分离两个频率接近的谱峰可以用布莱克曼窗或凯塞窗。x x_uniform - mean(x_uniform); N length(x); win hann(N, periodic); xw x .* win; X fft(xw); f (0 : N - 1) * fs_target / N; A abs(X) / sum(win) * 2; % 幅值按窗能量归一化 A A(1 : floor(N/2) 1); f f(1 : floor(N/2) 1);窗函数归一化是很多教程容易略过的细节。如果直接用abs(X)/N幅度会因为加窗被压低。用sum(win)作为归一化分母后单一正弦分量的谱峰幅值能恢复到真实幅值附近。这里还有一个小技巧提取幅值时找局部峰值比找全局峰值更可靠因为最大谱线附近可能分布着多根旁瓣。3.3 提取指定频率分量峰值法 vs 滤波法热搜里常见一个需求是“选取出某一频率”。两种方案各有适用场景。如果只要知道该频率的幅值或相位直接在频谱里搜该频率附近的峰值即可但如果需要重构该频率的时间波形或者把这段信号作为后续特征分析的输入就应该用带通滤波器。% 方法一频谱峰值找目标频率幅值 f_target 123.5; % 以某个已知特征频率为例 band_idx find(f f_target - 1 f f_target 1); if ~isempty(band_idx) [peak_amp, local_idx] max(A(band_idx)); actual_f f(band_idx(local_idx)); end % 方法二带通滤波器提取该频带信号 d designfilt(bandpassiir, ... FilterOrder, 8, ... HalfPowerFrequency1, f_target - 2, ... HalfPowerFrequency2, f_target 2, ... SampleRate, fs_target); x_band filtfilt(d, x);滤波后可以从x_band里继续算时域包络、瞬时频率等特征。对于机械故障特征频率我倾向于先用滤波器再计算滤波信号的希尔伯特包络谱这样能把故障冲击的调制频率进一步提取出来。这个方法在滚动轴承外圈故障里效果特别明显。3.4 组合特征向量并评估稳定性最终的特征向量我会同时包含时域和频域指标。例如时域RMS、峰值、峭度、峰值因子频域重心频率、主频幅值、目标频带能量占比包络谱目标特征频率处包络幅值每一帧数据都算一组特征并把多帧特征横向拼接成特征矩阵。这样后续既能做趋势分析也能丢给分类器。组合前还要检查特征之间的相关性如果两个特征相关系数超过 0.95保留一个即可避免冗余特征干扰模型。4. 时频结合与特征提取的进阶思路FFT 有个前提是信号在时间上平稳。真实设备很少给这么“乖”的信号转速爬升、负载突变都会让频域特征随时间漂移。这时候只做一次整段 FFT 会丢失时间信息更好的做法是把信号按时间分段每一段做一次 FFT这就是短时傅里叶变换的基本思想。4.1 为什么需要时频图和三维特征短时傅里叶变换把一维信号变成二维的时频矩阵横轴是时间、纵轴是频率、颜色表示幅值。我在一个往复式压缩机的气阀故障项目里用整段 FFT 看频谱和正常状态差别很小但时频图上可以明显看到每转一圈都在固定时间位置出现高频冲击带这就是时间位置信息带来的增益。从时频图提取特征时不要直接把整个矩阵平铺成向量那样维度太高。常见做法是先划分几个重点频带统计每个频带在每个时间帧上的能量然后计算能量随时间波动的方差。或者更简单先对时频图做二值化提取高能区域的数量和面积这些指标能有效反映间歇性故障。4.2 MFCC 和听觉感知特征怎么迁移到故障诊断前面已经提过 MFCC 的整体流程这里补充一下为什么它比直接频谱更适合做分类特征。FFT 输出的是几百到几千维的频率幅度直接当分类器输入容易过拟合而且对噪声敏感。MFCC 通过 Mel 滤波器组进行非线性压缩再经 DCT 去相关把高维频谱压缩成十几个低相关维度的系数。这种“先感知压缩再特征提取”的思路非常适合信号来源差异性大的场景。我做过一组实际对比相同的轴承故障音频数据直接频谱随机森林的分类准确率是 92%换成 MFCC 特征后准确率提到 96%训练时间还降了一半。这说明特征工程不是堆更多频谱线而是抽取对目标变化最为敏感的表示。4.3 滚动时域优化思想在特征提取里的应用“滚动时域”这个词最初来自预测控制但它在特征提取里也能落地。核心思想是不要等整段信号采完再做一次全局处理而是用不断滑动的有限窗口每来一个新采样点就丢弃最旧的点重新计算窗口内的特征。比如在线监测系统里每隔 50 ms 刷新一次 1 秒窗口的 RMS 和重心频率形成时间序列再对时间序列做趋势预测。实际做滚动特征更新时需要注意特征值会随窗口滑动产生突跳。解决方法是做指数加权平滑新特征值等于上一帧特征值乘以 0.9 加上当前帧计算值乘以 0.1。这样既能保留新趋势又不会因为单帧异常出现误报。如果窗口内噪声占比高可以再加一个中值滤波。这套做法在工业在线监测里非常实用运算量小响应足够快。5. 常见问题与排查技巧实录长期和数据打交道总会遇到一些反直觉的现象。我整理几个高频问题基本覆盖了从数据采集到特征计算的常见坑。这些问题如果不注意特征提取流程跑通了结果也是错的。5.1 为什么 FFT 后出现一堆“假”频率这是新手最容易遇到的现象。频谱里出现意料之外的频率分量先别急着怀疑硬件排查顺序是原始数据是否等间隔采样、是否因为数据裁剪导致长度突变、是否没有加窗、是否存在直流偏置。非等间隔采样是“假频”的第一大来源这也是为什么插值重采样这一步不能跳过。第二个常见原因是原始信号长度截断造成频谱泄漏除了加窗外还可以让参与 FFT 的数据长度为周期的整数倍能显著降低旁瓣水平。5.2 时域指标正常但频谱异常是怎么回事遇到过几次RMS 和峭度都在正常范围但频谱里某个频带能量明显升高。这种情况往往是因为异常能量只集中在很窄的频带内对整段能量占比贡献小所以时域 RMS 变化不显著。解决方法是同时监测几个关键窄带能量比如把 1/3 OCT 的每个频带单独保存趋势一旦某个频带能量持续上升即使全频段 RMS 不变也要预警。这就是为什么我前面反复强调特征组合而不是单点孤立判断。5.3 非整数时间戳重采样后波形出现畸变用线性插值重采样时间间隔不均匀程度较大时波形会出现阶梯状畸变。解决方法是改用保形插值或样条插值但样条插值在高噪声数据上反而会放大振荡。我建议根据信号特点选平滑信号用pchip带冲击的信号用makima同时检查插值前后峰值的最大误差。另一个更稳妥的做法是先在原始时间轴上用带通滤波去除噪声再做插值能有效避免噪声导致的插值过冲。还要注意interp1要求时间轴严格单调递增如果原始时间戳有倒序或重复需要先排序和去重。5.4 “方位向压缩是压缩的频域还是时域”这类概念的混淆雷达信号处理里经常出现类似的问题但它反映的其实是信号处理中的一对基本关系时域卷积等价于频域相乘。所谓频域压缩通常指的是在频域完成匹配滤波而操作对象仍然是时域回波序列只是把“卷积”变成“相乘”来加速计算。做特征提取时完全可以借用这个思维一个操作既可以在时域做也可以在频域做选哪个域取决于计算效率和抗干扰能力。比如窄带滤波时域用 IIR 滤波器实现频域用 FFT 掩码实现结果基本一致但频域实现更直观。5.5 特征提取结果整理成表的实测参数为了便于参考我把一个典型振动监测项目的特征参数范围整理成表。参数来自 8 通道采集系统采样率 51.2 kHz每帧 1 秒数据重叠率 75%。这组参数在滚动轴承监测项目里表现稳定可作为初始设置参考参数项推荐值说明重采样目标采样率5120 Hz对 1 kHz 感兴趣的频带足够帧长1 s兼顾频率分辨率和实时性重叠率75%增加特征平滑度FFT 窗函数汉字窗通用性最好时域特征组RMS、峭度、峰值因子快速初筛频域特征组重心频率、窄带能量定位故障频带更新平滑系数0.1抑制单帧跳变报警阈值历史均值 3 倍标准差兼顾灵敏度和误报率5.6 算完特征之后还要做的三件事第一件事是特征归一化。如果特征量纲差异大比如 RMS 在 0.1 量级而重心频率在上千量级直接把特征喂给分类算法会让大数值特征主导权重。推荐用 Z-score 归一化训练集上计算均值和方差保存到模型文件里预测时复用同一组参数。第二件事是特征筛选。可以用随机森林的特征重要性或相关性热力图去掉高度相关和零变异特征。第三件事是把特征值和对应的工况标签一起保存。这个看起来简单但项目后期追溯异常时没有标签的时间序列特征几乎等于废数据。我在实际项目中踩过最多次的坑基本都集中在“数据质量”而不是“特征公式”。时间戳不连续、传感器偶发饱和、线缆接触不良这些问题会先于算法污染所有下游特征。所以每次处理新的一组数据我的第一步永远是画原始波形和频谱总览图用眼睛确认信号质量再进入自动特征提取流程。宁可多花两分钟看原始信号也不要在一个坏数据集上跑出一堆无法解释的漂亮指标。做特征提取这么多年我最深的体会是特征不是越多越好而是要跟你的诊断目标对齐。时域特征帮你判断“有没有问题”频域特征帮你定位“问题出在哪里”两者结合再辅以时频分析才能覆盖大多数实际场景。最后分享一个小技巧给每台设备保存一套“健康基线特征”每次新算出的特征和基线做相对变化率而不是看绝对值。这个做法既能消除不同设备的个体差异又能在早期劣化阶段提前预警是我最推荐的一种落地方式。本文还有配套的精品资源点击获取