简介:傅立叶变换、拉普拉斯变换与小波变换是信号处理与数学建模的核心工具,这份手写公式推导笔记适合正在学习信号与系统、数学建模或准备相关考试的本科生与工程师。笔记从连续与离散两个层面完整梳理三大变换,涵盖连续/离散傅立叶变换、单边/双边拉普拉斯变换以及连续/离散小波变换的公式推导,并点明各变换的适用场景,帮助读者真正理解从时域到频域、复频域的分析逻辑。资源为1个PDF文件,压缩包大小为12.85MB,手写笔迹清晰,重点公式突出,便于在平板或电脑上随时查阅、反复揣摩。已有2250人学习下载,内容既有推演过程也有直观注释,可作为课堂补充材料或考前复习提纲,有助于快速搭建三大变换的知识框架。
1. 傅立叶变换、拉普拉斯变换与小波变换手写公式推导笔记:先厘清一条主线
任何做过信号处理项目的工程师都见过这类场景:稳态频谱分析用傅里叶,系统稳定性判断用拉普拉斯,遇到非平稳突变信号则换小波。三套公式常被当成独立工具分别记忆,但从手写推导的角度看,它们是同一条线索上三个分叉:傅里叶把信号分解成正弦基,拉普拉斯在正弦基上叠加衰减因子扩展为s平面,小波则干脆放弃固定频率窗口,改用缩放与平移构造基函数。这篇笔记就从这条主线出发,依次写清三段推导,并把每段推导对应的离散化参数、代码验证和典型踩坑点对齐。适合算法工程师、数据方向从业者,以及需要真正理解公式边界而非只调库的开发者。
2. 傅里叶变换手写推导:从级数到DFT的公式链条与参数边界
2.1 从傅里叶级数到连续傅里叶变换的推导
起点是周期信号的傅里叶级数。周期为T的信号x(t)可以展开为复指数叠加,基频ω₀ = 2π/T,级数系数由积分给出。把周期T推向无穷大时,相邻谱线间距ω₀趋于零,离散的系数序列变成连续谱密度,于是得到傅里叶变换对:
X(ω) = ∫x(t)e^{-jωt}dt,反变换x(t) = (1/2π)∫X(ω)e^{jωt}dω
推到这里必须强调一个手写时最容易丢的细节:1/(2π)放正变换还是反变换不是数学上必然的,写成对称形式也能自洽。工程库的规范不一样,Numpy的fft正变换不乘系数,ifft反变换乘1/N,和连续公式相比相当于把归一化因子换了位置。直接拿教科书公式对照库结果时,先确认归一化约定,否则比对结果会差一个常数。
傅里叶变换存在的前提是信号绝对可积,即∫|x(t)|dt有限。阶跃信号、指数增长信号都会越界,这是后文拉普拉斯变换要解决的问题。但在傅里叶域里先不急着跳,下一步把连续积分变成采样序列。
2.2 从连续采样到DFT的推导与频点含义
工程信号都是采样后的离散序列,采样周期T_s = 1/f_s。用冲激串表示采样过程x_s(t)=Σx[n]δ(t-nT_s),代入连续傅里叶变换定义式,根据冲激函数的筛选性质,指数项里的积分变成求和:
X(Ω) = Σx[n]e^{-jΩn}
这就是离散时间傅里叶变换的表达式,Ω是归一化数字频率,范围[-π, π]。这一步推导在纸面上常见的错误是把Ω和物理角频率混用。记住关系Ω=ωT_s,也就同时记住了奈奎斯特频率f_s/2的来源:当物理角频率超过π/T_s时,数字频率落入折叠区间,采样信号频谱发生混叠。
实际计算只能处理有限长序列。对N点输入,在频域采样N个点,令Ω_k = 2πk/N,得到离散傅里叶变换:
X[k] = Σ_{n=0}^{N-1} x[n]e^{-j2πkn/N}
反变换为x[n] = (1/N)Σ_{k=0}^{N-1}X[k]e^{j2πkn/N}。DFT的直接计算复杂度是O(N²),FFT利用旋转因子的周期性与对称性把复杂度降到O(N log N)。手推蝶形运算图时最容易误伤的是输入序列的位序翻转:时间抽取FFT需要先按二进制倒序重排输入,否则各级蝶形级联全部错位。
2.3 DFT工程参数与Numpy验证代码
实际做频率分析时,有三个参数直接决定结果:采样率f_s决定分析频带上限,FFT点数N决定频率分辨率Δf=f_s/N,窗函数决定频谱泄漏的抑制程度。用下面这段代码验证手写DFT公式和Numpy内置fft是否一致:
import numpy as np N = 64 n = np.arange(N) # 构造刚好整数个周期的正弦,避免频谱泄漏干扰比对 fs = 64.0 f0 = 5.0 x = np.sin(2 * np.pi * f0 * n / fs) # 手写实现DFT,完全按推导公式来 X_manual = np.zeros(N, dtype=complex) for k in range(N): X_manual[k] = np.sum(x * np.exp(-2j * np.pi * k * n / N)) # numpy内置FFT X_fft = np.fft.fft(x) # 比对两个实现的最大绝对误差,应到1e-12量级 err = np.max(np.abs(X_manual - X_fft)) print(err)手写实现里外层循环遍历频点k,内层用Numpy的向量乘法一次算出N项求和,与推导公式完全对应。np.fft.fft默认不做归一化,所以手写循环里也不乘任何系数。若在循环里误加1/N,误差会整体缩小N倍,一眼就能判断是归一化配平出了问题。
实际项目里我会先把参数定下来:采样率1000Hz时N取1024,频率分辨率约0.977Hz;查峰值用np.argmax(np.abs(X[:N//2]))再乘以fs/N换算成物理频率。如果信号首尾不连续,先加汉宁窗再变换,否则会在整个频谱上拖出旁瓣。
DFT最关键的三项参数对结果的影响见下表:
| 参数 | 定义 | 参考值 | 对结果的影响 |
|---|---|---|---|
| 采样率fs | 1/T_s | 1000 Hz | 最高可分析500Hz |
| FFT点数N | 变换长度 | 1024 | 频率分辨率fs/N |
| 频率轴步长 | fs/N | 0.977 Hz | 相邻谱线间距 |
| 窗类型 | 时域加权 | Hann/Blackman | 抑制旁瓣泄漏程度 |
提示:DFT频点索引k对应频率fs×k/N,不要直接拿k当频率值。手写画频谱图时k=5并不等于5Hz,需要乘上频率分辨率,这是最容易被忽略的量纲问题。
3. 拉普拉斯变换手写推导:从傅里叶积分到s平面收敛域
3.1 傅里叶积分加了衰减因子,为什么变成拉普拉斯变换
傅里叶变换的绝对可积要求拦住了一大批工程信号:阶跃、斜坡、指数上升信号都会让积分发散。拉普拉斯变换的构造思路是给x(t)先乘一个衰减因子e^{-σt},其中σ是实数。只要σ选得足够大,即使信号增长很快,乘积也能被压到收敛。然后再对这个乘积做傅里叶积分,两个指数项合并后得到:
X_L(s) = ∫₀^{∞} x(t)e^{-σt}e^{-jωt}dt = ∫₀^{∞} x(t)e^{-st}dt
这里积分下限写0,表示单边拉普拉斯变换,处理因果信号时最常用。s = σ + jω称为复频率,它把傅里叶的一条频率轴扩展成整个复平面:实部σ描述衰减或增长速率,虚部ω描述振荡频率。
从工程角度,单边拉普拉斯对t<0部分不敏感,天然适合带初始条件的常微分方程求解。把求导换成乘以s,积分换成除以s,初值作为附加项带进代数式,微分方程就变成多项式方程。这也是控制领域用传递函数H(s)做系统分析的原因:系统施加阶跃输入时,时域响应包含瞬态分量,直接做傅里叶积分不收敛。
3.2 收敛域、极点和系统稳定性的手写判据
拉普拉斯变换里收敛域的含义,是使积分收敛的s取值集合。以x(t)=e^{-at}u(t)为例完成完整推导:
X_L(s) = ∫₀^{∞} e^{-at}e^{-st}dt = [-e^{-(s+a)t}/(s+a)]₀^{∞}
要让上限处收敛,必须满足Re(s)+a > 0,于是:
X_L(s) = 1/(s+a),收敛域Re(s) > -a
极点位于s = -a。收敛域是极点右侧的开半平面,它永远不穿过极点本身。工程上由此得到一个极其常用的稳定性判据:若传递函数所有极点都位于s平面左半平面,收敛域包含虚轴,系统是稳定的;若有极点跨过虚轴进入右半平面,收敛域不再覆盖虚轴,系统的自然响应会发散。
手写这个判断时最容易犯的错是把收敛域和极点的左右关系记反。可以这样记忆:因果信号的收敛域从最大极点实部开始向右延伸,它始终在极点的右侧,且绝不经过极点。
3.3 拉普拉斯传递函数验证与参数表
把上面的推导落到一个具体RC低通滤波器上。传递函数为H(s) = 1/(1+sRC),极点位于s = -1/(RC),是一阶惯性环节的标准形式。用Scipy验证极点位置和频率响应:
import numpy as np from scipy import signal R = 1e3 C = 1e-6 # 分子为常数1,分母为RC·s + 1,按s降幂排列 b = [1.0] a = [R * C, 1.0] # 从1Hz扫到100kHz,考察频率响应 f = np.logspace(0, 5, 500) w = 2 * np.pi * f _, H = signal.freqs(b, a, worN=w) poles = np.roots(a) print(f"极点位置: {poles}") print(f"直流增益: {abs(H[0]):.4f}") # 找-3dB截止频率 idx = np.argmin(np.abs(20 * np.log10(abs(H)) + 3)) print(f"-3dB 截止频率: {f[idx]:.1f} Hz")scipy.signal.freqs接收s域多项式系数,b和a都从最高次项开始排列。用np.roots(a)求分母根得到极点,RC低通的极点应约等于-1000,对应时间常数τ=RC=1ms。直流增益应为1,-3dB截止频率f_c=1/(2πRC)约159Hz,代码会输出一个接近的值。这个验证完全对应手写推导中的极点位置,说明公式展开正确。
拉普拉斯推导中的关键参数对照表:
| 手写推导项 | 表达式 | 工程判断 |
|---|---|---|
| 极点 | s = -1/(RC) | 实部为负,系统稳定 |
| 收敛域 | Re(s) > -1/(RC) | 因果系统右侧开平面 |
| 截止角频率 | ω_c = 1/(RC) | 增益降至-3dB处 |
| 直流增益 | H(0) = 1 | 输入输出静态放大倍数 |
注意:单边拉普拉斯逆变换的公式里包含围线积分,工程实现通常不直接算积分,而是对X_L(s)做部分分式展开后查变换表。手写推导遇到重根和共轭复根时,分别对应时域tⁿe^{-at}与e^{-at}cos(ωt)等项,可以用Scipy的
signal.residue验证展开系数是否正确。
4. 小波变换手写推导:从固定窗口到缩放平移的灵活基函数
4.1 短时傅里叶变换窗口困境与连续小波变换定义
短时傅里叶变换通过加窗把信号切成短段,再对每个窗内做傅里叶变换。窗口长度固定,时间分辨率和频率分辨率之间就存在死结:窗口短则时间定位准确但频率模糊,窗口长则频率清晰但时间模糊。海森堡不确定性原理给出Δf·Δt ≥ 1/2,所有固定窗口方案都卡在这条线内。
小波变换的思路是放弃固定窗,改用母小波的伸缩和平移。给定一个均值为零、能量有限的母函数ψ(t),做尺度伸缩a和平移b,得到一族基函数:
ψ_{a,b}(t) = (1/√a)ψ((t-b)/a)
前面的1/√a是能量归一化因子,保证不管a怎么变,基函数的能量保持不变。连续小波变换定义为:
W_x(a,b) = (1/√a)∫x(t)ψ*((t-b)/a)dt
这里参数a和傅里叶里的频率ω正好相反:a小,小波在时间轴被压缩,对应分析高频;a大,小波被拉伸,对应分析低频。高频段时间分辨率好,低频段频率分辨率好,这就是它被称为数学显微镜的原因。
4.2 二进离散化与多分辨率分析的推导
CWT输出是二维函数W_x(a,b),本身冗余度较高。离散化最常用二进采样,令a = 2^j,b = k·2^j,其中j、k为整数,基函数变为:
ψ_{j,k}(t) = 2^{-j/2}ψ(2^{-j}t - k)
2^{-j/2}同样承担能量归一化,j每增加1,尺度翻一倍,对应一个倍频程。要让这族基构成正交基,小波必须满足允许条件,即∫|Ψ(ω)|²/|ω|dω有限。实际等价于∫ψ(t)dt = 0,也就是小波函数自身必须正负振荡且均值为零。
多分辨率分析的推导可以从尺度函数φ(t)的双尺度方程展开:
φ(t) = √2Σh[n]φ(2t-n)
ψ(t) = √2Σg[n]φ(2t-n)
第一个式子说明低一层尺度函数可以由高一层缩放的线性组合表达,第二个式子用小波函数承接低频近似中丢失的细节。滤波器h[n]和g[n]之间满足镜像滤波关系g[n]=(-1)^{1-n}h[1-n],这个正交条件保证分解后信息不冗余。逐级递推时,每多分解一层,频率带宽减半,时间分辨率也减半,手画二叉树图可以直观看出子带的二分结构。
4.3 小波基选择与PyWavelets验证代码
选择小波基时,我先看消失矩阶数。消失矩m的定义是∫t^kψ(t)dt = 0,对k=0,...,m-1成立。消失矩越高,小波对平滑信号的低阶多项式成分抑制越强,越能凸显奇异点,但滤波器长度也越长,边界效应更明显。
PyWavelets库中用db4小波做四层分解并验证冲击定位:
import numpy as np import pywt n = 2048 t = np.linspace(0, 1, n, endpoint=False) x = np.sin(2 * np.pi * 30 * t) x[1000] += 2.0 # 在1000号采样点处加入单点冲击 coeffs = pywt.wavedec(x, 'db4', level=4) # coeffs排列顺序: [cA4, cD4, cD3, cD2, cD1] # 只保留cD1层细节,观察冲击方向上的定位 coeffs_keep = [] for i, c in enumerate(coeffs): if i == 4: coeffs_keep.append(c) else: coeffs_keep.append(np.zeros_like(c)) x_rec = pywt.waverec(coeffs_keep, 'db4') print(np.argmax(np.abs(x_rec))) # 应接近1000wavedec返回第4层近似系数加上第4到第1层细节系数。重构时把不需要的层清零,waverec自动按各层长度插值对齐,不需要手工裁剪形状。冲击点在小波域能精确定位到原始采样点附近,这在傅里叶域做不到——定点冲击会铺散到全部频带,只剩冲激噪声无法判断时间位置。
小波基选型参数表:
| 小波基 | 消失矩 | 滤波器长度 | 适用场景 |
|---|---|---|---|
| db1/Haar | 1 | 2 | 快速定位、边缘检测 |
| db4 | 4 | 8 | 通用去噪,时频定位均衡 |
| sym8 | 8 | 16 | 近似对称特性,边界形变小 |
| coif5 | 10 | 30 | 高消失矩,平滑信号分离 |
提示:db4在信号长度短于64个点时会出现明显边界效应。手写推导后做验证时先给信号两端几十个采样点打上标记,不要直接把整个序列的重建误差纳入指标计算,两端误差会拉高整体误判。
5. 三种变换的主要推导与校验技巧
5.1 用帕萨瓦尔定理验证傅里叶与小波变换的系数
帕萨瓦尔定理是验证傅里叶系数最廉价的手段。在Numpy约定下,DFT的能量关系为:时域能量等于频域能量除以N,即Σ|x[n]|² = (1/N)Σ|X[k]|²。用一段随机信号做数值验证:
rng = np.random.default_rng(42) x = rng.standard_normal(2048) X = np.fft.fft(x) energy_time = np.sum(x ** 2) energy_freq = np.sum(np.abs(X) ** 2) / len(x) print(np.max(np.abs(energy_time - energy_freq)))两条路径算出的能量差在1e-12量级。如果手写推导时把归一化因子位置写反,这里的差值就不是数值误差,而是N倍量级的常数偏离,立刻暴露系数配平问题。小波变换同样有能量守恒的对应关系,各层系数平方和应该等于原始信号能量,验证时逐层累加即可。
5.2 用初值与终值定理校验拉普拉斯变换
拉普拉斯推导完成后,用初值定理和终值定理做快速验算,不需要做逆变换:
x(0+) = lim_{s→∞} sX(s),x(∞) = lim_{s→∞} sX(s) 当s→0时即为终值
以H(s) = 1/(s+1)为例,sX(s) = s/(s+1),初值极限为1,终值极限为0,与时域h(t)=e^{-t}u(t)完全吻合。若推导时把分子误写成a/(s+a),初值会从1变成a,几秒笔算就能发现增益系数错位。这两个定理是写完拉普拉斯公式后的第一道自检,跑代码前值得先做这一步。
三种变换的验证方法与高频错误对照:
| 变换 | 验证依据 | 最常踩的坑 |
|---|---|---|
| 傅里叶 | 帕萨瓦尔能量守恒 | 1/N或1/(2π)位置放反 |
| 拉普拉斯 | 初值/终值定理 | 收敛域左右方向颠倒 |
| 小波 | 各层能量总和守恒 | 漏写能量归一化1/√a |
无论做哪种变换,先在自己手写推导内部形成验证机制,再让代码当第二道防线。公式写得再熟悉,也不如一个可复算的数值边界来得可靠。
本文还有配套的精品资源,点击获取