资讯详情

资讯详情

数字信号处理入门:从采样定理到卷积与LTI系统

我记得第一次真正被“采样”这两个字教训到是在一个数据采集的小项目里。当时想用一块开发板采集某台设备的振动信号采样率随手设了个“感觉差不多够用”的值结果高频干扰全被混叠成了低频摆动屏幕上一条弯弯绕绕的波动怎么看都像机械故障。我整整排查了两天才意识到问题不是传感器而是采样这第一步就埋了雷。从那以后我再看《数字信号处理》第1章“离散时间信号与系统”再也不敢把它当成“一堆定义”来背。这一章看起来全是概念序列、基本信号、线性时不变系统、卷积和但几乎每个概念背后都对应着真实世界里实实在在的坑。这篇文章想重新梳理一遍第1章的知识骨架把我自己踩过的坑、这几年带新人时常被问到的问题一并整理出来。它适合正在啃教材、准备考试的人也适合那些学完就忘、打算从头把基础焊牢的人。如果你能跟着把每个“为什么”想明白后面学差分方程、z变换、傅里叶分析都会顺很多。1. 从模拟到离散采样那一步究竟发生了什么1.1 一个连续世界的“快照序列”离散时间信号在教材里通常写成 x[n]意思是把连续时间信号 x(t) 在均匀间隔 T 上取值x[0] x(0)x[1] x(T)x[2] x(2T)一般地x[n] x(nT)n 是整数。注意这里用的是方括号而不是圆括号这是个重要的视觉信号x[n] 只在整数 n 上定义中间是不存在的。很多初学者习惯在脑补的时候把 x[n] 的散点“连成线”这在画图帮助理解时没问题但心里必须清楚离散时间序列本质上是一串数不是一个连续的波形。TT 被称为采样间隔采样频率就是 fs 1/T。为什么先讲这个因为后面几乎所有概念都建立在“我们拿到手的只有这些快照”这件事上。你可以把连续世界到离散世界的转换想成拍电影每秒 24 帧只要帧率足够高放映时大脑就会觉得画面是连续运动的。反过来如果帧率太低就会出现“马车车轮倒转”的错觉——那不是错觉就是时间维度的混叠。我给新人讲解采样时最喜欢用这个类比因为大多数人都有过看低速拍摄车轮旋转却越转越倒的经历那个现象和信号混叠的机理是同一个。1.2 采样定理与抗混叠我真正踩过的那个坑奈奎斯特采样定理说得很清楚如果信号的最高频率分量是 f_max那么采样频率 fs 至少要大于 2f_max采样后的序列才能无失真地还原出原始信号。这里的“大于”不是“等于”边界等于的时候只是理论上勉强可以用实际工程里根本不敢这么卡。我那个采集项目的教训就在于当时的振动信号本身频率不高但现场环境里有很强的高频电磁干扰而我只盯着信号带宽随便选了采样率也没有在模拟前端加抗混叠滤波器。结果高频电磁干扰被采样过程“折叠”回低频区域恰好落在我们关心的频段里看起来就像设备自身产生了低频摆动故障一样。后来我加了一级模拟低通滤波器把截止频率压在信号最高频率附近再把采样率提到理论值的三倍以上波形立刻就干净了。这段经历想说明两件事采样定理给出的是理想下限实际工程要给足余量一般按信号最高频率的 3 到 5 倍来选采样率并不夸张。采样前的模拟抗混叠滤波非常关键。只靠数字手段处理已经混叠进去的分量很多时候是救不回来的。如果你自己写代码观察混叠可以做个很小的实验。设信号频率 f010Hz先用 fs1100Hz 采样再用 fs215Hz 采样同一个信号画出来会完全不同。下面这段代码非常短复制到任一 Python 环境里就能看import numpy as np import matplotlib.pyplot as plt f0 10 # 信号频率 10 Hz fs1 100 # 采样率 100 Hz满足采样定理 fs2 15 # 采样率 15 Hz不满足采样定理 t1 np.arange(0, 1, 1/fs1) t2 np.arange(0, 1, 1/fs2) x1 np.sin(2 * np.pi * f0 * t1) x2 np.sin(2 * np.pi * f0 * t2) plt.figure(figsize(10, 4)) plt.stem(t2, x2, linefmtC0-, markerfmtC0o, label15 Hz sampling) plt.plot(t1, x1, C1--, labeloriginal 10 Hz) plt.legend() plt.show()fs215Hz 采样一个 10Hz 的信号得到的离散序列重建出来会变成一个 5Hz 左右的波形。原因很简单混叠频率等于信号频率关于采样率一半的镜像|10 - 15| 5Hz。这就是我在测量现场看到的“幽灵故障”的来源。类似的现象不止出现在振动测量里音频、图像、雷达数据采集都会遇到。1.3 归一化频率教材里最容易把人绕晕的概念第1章在介绍正弦序列和复指数序列时通常引入“数字角频率”常用 ω 表示单位是弧度/样本。它和模拟角频率 Ω 的关系是模拟角频率 Ω 2πf单位 rad/s。采样后数字角频率 ω ΩT Ω/fs 2πf/fs单位 rad/sample。这意味着同一个物理频率 f在不同采样率下对应的数字角频率不同。比如信号频率 100Hz采样率 1000Hz 时 ω 2π×100/1000 0.2π如果采样率变成 2000Hz同一个 100Hz 信号就成了 0.1π。为什么说这是最容易绕晕的概念因为后续设计数字滤波器时所有截止频率都要写成这种归一化的形式而不是直接用赫兹数。我在带新人做滤波器时就见过有人把模拟截止频率直接填进数字滤波器设计函数结果出来的滤波器完全不是想要的样子。请务必记住这个换算关系先确认采样率再把模拟频率换算成 0 到 2π 范围内的数字频率。还有一个初学者很容易忽略的性质离散时间信号的频谱天然是周期的周期就是 2π。也就是说数字频率 ω 和 ω2π 描述的是同一个序列。这个概念现在可能还没什么感觉但到了傅里叶分析章节你就会明白离散序列的频谱本身就是周期延拓的结果这也是为什么采样定理强调“不能有高于二分之一的频率分量”一旦有周期延拓的频谱就会重叠。2. 基本序列的“物理性格”从单位脉冲到复指数2.1 单位脉冲与单位阶跃离散世界的开关和探针第1章最先介绍的几个基本序列看似简单却是整套语言的“字母表”。第一个是单位脉冲序列δ[n] 1当 n 0δ[n] 0当 n ≠ 0。它的性格很像一个“探针”只在某个瞬间点一下其他时间完全安静。后面你会看到想了解一个系统是什么脾气就往它输入端戳一个单位脉冲看它怎么回应回应的那个序列就是冲激响应 h[n]。系统只要能线性叠加就能根据 h[n] 推测它对任何输入的反应。第二个是单位阶跃序列u[n] 1当 n ≥ 0u[n] 0当 n 0。它像“开关”从某个时刻开始一直保持。这两个序列之间有非常紧密的关系单位阶跃序列是单位脉冲序列的累加和反过来单位脉冲序列是单位阶跃序列的一阶差分。用式子写就是u[n] Σ_{k-∞}^{n} δ[k]δ[n] u[n] - u[n-1]。这个关系值得自己推一遍因为它是“累加器”和“差分器”这两个最简单系统的雏形也是后面讨论数字积分、边缘检测等操作的理论起点。2.2 实指数序列与正弦序列衰减、增长与周期迷思实指数序列形如 x[n] a^n。判断它的走势不能只看 a 的符号要看绝对值大小|a| 1序列随 n 增大而衰减|a| 1序列随 n 增大而发散a 0 时序列会在正负之间交替跳变形成振荡式的衰减或增长。这个“振荡衰减”经常有人忽略。比如 a -0.5画出来是一个正负交替、幅度越来越小的序列看起来像锯齿一样。理解这一点对后面分析数字滤波器的稳定性很有帮助因为很多不稳定系统的响应就是这样正负震荡着发散的。正弦序列长这样x[n] A sin(ωn φ)或者是余弦形式。它最反直觉的一点是连续的 sin 函数一定是周期的但离散的正弦序列却不一定周期。判断条件只有一个存在正整数 N 和整数 m使得 ωN 2πm也就是说 ω/(2π) 必须是有理数。举个例子。x[n] cos(0.2πn)ω/(2π) 0.1 1/10所以它是周期的最小周期 N10。再看 x[n] cos(0.3n)ω/(2π) ≈ 0.0477这是一个无理数无论 n 取多大都找不到一组整数 (N,m) 让相位完整转回一圈因此它永远不是严格周期的。这个“离散正弦可能无周期”的坑考试爱考实际工程里也经常把人绊倒比如你以为自己在生成某个周期的信号结果画出来的序列肉眼看着像杂乱的波动就是因为周期条件没有满足。2.3 复指数序列与能量功率视角接下来是复指数序列 e^{jωn}。初学的人往往觉得复数很“虚”总想绕开但我可以负责任地说复指数才是信号处理真正的地基。欧拉公式把它拆开e^{jωn} cos(ωn) j sin(ωn)。也就是说一个复指数同时包含余弦和正弦还携带了相位信息。教材里强调 e^{jωn} 有两个实用价值第一它是线性时不变系统的“特征函数”——输入一个复指数输出还是同频率的复指数只是幅度和相位变了第二傅里叶分析本质上就是把任意信号分解成不同频率复指数的加权组合。你甚至可以理解成复指数是信号世界里的“波”单一正弦只是它的投影。第1章还有一个重要分类能量信号与功率信号。能量定义为 E Σ_{n-∞}^{∞} |x[n]|²功率定义为 P lim_{N→∞} (1/(2N1)) Σ_{n-N}^{N} |x[n]|²。单位脉冲的能量是 1有界所以是能量信号。单位阶跃的能量无限但平均功率有限所以是功率信号。周期正弦、复指数也是功率信号因为它们永远在“耗电”。这里的直觉很重要脉冲是一次性的碰撞阶跃和周期信号则是持续运行的系统。很多同学会问既然 e^{jωn} 能量无限为什么还要拿来当基函数因为傅里叶分析关心的是它作为一个“标准尺子”的测量能力而不是它自身的能量。这个观念转过来后面学频谱就不会老是纠结“周期信号能量无限”了。3. 线性时不变系统信号处理绕不开它的原因3.1 系统是什么先给黑箱画个分类表系统可以理解为一个黑箱输入端喂序列 x[n]输出端得到序列 y[n]记作 y[n] T{x[n]}。第1章不急着研究具体怎么实现而是先建立一套分类体系用来判断“这系统是什么脾气”。最常见的分类维度有这么几个分类角度类型划分简单判断特征记忆性无记忆系统 / 有记忆系统输出是否只取决于当前时刻输入线性线性 / 非线性是否满足齐次性和叠加性时变性时不变 / 时变延时输入是否等价于延时输出因果性因果 / 非因果输出是否依赖未来的输入稳定性稳定 / 不稳定有界输入是否得到有界输出以教材里常见的累加器为例y[n] Σ_{k-∞}^{n} x[k]。它显然有记忆因为输出是所有历史输入的累计。再比如滑动平均 y[n] (x[n] x[n-1])/2也是有记忆系统。无记忆系统的典型例子是 y[n] 2x[n]输出只看当下输入。这张表在算作业题的时候特别好用拿到一个系统表达式先按这五个维度逐个判断比直接翻答案更牢靠。3.2 线性与时不变两个条件的本质含义线性有两个要求齐次性和叠加性。合起来写就是T{a·x1[n] b·x2[n]} a·T{x1[n]} b·T{x2[n]}。看起来是套公式但这意味着一个很实用的结论系统对复杂输入的反应可以拆成对简单输入反应的组合。工程师特别喜欢这样的系统因为分析起来可以“各个击破”。时不变要求的是如果输入 x[n] 的响应是 y[n]那么把输入整体延迟 D 个样本得到 x[n-D]输出也应该整体延迟 D 个样本即还等于 y[n-D]。用大白话说系统的“脾气”不会随着时间变化你今天给它一个脉冲是这种反应明天给它一个脉冲还是这种反应只是时间的起点不同。一个反例会更能说明问题y[n] n·x[n]。把输入延时一个样本输出变成了 n·x[n-1]而原输出延时一个样本是 (n-1)·x[n-1]两者不相等所以这个系统是时变的。这类题每年都有人做错关键就在于不要靠感觉而是把“延时后的输入”代入系统表达式再和“原输出的延时”比较。为什么要强调线性加时不变因为这两个条件正好让系统可以用冲激响应完整刻画。只有线性分解之后各分量没法统一只有时不变不同时刻的脉冲响应还不一样。两个一结合问题立刻变得简单。3.3 冲激响应是系统的“指纹”这个推导是第1章最核心的逻辑链值得一步一步写下来第一步任意输入序列都可以表示成单位脉冲的加权移位和x[n] Σ_{k-∞}^{∞} x[k]·δ[n-k]。你是对的这里的“筛分性质”很关键。δ[n-k]只在 nk 时为1所以求和式右边在 nk 时取到 x[k]其他项全是0。它把一个一般序列拆成了无数个“搬了位置的脉冲”。第二步设系统对 δ[n] 的响应是 h[n]。利用时不变系统对 δ[n-k] 的响应就是 h[n-k]。第三步利用线性系统对左边整个求和式的响应等于右边各项响应的加权叠加y[n] Σ_{k-∞}^{∞} x[k]·h[n-k]。这个式子就是卷积和。整个过程我没有引入任何超出第1章范围的新概念只用了脉冲分解、线性和时不变三个工具。结论非常漂亮一个 LTI 系统知道一个 h[n]就等于知道它对所有输入的反应。h[n] 因此被称为系统的冲激响应相当于这个系统的“指纹”。我建议初学的人拿起笔亲手把这三步推导抄写两遍。不是因为要背公式而是这个过程能让你直观感受到“为什么要定义单位脉冲”“为什么要定义线性和时不变”。很多同学背会了卷积的定义却讲不出它怎么来的就是因为跳过了这个推导链。后面学 z 变换的时候你会发现卷积在变换域里变成乘积这个结论的推导起点就是这里。4. 线性卷积看似枯燥的运算为什么是核心工具4.1 卷积的物理意义一次“回声叠加”卷积的数学定义 y[n] Σ_{k-∞}^{∞} x[k]h[n-k] 看起来很抽象但它背后的物理图像非常直观系统对当前输入的响应是所有历史输入在“延迟后残留影响”之和。拿语音来比喻。你在礼堂里说话麦克风收到的不仅是嘴边的直达声还有墙壁、天花板反射过来的多次回声。房间的冲激响应 h[n] 记录了一个极短脉冲经过反射衰减到麦克风的完整过程。你说话的声音 x[n] 被房间“卷积”之后输出的 y[n] 就带上了反射混响。这也是为什么卷积在音频处理里会被用来合成混响拿一段干声和一个真实房间的冲激响应做卷积就能模拟出在那个房间录音的效果。卷积不是为考试发明的它就是现实系统“记忆效应”的数学表达。所以下一次看到卷积式子可以念出声来输出在 n 时刻的值等于把 h 翻褶之后和 x 做逐个对齐的加权求和。h 的每一项乘的是 x 在“此前某个时间点”的值时间差由求和下标 k 控制。4.2 手算卷积的三种姿势图形法、列表法、解析法教材里手算卷积的方法大体有三种练习时建议三种都试一遍会互相校验。第一种是图形法四步走翻褶、移位、相乘、求和。把 h 沿着纵轴翻褶成 h[-k]然后把它从 -∞ 往右移动每到一个位置 n就计算 h[n-k] 和 x[k] 对应点的乘积之和。这个方法的好处是直观尤其适合判断卷积结果在哪些区间非零。第二种是列表法本质上像做竖式乘法。把 x 和 h 的样点按顺序排开交叉相乘相同“对角线和”相加得到卷积结果。这个方法的效率很高适合手工快速估算。第三种是解析法直接对每个 n 代入公式求和适合两个序列都有简单解析表达的情况。我拿一个具体例子走一遍。设 x[n] [1, 2, 3]n0,1,2h[n] [0.5, 1]n0,1。用图形法逐项算y[0] x[0]·h[0] 1×0.5 0.5y[1] x[0]·h[1] x[1]·h[0] 1×1 2×0.5 2y[2] x[1]·h[1] x[2]·h[0] 2×1 3×0.5 3.5y[3] x[2]·h[1] 3×1 3。结果 y [0.5, 2, 3.5, 3]长度为 4。这里有个规律两个长度分别为 M 和 N 的有限长序列卷积后结果长度是 MN-1。32-14刚好。写完手算再用代码对一遍踏实感会强很多import numpy as np x np.array([1, 2, 3]) h np.array([0.5, 1]) y np.convolve(x, h) print(y) # [0.5 2. 3.5 3. ]4.3 卷积的性质与工程里的简化卷积有几个性质虽然证明都很简单但工程上很实用交换律x[n] * h[n] h[n] * x[n]。滤波时谁当输入谁当冲激响应数学结果一样。结合律(x[n] * h1[n]) * h2[n] x[n] * (h1[n] * h2[n])。这意味着两个级联的滤波器可以合并成一个滤波器其冲激响应等于两者的卷积。分配律x[n] * (h1[n] h2[n]) x[n] * h1[n] x[n] * h2[n]。并联滤波器可以拆开单独算再叠加。与单位脉冲卷积x[n] * δ[n] x[n]。这就是“筛分性质”在卷积层面的同义表达。这些性质看起来很基础但在实际系统设计里非常管用。比如你要对一长串信号做两个串联滤波器如果直接逐点跑两遍计算量很大如果先把两个冲激响应离线卷积成一个总共多少抽头的等效滤波器再一遍跑完复杂度立刻降下来。这就是 FIR 滤波器设计里常见的“系数合并”技巧。有一点想提醒大家卷积在数字图像处理里也经常出现但很多深度学习框架里的“卷积层”实际上是互相关运算也就是不做翻褶直接用一小块核在图像上滑窗求加权和。对于图像处理这种任务来说翻不翻褶影响不大因为核是学出来的但如果你要做的是严格意义上的信号卷积请务必要搞清楚你用的工具到底有没有做翻褶。这一点在很多项目中坑过人。5. 稳定性、因果性以及我见过最多的初学者误区5.1 稳定与因果系统能不能安全、能不能实时运行第1章最后通常会讲两个系统性质稳定性和因果性。稳定性的教材定义是有界输入产生有界输出英文缩写叫 BIBO。对于 LTI 系统这个条件的充要判断是冲激响应绝对可和Σ_{n-∞}^{∞} |h[n]| ∞。直觉上如果一个脉冲能在系统里引起无限大的累积响应那系统必然崩。比如 y[n] y[n-1] x[n]输入一个有界脉冲输出却一直在累加很快超过任何有限上界这就是不稳定系统的典型代表。而滑动平均这类系统冲激响应只有有限几个非零值绝对可和天然稳定。因果性要求输出只依赖当前和过去的输入换句话说冲激响应在 n0 时必须是 0。这个限制在日常生活中很容易理解实时系统无法看到未来。但要注意因果性不是“好系统”的绝对标准——离线批量处理完全可以用非因果系统。比如音频后期降噪时可以使用当前采样点之后的“未来”样点来平滑当前值这在实时场景做不到但在文件处理中非常常见。所以判断因果性时要认清场景不要一概而论。5.2 我见过最多的初学者误区这些年被问得最多的几个问题基本都集中在五个地方。第一个误区是把数字频率 ω 当成模拟频率 Ω。在滤波器设计里有人拿着模拟截止频率直接填进数字滤波器设计参数出来的滤波器特性完全偏离预期。正确的做法是先除以采样率 fs换算成归一化数字频率之后再设计。第二个误区是认为任何系统都能用冲激响应描述。请记住h[n] 这招只对线性时不变系统有效。非线性系统比如 y[n] x²[n]或时变系统没有唯一的“指纹”需要更复杂的模型工具。教材里所有关于卷积的结论前提都是 LTI。第三个误区是手算卷积时忘记翻转 h或者索引对错位。翻转那一步是最反直觉的很多人算 y[2] 时直接 h[2] 去乘 x[2]完全走岔了。建议初学者先用长度很小的序列手工算一遍再用代码验算立刻就能发现自己是不是翻转错了。第四个误区是不理解为什么非周期序列也要讨论“周期”。比如复指数 e^{jωn}它到底是否周期取决于 ω/(2π) 是不是有理数而不是想当然地认为“指数函数都是周期的”。这个陷阱在连续信号思考方式里根深蒂固只能靠多画图来纠正。第五个误区是在判定线性时忘掉常数项。比如 y[n] 2x[n] 1很多人觉得它“看起来挺简单”但它不满足齐次性因为把输入放大两倍输出不是简单放大两倍。这种带常数项的系统是典型非线性系统做判断题时要特别小心。5.3 一点学习建议从公式到直觉我知道很多人学第1章最大的挫败感来自“公式全认得但不知道学它干嘛”。我的建议很简单不急着往后翻先把这一章的每个概念用“如果它不成立会怎样”反问一遍。如果没有采样定理保证你手机里录的音频会混叠出奇怪的噪声如果不用线性时不变系统这一套框架分析复杂电子线路会立刻崩溃如果不理解卷积后面的滤波器设计就完全没法看。这种“概念到现象”的挂钩比背十页公式都管用。另外强烈建议学完一小节就花十分钟写几行代码画图把单位脉冲、阶跃、指数衰减、正弦序列的形态自己画一遍再对某个 LTI 系统做一次手算卷积和代码卷积的对比。不需要复杂的工程只要能“看见”序列长什么样抽象感就会消掉一大半。现在每次有人来问我这一章的重难点我都会让他先把 x[n] Σ x[k]δ[n-k] 到卷积的推导自己走一遍再手算一个小例子。我自己也是从那次混叠事故之后才真正把采样这件事钉进脑子里的。这门课最大的价值其实不是让你记住多少公式而是让你知道在什么场景该用什么工具、会被什么坑绊倒。第1章看着像个开头实际上是你往后所有分析能力的承重墙把墙砌扎实了后面才走得了远路。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →