
整理这份信号处理目录初稿时我自己先愣了一会儿不是因为内容太多而是发现最近被频繁问到的问题其实高度同源PPG信号处理在CSDN上搜出来的资料太散、ECG信号处理里的基线漂移总是消不干净、雷达信号处理里的匹配滤波到底解决了什么问题、统计信号处理基础Kay第二章的答案卡了多少人还有阵列信号处理和音频信号处理的各种细节。这些搜索词看起来各自独立背后却都指向同一个需求手头有一串真实信号不知道该从哪个环节下手。所以我把“Math 2.0”这个系列里的信号处理板块单独拎出来做了一份目录并且把目录本身写成一篇可以公开阅读的文章。这样做的原因很简单信号处理这门课的内容太多了如果没有一个全局地图直接冲进某个具体算法大概率会在半个月后忘掉上下文。这份目录先回答“要学什么、按什么顺序学、学到什么程度算会”再逐步展开每个专题的文章后续每更新一篇就在这里打一个勾。1. 为什么先把目录独立成篇1.1 这个系列不是什么先把丑话说在前面。我不会把信号处理写成一本“从公式到推导”的教科书复刻版。市面上已经有很多经典教材比如 Oppenheim 的《信号与系统》、Proakis 的《数字信号处理》、Kay 的统计信号处理系列任何一本都比博客里的几十篇文章完整得多。我要做的是一层“翻译和连接”的工作把教材里那些让人望而生畏的数学结论翻译成可以直接应对真实波形、真实传感器数据、真实业务指标的操作方案。所以这份目录不承诺从零手推所有公式重点放在三件事上建立信号处理的主干框架分清时域、频域、复频域、空间域各自解决什么问题把算法和场景绑定比如 ECG 的基线漂移、PPG 的运动伪影、雷达的距离多普勒处理这些场景不是孤立的它们共享大量底层数学工具提供可复现的实验路径让读者拿到代码后能在自己电脑上把每个关键步骤跑一遍。1.2 目录要回答的三个问题无论你是学生、算法工程师还是刚转行做可穿戴设备的开发者进入信号处理时都会遇到三个问题。这份目录就是围绕这三个问题展开的。第一个问题眼前这段波形到底是什么这对应信号表示、统计特性、时频特性。第二个问题怎样把有用信息和噪声分开这对应滤波、变换、估计、检测。第三个问题分离出来之后怎么变成决策这对应特征提取、分类器、阈值判断以及和机器学习接口的衔接。很多初学者一上来就查“ECG 信号处理 csdn”然后找到一堆滤波代码抄完发现效果并不好。原因不是代码不对而是跳过了第一个和第三个问题你连信号有什么成分、噪声长什么样都没分析直接套一个滤波器怎么可能稳定。1.3 信号处理在整个 Math 2.0 里的位置Math 2.0 这个系列原本是打算从数学基础逐步写到工程应用。信号处理被我排在第一梯队因为它是连接纯数学和现实数据最直接的一座桥。线性代数里的矩阵分解、微积分里的卷积与变换、概率论里的随机过程和估计理论几乎都能在信号处理里找到具体落点。反过来说信号处理也是很多热门技术的地基。雷达信号处理依赖傅里叶变换和匹配滤波阵列信号处理的波束形成本质是空间滤波音频信号处理里到处是短时傅里叶变换和倒谱分析ECG、PPG 这类生物信号处理则综合了滤波、峰值检测、统计估计。只要把信号处理的主干拉通后面看这些细分方向会轻松很多。2. 主线模块从时域描述到变换域分析的经典路径2.1 时域基础很多问题其实不需要频域信号处理里最容易轻视的是时域。很多人为了尽快进入 FFT、滤波器这些听起来有门槛的内容把信号表示直接跳过去结果后面读论文时经常卡在符号上。这个部分的规划包括三块内容。第一块是连续时间和离散时间信号的规范表示。到底什么是单位冲激、单位阶跃、复指数信号为什么它们在系统分析里有这么高的地位。第二块是用能量和功率对信号做粗略分类能量信号、功率信号、周期信号、随机信号不同分类决定了后续可以采用的分析工具。第三块是系统的基本性质线性、时不变、因果、稳定这些性质就像信号处理世界的法律很多算法能用什么方法、不能用什么方法全由它们决定。这里想强调一点时域不是“简单”而是“直白”。例如一个 ECG 信号里混入了 50Hz 工频干扰你在时域里看到的是信号被一条锯齿状叠加带“污染”了如果不先把工频干扰的位置和幅度搞清楚直接做高通滤波可能会把 QRS 波群的能量也削掉。这就是时域基本功的价值。2.2 傅里叶变换从“概念”到“工程手感”之间的距离傅里叶变换是整个主线里最大的节点。这部分要理顺的不仅是一个变换公式而是四个兄弟之间的关系傅里叶级数、连续时间傅里叶变换、离散时间傅里叶变换、离散傅里叶变换。工程上大量使用的 FFT其实是离散傅里叶变换的快速算法。这里有一个非常关键、也常被忽略的事实DFT 默认输入是周期延拓后的一个周期。如果你从一段实际信号里截取一个片段直接做 FFT频谱里会出现“频谱泄漏”本来很尖锐的谱线变成一片鼓包幅度还掉了不少。要缓解这个问题就得加窗对应的代价是主瓣变胖、频率分辨率变差。在这个模块里我会用一系列带噪声的正弦叠加信号来演示频率分辨率、频谱泄漏、加窗取舍而不是直接甩一个 FFT 论文级解释。理解了这层技术手感你再去看雷达信号处理里的多普勒谱估计、音频信号处理里的频谱图都会顺畅很多。2.3 采样定理与工程里的折中采样定理不是背一个“采样率必须大于最高频率两倍”的结论就结束了。关键在理解采样后频谱会发生周期性复制如果采样率不够复制出来的频谱分量就会叠在一起这就是混叠。一旦混叠发生你看到的高频分量其实是真实低频信号伪装出来的后续任何处理都无法完美还原。工程上只用理论采样率是危险的。真实传感器都有非理想特性信号里也常存在我们不知道的高频噪声所以必须引入抗混叠滤波器并且让采样率留出余量。比如音频 CD 的采样率是 44.1kHz理论上 20kHz 以上的信号人耳听不到但直接采到 20kHz 很容易混入各种杂散干扰所以前端通常先做低通滤波到 20kHz再采样到 44.1kHz。2.4 滤波器设计不要变成参数调参工关于滤波器主线里会同时覆盖 FIR 和 IIR 两类。FIR 滤波器最大的优点是线性相位波形形状不容易失真代价是阶数高IIR 滤波器效率高能用很低的阶数达到很陡的过渡带但相位响应往往是非线性的处理生物信号时要格外小心。实践中很多人直接用 scipy.signal.butter 设计一个巴特沃斯滤波器看到参数就调调不出来就换一个截止频率。这个思路非常危险。正确的做法是先搞清楚你想要的频率成分在哪儿、噪声频率在哪儿再决定滤波类型、截止频率、阶数。更要注意的是很多库里的离线滤波函数是零相位滤波它会用未来数据修正当前输出这在离线分析里是优势但如果要把算法搬到实时系统里就必须换用因果滤波器并接受相位延迟。3. 面向真实场景的分支模块ECG、PPG、雷达阵列与音频3.1 ECG 信号处理小信号、强噪声、医学级可靠性ECG 是我在生物信号处理里重点讲的一个例子因为它几乎包含了信号处理会遇到的所有典型问题。ECG 的幅值只有毫伏级采集时会混入基线漂移、肌电干扰、工频干扰、运动伪影而且 QRS 波群的形态对诊断非常关键滤波失真可能影响后续判断。这个模块的经典链路是先进高通滤波或中值滤波去除基线漂移再用陷波器去除工频干扰然后用带通滤波突出 QRS 波群的能量最后做峰值检测。Pan-Tompkins 算法是一个值得完整复现的经典方案它把滤波、差分、平方、滑动积分、自适应阈值串成了一条流水线。跟着这条流水线走一遍你对“为什么每一步要这么做”的理解会远超只看一篇博客。除了算法本身ECG 模块还会讨论真实数据的坑不同导联的基线漂移幅度差异、人体运动导致的电极松动、采样率不足导致的 QRS 变形。这些细节只能在处理真实心电图时感受到。3.2 PPG 信号处理光学测的“心率”为什么容易飘PPG 信号处理是这两年可穿戴设备带火的方向也是搜索热度最高的关键词之一。PPG 用光照射皮肤通过反射或透射光强变化测量血容量变化整个信号路径非常脆弱手指稍微动一下、环境光变一下、传感器贴合压力变化都会导致波形剧烈抖动。PPG 处理链路的重点是运动伪影消除和峰值检测。通常先做带通滤波把频带限制在 0.5Hz 到 5Hz 左右这样既保留心率所在频段又滤掉大部分低频漂移。但运动伪影往往和真实心率频带重叠单纯滤波会失效。更实用的方法包括基于加速度计的参考信号自适应滤波或者用状态机判断信号质量只在质量好的片段里计算心率。这里我想额外强调一个认知PPG 的峰值检测比 ECG 的 QRS 检测难很多因为 PPG 波形没有 ECG 那么尖锐而且容易受到呼吸、血管顺应性、体温等多种因素影响。看很多论文觉得效果很好实际部署时会发现每个人的波形都不太一样。3.3 雷达与阵列信号处理多了一个空间维度雷达信号处理会让大家看到傅里叶变换的另一重威力。雷达发射线性调频脉冲接收回波后做脉冲压缩本质上是匹配滤波对同一距离单元上的多帧回波做 FFT就可以得到多普勒频率也就是目标的速度。距离-多普勒图几乎是所有雷达算法的公共底盘。阵列信号处理则在时间维度之外引入了空间维度。通过不同天线位置接收同一信号利用相位差可以估计信号到达方向这就是 DOA 估计。最常用的思路是波束形成也就是对不同阵元信号做加权求和让波束指向某个方向同时抑制其他方向干扰。这部分数学比较硬但理解起来可以从“空间采样”这个类比入手天线阵列就是对空间位置进行采样阵元间距不满足半波长条件就会出现类似时间域混叠的空间混叠。我说过很多次阵列信号处理如果没理解波束方向图直接去调 MUSIC 算法是很痛苦的。3.4 音频信号处理非平稳信号的处理范式音频信号和 ECG、PPG 有个明显区别它是一个高度非平稳的信号几毫秒前和几毫秒后的统计特性就变了。所以音频处理不能直接对整段信号做一次傅里叶变换而是要把信号切成短帧对每一帧做 FFT再堆叠成频谱图。这个技术就是短时傅里叶变换也是音频信号处理最常用的视角。音频模块会覆盖常见的降噪、增益控制、语音端点检测。频谱图可以直观看到噪声在哪、语音在哪进而构建谱减或维纳滤波。还有 MFCC梅尔频率倒谱系数这类特征它从人耳听觉感知出发把频带映射到 Mel 刻度是语音识别和音频分类的经典前端。音频处理还有一个很有意思的点很多操作在频域做比在时域做直观得多。比如高速公路上录了一段语音底噪是持续的低频轰鸣在时域里很难定位但在频谱图上一眼就能看出低频带的能量异常集中接下来就知道应该用高通或者谱减法处理低频区域。4. 从确定性信号走向随机信号统计信号处理这一层必须补4.1 估计理论为什么不能只靠一个 FFT很多做应用的人学到滤波器、FFT 就停下来了直到接触雷达、通信、生物信号时才碰到“估计”这个概念。统计信号处理和之前的核心区别是我们不再假设信号是完全确定的、噪声是背景板而是把信号和噪声都当作随机过程用概率模型描述它们然后从观测数据中去估计我们关心的参数。Kay 的《统计信号处理基础估计与检测理论》是这个领域绕不开的经典我也看到很多人在搜“统计信号处理基础Kay第二章答案”。这里多说一句第二章其实是在搭理论基础包括估计子的无偏性、最小方差准则、克拉美罗下界。很多人做题觉得难是因为没有意识到这一章是给整本估计理论立规矩的后面每章几乎都会回到这几个概念。实践中最常用的估计器是极大似然估计。比如从一段带噪声的正弦信号里估计幅度和频率极大似然估计的直觉就是找一组参数让当前观察到的数据出现的概率最大。这个思想非常自然但真正实现时会发现各种细节比如多维参数搜索的复杂度、信号模型不准确时估计结果的偏置。4.2 检测理论在噪声里判断“有”还是“没有”检测问题和估计问题在统计信号处理里是姊妹关系。检测回答的是一个二选一问题这个信号到底存不存在。典型场景是雷达发现目标、语音活性检测、ECG 里的心搏识别。奈曼-皮尔逊准则是检测理论的核心框架之一它的思路是固定虚警概率最大化检测概率。没有接触过的人可能会奇怪为什么要先固定虚警概率因为真实系统里虚警和漏警之间存在不可调和的取舍雷达宁可偶尔漏报也不能天天虚警否则整个告警系统就失效了。你只有先明确代价才能合理选择阈值。匹配滤波器在这里再次出现。在高斯白噪声下使得输出信噪比最大的线性滤波器就是匹配滤波器也就是说雷达信号处理里的“匹配滤波”和统计检测里的“似然比检验”有着深层的数学联系。这是信号处理最漂亮的地方之一不同场景殊途同归。4.3 和机器学习的接口现在几乎每个信号处理问题都会有人问“能不能用深度学习”。我的态度是能但前提是你先把经典信号处理方法用明白。神经网络擅长端到端映射但它的可解释性差标注成本高很多工业场景根本没有足够数据。更稳妥的做法是让信号处理和机器学习各司其职。信号处理负责去噪、增强、特征提取、减少数据维度机器学习负责模式识别、分类、回归。比如用带通滤波和峰值检测先把 ECG 的心拍切出来再用一个轻量级分类器判断心拍类别这个方案稳定可靠而且每次输出为什么被分类到某一类都可以回溯。5. 复现路线工具链、数据集与节奏安排5.1 Python 和 Matlab 怎么选在这个系列里我默认以 Python 为主原因是生态完整、跨平台、方便和机器学习框架衔接。下面几个库是信号处理的主力numpy几乎所有数组运算的底层scipy.signal滤波器设计、卷积、频谱估计matplotlib画波形和频谱图做可视化诊断pywt小波变换用于部分非平稳信号分析librosa音频特征提取scikit-learn / torch用于和机器学习部分对接。Matlab 在信号处理里依然有优势尤其在雷达、通信等传统领域很多经典代码和论文图表都用 Matlab 绘制。如果你身处这些行业不要抵触 Matlab它的 Signal Processing Toolbox 确实成熟滤波器设计和谱分析函数极其方便。我的做法是Python 做主力涉及雷达仿真时用 Matlab 快速验证两边转换时把关键参数写成同一份配置文件避免对不上。5.2 公开数据集和仿真信号怎么配合学习信号处理不能只跑仿真信号。仿真信号的好处是“标准答案”已知适合验证算法真实数据的价值在于充满不可预测性适合培养工程手感。我的建议是先仿真后真实。ECG 可以优先看 PhysioNet 上的 MIT-BIH 心电数据库里面包含多种心律失常的标注适合做 QRS 检测和心拍分类。PPG 方面可以从公开的生理信号数据集中找重点看带有同时记录加速度计的样本这样能用加速度计信息进行运动伪影去除实验。雷达信号公开数据集相对少很多实验需要用点目标回波模型自己生成这个过程本身也是学习。5.3 四周学习计划示例这份目录完整铺开内容很多如果要给自己安排一个可执行的起步计划可以这样走第一周做时域和频域基础每天生成一段正弦加噪声信号分别用原始波形和 FFT 频谱观察理解频率、幅度、相位在频谱里的表示。第二周做采样与滤波用同一段信号故意降低采样率观察混叠再设计 FIR 和 IIR 滤波器对比滤波后的波形失真。第三周选择一个人体信号场景按 ECG 或 PPG 的完整链路跑一遍记录每个环节的作用。第四周进入统计信号处理完成一个简单的参数估计和检测实验比如从噪声中估计直流电平并画出检测概率曲线。这个计划不求快但求每一步都有可视化的输出。把波形图、频谱图保存下来形成自己的“信号观察日志”会比看一百篇资料都有效。6. 踩坑清单与目录的长期维护6.1 我踩过的几个典型坑信号处理入门时踩的坑高度相似这里先列几个我印象最深的场景典型错误后果正确处理采样率拿到真实数据不记录 fs直接读数组频谱横轴完全错位滤波截止频率虚标第一步永远先把采样率写进变量滤波用 filtfilt 处理完再部署到实时系统离线结果很好在线系统延迟爆炸实时系统必须用因果滤波器并校准延迟FFT直接对原始截断信号做 FFT频谱泄漏严重主峰附近出现多余旁瓣先加窗再解释主瓣与旁瓣的取舍去噪顺序先高通去漂移后处理工频干扰高通后基线依然毛糙工频残留先用陷波去除工频再处理基线漂移归一化对每段信号单独归一化后再计算幅度信息丢失检测阈值失效只有确认需要幅度不变时才做归一化第一行“采样率”问题看起来最简单实际翻车最多。很多公开数据集的字段说明里写了采样率但被导出脚本意外改变后没人更新后续所有频率相关的结果就全错了。建议做一个数据加载函数统一读取原始信息和采样率并打印一句“当前数据 fsxxx Hz”出来肉眼确认后再往下走。第二行 filtfilt 的问题也值得多说一句。filtfilt 是零相位滤波它会把信号正向、反向各滤一次抵消相位偏移但代价是引入了未来信息所以它只适合离线分析。如果你在实时系统里用了 filtfilt看到的结果会有不可接受的时间延迟严重时会导致整个控制环崩溃。6.2 目录的更新机制这份目录不会是一份死文档。每写一篇正文我就会回到这里把对应条目标记为“已发布”同时补充那些在写作过程中发现的新问题。比如某一天我在处理 PPG 运动伪影时发现了一个比常规自适应滤波更稳定的一个小技巧我就会把对应内容追加进 PPG 那一节而不是单独发一篇看起来精致但和主线脱节的文章。我也很希望读者在阅读过程里提出补充方向。每个人的背景不同有人需要更多数学推导有人只需要靠谱代码。这份目录的维护原则是主线不动分支按需求生长。主线必须保持经典和稳定分支可以根据读者反馈不断增加。6.3 给新读者的使用建议如果你刚点进这篇文章不要试图一口气把目录里的所有内容都读完。信号处理是一门需要反复回看的学问第一遍的目标是“知道世界地图长什么样”第二遍再按图索骥去深入某个具体方向。我自己给自己定的规矩是每写一篇正文就先用这段内容处理一段真实带噪信号哪怕只是一个 5 秒的音频文件、一段公开 ECG 记录、自己用手机录的传感器数据。只有亲手看到波形从“乱成一团”变成“清清楚楚”才算真正理解了那篇理论。目录放在这里后续每写一篇就更新一次。希望它能成为你的信号处理索引也欢迎你在评论区告诉我你最想先看到哪个模块。我们下一篇正式内容里见。