信号处理完整工作流:从“假设信号x”到特征提取

发布时间:2026/10/22 21:49:27
信号处理完整工作流:从“假设信号x”到特征提取 “假设我们有一个信号x”这句话我太熟悉了。不管是做通信算法、音频处理、振动监测还是写论文搞科研几乎每一次技术讨论、每一段示例代码、每一篇方法论文章都是从这句话开始的。乍一听它像是一个偷懒的开场白但实际上这短短几个字背后藏着一整套严谨的工程思维链条信号从哪里来它承载了什么信息你打算怎么观察它、处理它、从它里面把有用的东西捞出来很多刚入行的朋友容易卡在这一步拿到一个“信号x”盯着波形图看了半天不知道下一步该干什么。这篇文章我想结合自己这些年做信号处理的实际经验把“假设我们有一个信号x”这句话背后的完整工作流拆开讲清楚——从最基本的分析思路到频域变换的原理再到一套可以直接上手的实操流程最后聊几个我踩过的坑。无论你是做科研、搞嵌入式还是单纯想把手里的传感器数据处理好这篇都能给你一个可以参考的框架。1. 拆解“信号x”背后的问题链1.1 从一句话到一个完整任务“假设我们有一个信号x”其实省略了太多信息。x是电压是温度是加速度是麦克风采集到的声音还是通信接收机解调出来的基带波形这些不同来源的信号分析手段天差地别。我自己带过不少新人发现大家最容易犯的毛病就是拿到信号就开始套算法不管三七二十一先做个傅里叶变换再画个频谱图看着几个峰值就开始下结论。结果经常是南辕北辙。所以第一步不是急着处理信号而是先把问题链补全。我在实际项目里通常会把“信号x”拆成五个问题信号是哪里来的传感器类型是什么采样方式是什么我关心的特征在哪个域里表现最明显时域频域还是时频域信号里的噪声是什么类型是白噪声、工频干扰、还是突发脉冲我需要实时处理还是可以离线分析这决定了算法复杂度的上限。最终输出是什么一个数值一个判断结果还是一条曲线这五个问题问完原本模糊的“信号x”就变成了一个清晰的任务定义。举个具体的例子某次做一个设备状态监测的项目原始需求就一句话“分析这个振动信号判断设备有没有异常。”等我到现场了解清楚后才发现信号来自加速度传感器采样率20kHz关心的特征是轴承故障的特征频率而现场环境里有强烈的电磁干扰采集到的信号里混着明显的工频噪声。这样一来后续走的每一步都是围绕这些约束展开的完全不是拿到信号就盲目分析。1.2 信号的“域”决定了分析思路理解信号最关键的一步是理解“域”的概念。同一条信号曲线从不同的维度去看能获取完全不同的信息。举个生活中特别贴切的例子你听一首交响乐耳朵接收到的是随着时间起伏的声波这叫时域表示但如果有人问你“这首歌里有哪些乐器”你脑子里反应的其实是各个乐器对应的频率成分哪个频段是小提琴、哪个频段是大鼓这就是频域思维。在信号处理里我们最常用的就是这两个“域”时域看波形随时间的形态频域看信号由哪些频率分量构成。大概十年前我自己做一个语音端点检测的小项目时一开始满脑子都是时域能量阈值折腾了很久效果总是很差。后来换了个思路先看语音段和静音段在频域上的能量分布差问题一下子就迎刃而解了。这个经历让我养成了一个习惯拿到信号先问自己“我关心的特征在哪个域更明显”而不是闷头做变换。另一个容易被忽略的是“时频域”。如果信号本身是平稳的也就是统计特性不随时间变化那频域分析就足够但如果信号是非平稳的比如语音、脑电、机械启停过程的振动那单独看频谱会把时间信息完全抹掉。这时候就需要短时傅里叶变换、小波变换这类时频分析工具把“什么时间出现什么频率”同时展现出来。1.3 采样一切分析的地基说完“域”必须提“采样”。数字信号处理和连续信号最本质的区别就是我们把连续时间上的信号变成了离散的点。一个很容易被忽略的事实是采样一旦完成信息的上限就定死了后续任何算法都补不回来。采样定理是这行的基石讲的是为了能无失真地恢复一个最高频率为f的连续信号采样率必须大于2倍的f。注意“大于”不是“大于等于”等于2倍只是个数学理想边界实际工程里至少留20%到50%的裕量。我以前有一次做音频采集理论算着信号最高频率是8kHz采样率给了16kHz不多不少结果做出来的频谱在高频段总有一层奇怪的雾查了半天才发现是抗混叠滤波器滚降不够采样率太贴近理论值了。后来老老实实把采样率提到了22.05kHz问题当场消失。这里给新手一条可以直接抄作业的经验采样率的选择顺序是先确认信号的最高关心频率然后乘以2再乘以1.5到2倍的裕量系数最终数值优先从设备支持的档位里挑一个够用的不要盲目追求高采样率。采样率过高数据量指数上涨处理速度变慢过低信息直接丢失。我见过有人采集振动信号一上来就设100kHz结果一个小时的实验数据占了好几个G处理起来卡得要命其实关心的故障特征频率最高的也才3kHz这纯属自己给自己找麻烦。2. 核心概念与数学工具的选择逻辑2.1 为什么傅里叶变换是绕不开的工具傅里叶变换的核心思想说起来特别简单任何一个信号都可以看成是一堆不同频率、不同幅度、不同相位的正弦波的叠加。把一个信号从时域变到频域本质就是在回答一个问题“如果我这个信号是一锅汤那么每种‘频率’这个调料各放了多少”我习惯用一个比方来解释这件事假设你录了一段混合音里面有一个440Hz的纯音和一个1000Hz的纯音时域上它们合在一起变成了一个看起来毫无规律的波形但一旦做傅里叶变换频谱图上就会出现两根独立的谱线分别告诉你这两个频率存在、以及各自的强度。信号里有什么频率成分、对应强度多大一目了然。离散傅里叶变换DFT的公式写出来吓人实际用的都是快速傅里叶变换FFT算法。FFT不是一种新的变换只是DFT的快速计算方法把原本O(n²)的计算量压缩到O(n log n)。这中间的差别有多大呢处理1024个点直接算DFT要一百多万次运算FFT只需要一万出头。没有FFT我们现在绝大多数实时信号处理应用都是空中楼阁。所以你在任何一本信号处理教材里都会看到FFT不是因为它是唯一正确的方法而是因为它是把理论变成工程现实的钥匙。2.2 窗函数的取舍与频谱泄漏用FFT分析信号有一个前提你拿到的是一段有限长的数据。但真实信号理论上可以无限延伸强行截取一段就相当于把信号和矩形窗相乘这在频域上会带来“频谱泄漏”——原本一根干净的谱线能量会扩散到旁边的频率点上。频谱泄漏这东西干扰小的时候看着只是谱变宽了一点干扰大的时候弱信号直接就被强信号的泄漏尾巴淹没掉了。我自己做过一个多频信号检测的小实验两个频率只差了30Hz信号幅度相差40倍不加窗的时候小信号的峰完全看不见换成旁瓣滚降更快的汉宁窗之后小信号的谱峰就清楚浮出来了幅度也准了不少。选窗函数的核心逻辑是权衡主瓣宽度和旁瓣高度。主瓣越宽频率分辨能力越差两个相近的频率越难分开旁瓣越高泄漏越厉害弱信号越容易被掩盖。汉宁窗和汉明窗在两者之间取得了一个比较平衡的折中也是日常用得最多的两个。如果要求极高的频率分辨精度可以用矩形窗前提是你的数据刚好是信号周期的整数倍如果幅度精度比频率分辨更重要扁平顶窗更好用。我自己日常90%的场景都是直接上汉宁窗理由是它简单、可靠、参数不需要怎么调。关于加窗后幅度要乘以一个修正系数这件事放在后面实操部分讲。2.3 滤波器设计里的概念澄清滤波器和变换不一样。变换是把信号换个“域”观察滤波器则是直接改变信号的频率成分。一个低通滤波器就是让低频信号顺利通过把高频部分削掉高通滤波器反之带通滤波器则是只留中间一段。我刚学滤波的时候被很多概念绕晕过后来用大白话总结了一套截止频率信号的幅度衰减到原来的0.707倍也就是-3dB左右时的频率点。这个点不是悬崖是一个平滑过渡的分界。通带与阻带通带是希望保留的频率范围阻带是希望压掉的频率范围中间那段过渡越陡滤波器的“阶数”越高、计算越复杂。FIR和IIRFIR滤波器是有限冲激响应结构稳定、相位可以做到线性但同样的滤波效果需要更高的阶数IIR滤波器是无限冲激响应计算效率高但相位是非线性的而且设计不好可能不稳定。平时处理离线数据我推荐FIR省心做实时低延迟系统很多人选IIR因为同样的效果计算量小很多。设计滤波器时最经典的坑是直接把截止频率设成采样率的某个比例就完事完全不管过渡带宽度。事实上过渡带的带宽直接决定了能达到的阻带衰减和所需阶数这一块宁可预留充足也不要卡着极限设计不然做出来性能大打折扣。3. 实操全流程从拿到信号x到输出结论3.1 搭建一个可以复现的实验环境讲原理讲了这么多接下来进入正题给你一段“信号x”完整走一遍分析流程。先说环境我用的是某开源科学计算库跨平台、免费、生态成熟主要是身边同行都在用交流方便。完整的模拟信号构造、滤波、频域分析和特征提取几十行代码就能做完特别适合用来验证思路。import numpy as np from scipy import signal import matplotlib.pyplot as plt fs 1000 # 采样率 1000 Hz t np.arange(0, 1, 1/fs) # 1 秒时间轴 # 构造一个模拟信号50Hz正弦 200Hz正弦 噪声 x 2.0 * np.sin(2 * np.pi * 50 * t) 0.5 * np.sin(2 * np.pi * 200 * t) x 0.3 * np.random.randn(len(t))这段代码生成了一秒的数据采样率1000Hz里面有三个成分幅度为2的50Hz信号、幅度为0.5的200Hz信号、以及标准差0.3的高斯白噪声。真实场景里你手里的信号x当然不是这样造出来的大概率是某个采集设备给你的数据文件但只要文件能读成“时间轴数值数组”的形式后续流程就完全一样。我这里特意用构造信号而不是读真实数据是因为它能让你清楚知道“正确答案”是什么方便检验每一步分析是否正确。3.2 第一步总是先画图我不会一开始就做FFT第一件事永远是画时域波形。别看这一步简单信息量是真的大波形周期大概多少有没有明显的趋势项有没有偶发脉冲大致噪声水平怎么样这些从图上一眼就能看出来任何统计量都比不上。plt.figure(figsize(12, 4)) plt.plot(t, x) plt.title(时域波形) plt.xlabel(时间 (s)) plt.ylabel(幅度) plt.grid(True) plt.show()画完图之后我习惯再看一眼几条基础统计量均值是多少、方差多大、峰值是多少。均值如果明显不为零说明信号存在直流偏置频域分析的时候直流分量会霸占谱图底部让其他成分看起来小小的方差反映信号的整体能量水平峰值则提醒你是否存在超出预期的极端值可能是干扰脉冲或者传感器饱和。3.3 频域变换与频谱解读时域看一眼就够接触基本信息了接下来上FFT。这里有一个特别关键的操作细节FFT前一定要先做去均值处理把信号里的直流分量去掉否则频谱图零频处会有一个巨大的尖峰其余频率分量在同样的纵轴尺度下会显得几乎平贴地面。x_ac x - np.mean(x) N len(x_ac) X np.fft.rfft(x_ac, nN) # 实信号的单边频谱 freqs np.fft.rfftfreq(N, 1/fs) # 对应的频率轴 mag np.abs(X) / N * 2 # 单边幅度谱幅度恢复关于幅度的恢复这里补充一下numpy的FFT输出的数值和真实的信号幅度之间差着一个系数关系。对于单边频谱需要把模值乘以2再除以N才能让频谱峰值幅度和时域正弦波的幅度对得上。我一直觉得这个系数是新手最容易困惑的地方输出结果看起来很大或者很小原因可能根本不是代码错了而是忘了这个换算。窗函数这一步我同样没有落下。上面的代码用的是矩形窗相当于没加窗实际做分析时我会切到汉宁窗然后做幅度修正。加窗后的幅度修正系数是窗函数的相干增益汉宁窗大约0.5修正公式是mag np.abs(X) / np.sum(win) * 2。这样才能保证加窗之后测量出的幅度仍然准确。继续往下为了让频谱看起来平滑可靠功率谱密度是比幅度谱更常用的选择。它比直接看幅度谱更能反映能量随频率的分布峰值对比也更明显。用Welch方法来估计功率谱密度是工程上的标配做法因为它把长数据切成多段、各自做FFT再加平均能够显著压平随机噪声引起的谱波动。f, Pxx signal.welch(x_ac, fsfs, nperseg512, noverlap256, windowhann) plt.figure(figsize(12, 4)) plt.semilogy(f, Pxx) plt.title(功率谱密度 (Welch法)) plt.xlabel(频率 (Hz)) plt.ylabel(功率谱密度) plt.grid(True) plt.show()做出来你会看到50Hz和200Hz两处有明显的谱峰而且200Hz的峰比50Hz的低不少同时噪声底是一条平坦的曲线。这里就引出一个重要概念信噪比。一个分量要被清晰识别它的谱峰至少要高出噪声底几倍。有人说10dB够用我自己做特征提取的时候偏好至少20dB以上低于这个水平峰值幅度的测量误差就会开始影响最终结论。3.4 设计滤波器并按需提取特征很多场景下我们只需要信号中特定频段的信息比如只关心50Hz的振动分量那就用带通滤波器处理原信号再看时域波形或提取包络。滤波器的设计参数里有两个核心边界通带截止频率和阻带截止频率。比如要保留50Hz附近的分量我可能会设置通带40到60Hz阻带30到70Hz然后让函数自动算出最合适的阶数。from scipy.signal import firwin, filtfilt # 设计一个带通FIR滤波器通带 40~60 Hz过渡带各10Hz taps firwin(101, [35, 65], pass_zeroFalse, fsfs) # filtfilt做零相位滤波避免相位偏移 y filtfilt(taps, 1.0, x_ac) plt.figure(figsize(12, 4)) plt.plot(t, x_ac, alpha0.5, label原始信号) plt.plot(t, y, label带通滤波结果 (35~65Hz)) plt.xlim(0, 0.2) plt.legend() plt.grid(True) plt.show()滤波之后你可以明显看到输出变成了一条干净的50Hz正弦波那条200Hz分量和高频噪声都被抑制掉了。接下来要提取什么特征完全取决于前期的任务定义如果想知道振动幅度就提取滤波后信号的均方根值如果想知道设备的旋转频率有没有波动就提取瞬时频率如果想做故障诊断可以计算特征频率处的能量与总能量的比值。特征不是拍脑袋选的每一项都要对应前面定义好的问题。3.5 同步提取时域特征增强结论可靠性单独依赖频谱下结论有时不够踏实。还是那个设备监测项目有一回频谱上出现了微弱的边频带直接看去很难判断是真的故障还是谱泄漏的产物。当时我做了一个补充分析把带通滤波后的信号做希尔伯特变换提取瞬时包络再观察包络的波动周期。如果包络存在周期性的调制并且调制频率和某个故障特征频率一致那基本就能坐实问题存在。这套“滤波加包络分析加频谱细看”的流程帮我避开了好几回误判。放在这个例子里就是滤波后求包络、再对包络做FFT、观察包络谱里有没有异常成分。这种多维度交叉验证的策略说不上复杂但在实际项目里非常好用。4. 常见问题与排查技巧实录4.1 采样率选择不当导致混叠混叠是数字信号处理里的头号杀手。当信号中含有超过奈奎斯特频率采样率的一半的成分时这些高频成分会被“伪装”成低频成分出现在频谱里而且混叠进来之后无法通过任何数字处理手段分清真假。我处理过一个具体案例某声音采集系统采样率32kHz麦克风本身能采集到50kHz的超声波信号。录完之后做频谱分析在6kHz附近发现了一个不明峰值折腾了很久最后把麦克风换成只响应20kHz以下的传感器再测那个峰值消失了。这就是典型的超声波混叠进了低频段。排查混叠的方法是改变采样率如果频谱里某个峰的位置跟着采样率改变而移动那几乎可以断定是混叠。解决方案有两个硬件上加抗混叠低通滤波器或者保证信号本身不含有超出半采样率的成分。4.2 频谱泄漏与频率分辨率的权衡频谱泄漏之前提过它最刁钻的表现是当两个频率非常接近时它们各自的泄漏尾巴叠加在一起让你根本无法分辨到底是两个独立频率还是只有一个宽谱峰。频率分辨率的物理极限是1/TT是分析窗的长度。比如1秒的数据长度理论上能分辨的最小频率间隔就是1Hz。要想分辨间隔0.5Hz的两个频率就得至少有2秒数据。增强频率分辨率的直接办法是延长时间窗长度还有一个更常见的手法叫零填充。但必须说清楚零填充并不能提高分辨率它只是让频谱曲线变得更光滑看起来像分辨率提高了。真正的频率分辨能力取决于有效数据时长不是FFT点数。我见过不少人把FFT点数加到很大频谱变细了但两个靠得很近的峰依然糊成一团就是这个原因。4.3 噪声环境下弱信号提取信噪比低的时候到频域看只有一个峰勉强露头怎么办最有效的策略不是盲目加长FFT而是分而治之先带通滤波砍掉大部分无关频段再做窄带分析或者用锁相放大器的思路让参考信号和待测信号做相关运算。相关检测的原理也很朴素噪声是随机的和参考信号的相关性趋近于零而目标信号和参考信号频率一致相关性很强。把信号乘上参考信号再长时间积分噪声被平均掉了目标信号就浮现出来。有一次我做一个微弱光电信号的测量实验现场噪声比目标强几百倍就是这个相关检测的思路把信号从噪声底里捞出来的。4.4 数据离线分析与实时处理选型离线分析和实时处理是完全不同的工程路径。离线分析就是把数据存下来慢慢算FFT、小波变换、零相位滤波随便上算法复杂度高一点也无所谓。实时处理则要求在下一个采样点到来之前完成计算这时需要认真优化算法流程和缓存策略一般来说FIR滤波器的效率比IIR低、但相位可控短时FFT开销不小。我的建议是先把离线分析做对证明算法思路可行再谈实时化改造。反过来一上来就追求实时往往是算法还没验证清楚就把系统做死了。4.5 搭建一个简易的排查速查表把多年的经验浓缩成一张排查速查表方便大家遇到问题直接对号入座现象可能原因排查方法频谱0Hz处有巨大分量信号含直流偏置做去均值处理后重新分析频谱出现不明峰且峰值移动采样率不足导致混叠改变采样率验证加抗混叠滤波两个相近频率糊成一团频率分辨率不足延长数据时长勿迷信零填充弱信号被背景掩盖噪声太大 或 窗函数旁瓣过高带通滤波换旁瓣更低的窗滤波后波形畸变严重滤波器阶数过高或相位失真换FIR和零相位滤波(filtfilt)实时处理跟不上节奏算法复杂度超限优化滤波器结构降低采样率这张表是我自己排查时反复用到的里面每一行都踩过对应的坑。它不是什么高深理论就是经验和规律的集合。5. 对信号x认知的再深入5.1 从分析单个信号到处理成批信号单个“信号x”分析方案定下来之后你会发现真正麻烦的不是算法而是如何把它推广到成百上千条信号上。打个比方单条信号分析就像手工打磨一件样品而成批处理就是上流水线你要把参数选择从“手动调”变成“自动定”要写脚本批量循环要把分析结果整理成固定格式的报表。我自己的习惯是先拿三五条信号把代码流程跑通确认每一步的输出都符合预期然后扩大到一个更大的数据集上跑批处理同时加一些防护逻辑比如某条信号文件为空时跳过并记日志某条信号长度不足时自动舍弃。这样跑完拿到的是一个汇总表格每条信号对应一组特征指标后续可以直接喂给分类器做自动故障诊断。5.2 特征选择与自动判断的加分项分析信号不是终点很多项目的终点是“根据信号特征自动给出判断”。比如设备状态监测的目标是区分正常和异常分类依据通常是频谱中若干特征频率的能量占比和趋势变化。特征选得好简单分类器也能做得准特征选得不好再复杂的算法也救不回来。我见过一个很典型的反面案例做振动信号分类时不加思考把所有频谱峰值都当成特征结果矩阵维度大、特征之间强相关分类器训练完之后在测试集上表现不错、一到现场就崩。后来做了特征相关分析删掉冗余特征、只保留几个有明确物理意义的特征频率幅值和比值模型立刻稳定下来。所以选特征时有个朴素原则优先选能够用物理原理解释的指标而不是单纯靠数据驱动堆维度。5.3 从“假设”走向“实践”的几个训练建议如果你想真正熟练这套“信号x”的处理流程光看文章是不够的。我的建议是动手做几个小实验先自己构造一个已知成分的模拟信号走一遍滤波、FFT、特征提取的完整流程确保每个输出都能解释然后加噪声、加干扰、改变采样率观察分析结果的变化方向是否符合理论预期最后找一段真实采集的信号不用说明书单靠探索把信号中的主要频率成分找出来。这个“假设我们有一个信号x”的表述之所以在工程和科研讨论里出现频率那么高就是因为它天然具备普适性——任何信号处理问题都可以从这句话出发逐步展开成一套有结构、有步骤的解决方案。你不需要知道信号x具体的物理来源也可以先搭建一套通用的分析管道再针对具体的物理背景去调整参数、增删模块。把这句话当成工具箱的起点后面能走的路比想象中要远得多。从我个人这些年处理过的信号来看真正决定分析质量的往往不是算法高不高级而是思路是否清楚、流程是否完整、每个参数背后是否都有依据。希望这篇内容能让你在下次听到“假设我们有一个信号x”时脑子里浮现的不再是一堆模糊的概念而是一条清晰的、可以立刻动手的执行路径。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询