目录
- 第一部分:基础理论
- 第一章:绪论------什么是信号处理
- 第二章:信号的分类与表示
- 第三章:采样定理------从连续到离散的桥梁
- 第二部分:傅里叶分析
- 第四章:傅里叶级数------周期信号的频域表示
- 第五章:傅里叶变换------非周期信号的频域表示
- 第六章:离散傅里叶变换与快速算法
- 第三部分:数字滤波器
- 第七章:数字滤波器基础------差分方程与传递函数
- 第八章:FIR 滤波器设计
- 第九章:IIR 滤波器设计
- 第四部分:高级主题
- 第十章:Z 变换与系统分析
- 第十一章:谱估计与频谱分析
- 第十二章:时频分析与小波变换
- 第五部分:现代应用
- 第十三章:自适应滤波
- 第十四章:压缩感知与稀疏信号处理
- 第十五章:信号处理与机器学习的联系
- 第十六章:完整可运行代码实现
- 附录
第一部分:基础理论
第一章:绪论------什么是信号处理
1.1 信号与系统
1.1.1 什么是信号
信号(signal) 是携带信息的物理量随时间或空间变化的数学表示。
- 语音信号 :空气压力随时间的变化 p(t)p(t)p(t)
- 图像信号 :亮度随空间位置的变化 I(x,y)I(x, y)I(x,y)
- 心电信号 :心脏电位随时间的变化 v(t)v(t)v(t)
- 股票价格 :价格随时间的变化 s(t)s(t)s(t)
信号可以是:
- 连续时间信号 x(t)x(t)x(t):定义在连续时间轴上(如模拟音频)
- **离散时间信号 xnxnxn:定义在离散时间点上(如数字音频)
1.1.2 什么是系统
系统(system) 是对信号进行变换或处理的数学模型:
y(t)=T{x(t)}y(t) = \mathcal{T}\{x(t)\}y(t)=T{x(t)}
其中 x(t)x(t)x(t) 是输入信号,y(t)y(t)y(t) 是输出信号,T\mathcal{T}T 是变换算子。
信号处理的核心问题:
如何设计系统 T\mathcal{T}T,使得输出信号 y(t)y(t)y(t) 满足我们的需求?
1.2 信号处理的核心任务
| 任务 | 描述 | 例子 |
|---|---|---|
| 滤波 | 去除不需要的频率成分 | 去除音频中的噪声 |
| 检测 | 从噪声中检测有用信号 | 雷达目标检测 |
| 估计 | 估计信号的参数 | 估计信号的频率 |
| 压缩 | 减少信号的数据量 | MP3 音频压缩 |
| 增强 | 改善信号的质量 | 图像锐化 |
| 编码 | 将信号转换为适合传输的形式 | 5G 通信编码 |
1.3 信号处理的历史脉络
| 年份 | 里程碑 | 贡献者 | 贡献 |
|---|---|---|---|
| 1807 | 傅里叶级数 | J. Fourier | 任何周期函数可分解为正弦波 |
| 1822 | 傅里叶变换 | J. Fourier | 非周期信号的频域表示 |
| 1920s | 采样定理 | Nyquist, Shannon | 连续信号的离散化条件 |
| 1948 | 信息论 | C. Shannon | 信息的数学定义 |
| 1950s | FFT 算法 | Cooley, Tukey | 快速傅里叶变换 |
| 1960s | 数字滤波器 | 多位学者 | FIR/IIR 滤波器设计理论 |
| 1970s | 自适应滤波 | Widrow, Hoff | LMS 算法 |
| 1980s | 小波变换 | Morlet, Daubechies | 时频分析的新工具 |
| 2000s | 压缩感知 | Candès, Donoho | 稀疏信号的高效采样 |
| 2010s+ | 深度学习 | 深度学习社区 | 神经网络用于信号处理 |
1.4 本文的组织
本文从信号的基本概念出发,逐步构建出现代信号处理的完整理论体系。我们特别关注:
- 频域视角:为什么频域分析如此重要?
- 离散化:如何将连续信号转换为离散信号?
- 滤波器设计:如何设计滤波器来处理信号?
- 与现代 ML 的联系:信号处理如何与深度学习、SSM 等现代方法结合?
第二章:信号的分类与表示
2.1 信号的分类
2.1.1 连续时间 vs 离散时间
连续时间信号 x(t)x(t)x(t):
- 定义域:t∈Rt \in \mathbb{R}t∈R(实数轴)
- 例子:模拟音频、物理传感器输出
- 数学工具:微积分、拉普拉斯变换
离散时间信号 xnxnxn:
- 定义域:n∈Zn \in \mathbb{Z}n∈Z(整数)
- 例子:数字音频、采样后的传感器数据
- 数学工具:差分方程、Z 变换
2.1.2 确定性 vs 随机
确定性信号 :可以用明确的数学表达式描述
x(t)=Asin(2πf0t+ϕ)x(t) = A\sin(2\pi f_0 t + \phi)x(t)=Asin(2πf0t+ϕ)
随机信号 :不能用确定的数学表达式描述,只能用统计特性描述
xn∼N(0,σ2)xn \sim \mathcal{N}(0, \sigma^2)xn∼N(0,σ2)
2.1.3 周期 vs 非周期
周期信号 :存在 T>0T > 0T>0 使得 x(t+T)=x(t)x(t + T) = x(t)x(t+T)=x(t) 对所有 ttt 成立
非周期信号 :不存在这样的 TTT
2.1.4 能量信号 vs 功率信号
能量信号 :总能量有限
E=∫−∞∞∣x(t)∣2dt<∞E = \int_{-\infty}^{\infty} |x(t)|^2 dt < \inftyE=∫−∞∞∣x(t)∣2dt<∞
功率信号 :平均功率有限但总能量无限
P=limT→∞1T∫−T/2T/2∣x(t)∣2dt<∞P = \lim_{T \to \infty} \frac{1}{T} \int_{-T/2}^{T/2} |x(t)|^2 dt < \inftyP=T→∞limT1∫−T/2T/2∣x(t)∣2dt<∞
2.2 基本信号
2.2.1 单位脉冲(Dirac Delta 函数)
δ(t)={∞t=00t≠0,∫−∞∞δ(t)dt=1\delta(t) = \begin{cases} \infty & t = 0 \\ 0 & t \neq 0 \end{cases}, \quad \int_{-\infty}^{\infty} \delta(t) dt = 1δ(t)={∞0t=0t=0,∫−∞∞δ(t)dt=1
筛选性质 :
∫−∞∞x(t)δ(t−t0)dt=x(t0)\int_{-\infty}^{\infty} x(t) \delta(t - t_0) dt = x(t_0)∫−∞∞x(t)δ(t−t0)dt=x(t0)
离散版本 (Kronecker Delta):
δn={1n=00n≠0\deltan = \begin{cases} 1 & n = 0 \\ 0 & n \neq 0 \end{cases}δn={10n=0n=0
2.2.2 单位阶跃
u(t)={1t≥00t<0u(t) = \begin{cases} 1 & t \geq 0 \\ 0 & t < 0 \end{cases}u(t)={10t≥0t<0
与脉冲的关系:δ(t)=ddtu(t)\delta(t) = \frac{d}{dt}u(t)δ(t)=dtdu(t),u(t)=∫−∞tδ(τ)dτu(t) = \int_{-\infty}^{t} \delta(\tau) d\tauu(t)=∫−∞tδ(τ)dτ
2.2.3 复指数信号
x(t)=est,s=σ+jωx(t) = e^{st}, \quad s = \sigma + j\omegax(t)=est,s=σ+jω
- 当 σ=0\sigma = 0σ=0:ejωt=cos(ωt)+jsin(ωt)e^{j\omega t} = \cos(\omega t) + j\sin(\omega t)ejωt=cos(ωt)+jsin(ωt)(纯振荡)
- 当 ω=0\omega = 0ω=0:eσte^{\sigma t}eσt(纯指数增长/衰减)
- 一般情况:e(σ+jω)t=eσtcos(ωt)+jsin(ωt)e^{(\sigma + j\omega)t} = e^{\sigma t}\\cos(\\omega t) + j\\sin(\\omega t)e(σ+jω)t=eσtcos(ωt)+jsin(ωt)(振荡衰减/增长)
复指数信号是 LTI 系统的特征函数 ------输入 este^{st}est 产生输出 H(s)estH(s)e^{st}H(s)est,其中 H(s)H(s)H(s) 是系统的传递函数。
2.2.4 正弦信号
x(t)=Acos(ω0t+ϕ)=Re{Aejϕejω0t}x(t) = A\cos(\omega_0 t + \phi) = \text{Re}\{A e^{j\phi} e^{j\omega_0 t}\}x(t)=Acos(ω0t+ϕ)=Re{Aejϕejω0t}
- AAA:幅度(amplitude)
- ω0\omega_0ω0:角频率(angular frequency),单位 rad/s
- f0=ω0/(2π)f_0 = \omega_0 / (2\pi)f0=ω0/(2π):频率(frequency),单位 Hz
- ϕ\phiϕ:相位(phase),单位 rad
2.3 信号的运算
2.3.1 时移
y(t)=x(t−t0)y(t) = x(t - t_0)y(t)=x(t−t0)
信号延迟 t0t_0t0(t0>0t_0 > 0t0>0 为延迟,t0<0t_0 < 0t0<0 为超前)。
2.3.2 尺度变换
y(t)=x(at)y(t) = x(at)y(t)=x(at)
- ∣a∣>1|a| > 1∣a∣>1:压缩(时间轴缩短,频率扩展)
- ∣a∣<1|a| < 1∣a∣<1:展开(时间轴拉长,频率压缩)
- a=−1a = -1a=−1:翻转
2.3.3 卷积
(x∗h)(t)=∫−∞∞x(τ)h(t−τ)dτ(x * h)(t) = \int_{-\infty}^{\infty} x(\tau) h(t - \tau) d\tau(x∗h)(t)=∫−∞∞x(τ)h(t−τ)dτ
卷积是 LTI 系统的核心运算------输出等于输入与脉冲响应的卷积。
性质:
- 交换律:x∗h=h∗xx * h = h * xx∗h=h∗x
- 结合律:(x∗h1)∗h2=x∗(h1∗h2)(x * h_1) * h_2 = x * (h_1 * h_2)(x∗h1)∗h2=x∗(h1∗h2)
- 分配律:x∗(h1+h2)=x∗h1+x∗h2x * (h_1 + h_2) = x * h_1 + x * h_2x∗(h1+h2)=x∗h1+x∗h2
2.3.4 相关
自相关 :
Rxx(τ)=∫−∞∞x(t)x(t+τ)dtR_{xx}(\tau) = \int_{-\infty}^{\infty} x(t) x(t + \tau) dtRxx(τ)=∫−∞∞x(t)x(t+τ)dt
互相关 :
Rxy(τ)=∫−∞∞x(t)y(t+τ)dtR_{xy}(\tau) = \int_{-\infty}^{\infty} x(t) y(t + \tau) dtRxy(τ)=∫−∞∞x(t)y(t+τ)dt
自相关函数在 τ=0\tau = 0τ=0 处达到最大值,揭示了信号的"自相似性"。
2.4 信号的正交分解
2.4.1 正交函数集
函数集 {ϕn(t)}\{\phi_n(t)\}{ϕn(t)} 在区间 a,ba, ba,b 上正交,如果:
∫abϕm(t)ϕn∗(t)dt={Enm=n0m≠n\int_a^b \phi_m(t) \phi_n^*(t) dt = \begin{cases} E_n & m = n \\ 0 & m \neq n \end{cases}∫abϕm(t)ϕn∗(t)dt={En0m=nm=n
如果 En=1E_n = 1En=1 对所有 nnn,则称为标准正交集。
2.4.2 信号的展开
任何信号 x(t)x(t)x(t) 可以在正交基上展开:
x(t)=∑ncnϕn(t)x(t) = \sum_n c_n \phi_n(t)x(t)=n∑cnϕn(t)
其中系数为:
cn=1En∫abx(t)ϕn∗(t)dtc_n = \frac{1}{E_n} \int_a^b x(t) \phi_n^*(t) dtcn=En1∫abx(t)ϕn∗(t)dt
Parseval 定理:信号的能量在时域和频域相等:
∫∣x(t)∣2dt=∑n∣cn∣2En\int |x(t)|^2 dt = \sum_n |c_n|^2 E_n∫∣x(t)∣2dt=n∑∣cn∣2En
这个定理告诉我们:正交分解不改变信号的能量,只是改变了表示方式。
第三章:采样定理------从连续到离散的桥梁
3.1 为什么需要采样
数字计算机只能处理离散的数据。要将连续时间信号 x(t)x(t)x(t) 转换为离散时间信号 xnxnxn,需要进行采样(sampling):
xn=x(nTs)xn = x(nT_s)xn=x(nTs)
其中 TsT_sTs 是采样间隔,fs=1/Tsf_s = 1/T_sfs=1/Ts 是采样频率。
核心问题:采样是否会丢失信息?能否从采样值完美重建原始信号?
3.2 采样定理(Shannon-Nyquist 定理)
3.2.1 定理陈述
定理 3.1(采样定理) :如果信号 x(t)x(t)x(t) 是带限 的,即其傅里叶变换 X(f)X(f)X(f) 满足:
X(f)=0for ∣f∣>fmaxX(f) = 0 \quad \text{for } |f| > f_{\max}X(f)=0for ∣f∣>fmax
则当采样频率 fs>2fmaxf_s > 2f_{\max}fs>2fmax 时,x(t)x(t)x(t) 可以从其采样值 xn=x(nTs)xn = x(nT_s)xn=x(nTs) 完美重建:
x(t)=∑n=−∞∞xn⋅sinc(t−nTsTs)x(t) = \sum_{n=-\infty}^{\infty} xn \cdot \text{sinc}\left(\frac{t - nT_s}{T_s}\right)x(t)=n=−∞∑∞xn⋅sinc(Tst−nTs)
其中 sinc(x)=sin(πx)πx\text{sinc}(x) = \frac{\sin(\pi x)}{\pi x}sinc(x)=πxsin(πx)。
最低采样频率 fNyquist=2fmaxf_{\text{Nyquist}} = 2f_{\max}fNyquist=2fmax 称为 Nyquist 频率。
3.2.2 证明概要
- 采样在频域的效果:采样信号的频谱是原始频谱的周期延拓:
Xs(f)=fs∑k=−∞∞X(f−kfs)X_s(f) = f_s \sum_{k=-\infty}^{\infty} X(f - kf_s)Xs(f)=fsk=−∞∑∞X(f−kfs)
-
无混叠条件 :当 fs>2fmaxf_s > 2f_{\max}fs>2fmax 时,频谱的各个副本不重叠。
-
重建 :用理想低通滤波器(截止频率 fs/2f_s/2fs/2)提取原始频谱。
3.2.3 混叠(Aliasing)
当 fs<2fmaxf_s < 2f_{\max}fs<2fmax 时,频谱的副本会重叠,导致混叠------高频成分"伪装"成低频成分。
例子 :考虑信号 x(t)=cos(2π⋅100t)x(t) = \cos(2\pi \cdot 100t)x(t)=cos(2π⋅100t)(频率 100 Hz),采样频率 fs=150f_s = 150fs=150 Hz。
理论上需要 fs>200f_s > 200fs>200 Hz。当 fs=150f_s = 150fs=150 Hz 时,100 Hz 的信号会混叠到 150−100=50150 - 100 = 50150−100=50 Hz。
3.2.4 反混叠滤波器
实际系统中,在采样之前先用反混叠滤波器 (低通滤波器,截止频率 fs/2f_s/2fs/2)滤除高于 Nyquist 频率的成分:
xfiltered(t)=x(t)∗hAA(t)x_{\text{filtered}}(t) = x(t) * h_{\text{AA}}(t)xfiltered(t)=x(t)∗hAA(t)
xn=xfiltered(nTs)xn = x_{\text{filtered}}(nT_s)xn=xfiltered(nTs)
3.3 量化
3.3.1 量化过程
采样将时间离散化,量化(quantization) 将幅度离散化:
xqn=Q(xn)x_qn = Q(xn)xqn=Q(xn)
其中 Q(⋅)Q(\cdot)Q(⋅) 是量化函数,将连续幅度映射到有限个离散值。
3.3.2 量化噪声
量化引入的误差 en=xqn−xnen = x_qn - xnen=xqn−xn 可以建模为均匀分布的随机噪声:
SNRquantization=6.02B+1.76 dB\text{SNR}_{\text{quantization}} = 6.02B + 1.76 \text{ dB}SNRquantization=6.02B+1.76 dB
其中 BBB 是量化位数(bit)。每增加 1 bit,SNR 提高约 6 dB。
3.3.3 ADC 与 DAC
- ADC(模数转换器):连续信号 → 离散信号(采样 + 量化)
- DAC(数模转换器):离散信号 → 连续信号(重建)
3.4 过采样与噪声整形
3.4.1 过采样
以远高于 Nyquist 频率的速率采样(如 4x, 8x, 64x),可以:
- 降低反混叠滤波器的设计难度
- 将量化噪声分散到更宽的频带
- 通过后续滤波提高有效分辨率
3.4.2 Sigma-Delta 调制
Sigma-Delta ADC 结合过采样和噪声整形:
- 在信号频带内压低量化噪声
- 将噪声"推"到高频(后续用数字滤波器滤除)
- 实现 24-bit 甚至更高的有效分辨率
第二部分:傅里叶分析
第四章:傅里叶级数------周期信号的频域表示
4.1 傅里叶级数的动机
周期信号可以分解为不同频率的正弦波之和------这是傅里叶分析的核心洞察。
考虑一个周期为 TTT 的信号 x(t)x(t)x(t),其基频为 f0=1/Tf_0 = 1/Tf0=1/T,角频率为 ω0=2πf0\omega_0 = 2\pi f_0ω0=2πf0。
4.2 三角形式的傅里叶级数
定理 4.1(傅里叶级数) :任何满足 Dirichlet 条件的周期信号 x(t)x(t)x(t)(周期 TTT)可以展开为:
x(t)=a0+∑n=1∞ancos(nω0t)+bnsin(nω0t)x(t) = a_0 + \sum_{n=1}^{\infty} a_n \\cos(n\\omega_0 t) + b_n \\sin(n\\omega_0 t)x(t)=a0+n=1∑∞ancos(nω0t)+bnsin(nω0t)
其中:
a0=1T∫0Tx(t)dt(直流分量)a_0 = \frac{1}{T} \int_0^T x(t) dt \quad \text{(直流分量)}a0=T1∫0Tx(t)dt(直流分量)
an=2T∫0Tx(t)cos(nω0t)dt(余弦系数)a_n = \frac{2}{T} \int_0^T x(t) \cos(n\omega_0 t) dt \quad \text{(余弦系数)}an=T2∫0Tx(t)cos(nω0t)dt(余弦系数)
bn=2T∫0Tx(t)sin(nω0t)dt(正弦系数)b_n = \frac{2}{T} \int_0^T x(t) \sin(n\omega_0 t) dt \quad \text{(正弦系数)}bn=T2∫0Tx(t)sin(nω0t)dt(正弦系数)
4.3 指数形式的傅里叶级数
使用欧拉公式 ejθ=cosθ+jsinθe^{j\theta} = \cos\theta + j\sin\thetaejθ=cosθ+jsinθ,傅里叶级数可以写成更紧凑的指数形式:
x(t)=∑n=−∞∞cnejnω0tx(t) = \sum_{n=-\infty}^{\infty} c_n e^{jn\omega_0 t}x(t)=n=−∞∑∞cnejnω0t
其中:
cn=1T∫0Tx(t)e−jnω0tdtc_n = \frac{1}{T} \int_0^T x(t) e^{-jn\omega_0 t} dtcn=T1∫0Tx(t)e−jnω0tdt
系数之间的关系:
- c0=a0c_0 = a_0c0=a0
- cn=12(an−jbn)c_n = \frac{1}{2}(a_n - jb_n)cn=21(an−jbn),n>0n > 0n>0
- cn=c−n∗c_n = c_{-n}^*cn=c−n∗(共轭对称,当 x(t)x(t)x(t) 为实信号时)
4.4 傅里叶级数的收敛性
4.4.1 Dirichlet 条件
傅里叶级数收敛的充分条件(Dirichlet 条件):
- x(t)x(t)x(t) 在一个周期内绝对可积
- x(t)x(t)x(t) 在一个周期内只有有限个极值点
- x(t)x(t)x(t) 在一个周期内只有有限个第一类间断点
4.4.2 Gibbs 现象
在间断点附近,傅里叶级数的部分和会出现约 9% 的超调------这就是 Gibbs 现象。即使取无穷多项,这个超调也不会消失。
4.5 周期信号的频谱
4.5.1 幅度谱与相位谱
将傅里叶系数写成极坐标形式:
cn=∣cn∣ej∠cnc_n = |c_n| e^{j\angle c_n}cn=∣cn∣ej∠cn
- ∣cn∣|c_n|∣cn∣:幅度谱------各频率分量的幅度
- ∠cn\angle c_n∠cn:相位谱------各频率分量的相位
4.5.2 功率谱
周期信号的平均功率可以用 Parseval 定理计算:
P=1T∫0T∣x(t)∣2dt=∑n=−∞∞∣cn∣2P = \frac{1}{T} \int_0^T |x(t)|^2 dt = \sum_{n=-\infty}^{\infty} |c_n|^2P=T1∫0T∣x(t)∣2dt=n=−∞∑∞∣cn∣2
∣cn∣2|c_n|^2∣cn∣2 是第 nnn 次谐波的功率------这就是功率谱。
4.6 典型信号的傅里叶级数
4.6.1 方波
周期为 TTT、幅度为 AAA 的方波:
x(t)=4Aπ∑n=1,3,5,...∞1nsin(nω0t)x(t) = \frac{4A}{\pi} \sum_{n=1,3,5,\ldots}^{\infty} \frac{1}{n} \sin(n\omega_0 t)x(t)=π4An=1,3,5,...∑∞n1sin(nω0t)
只有奇次谐波,幅度按 1/n1/n1/n 衰减。
4.6.2 三角波
x(t)=8Aπ2∑n=1,3,5,...∞(−1)(n−1)/2n2sin(nω0t)x(t) = \frac{8A}{\pi^2} \sum_{n=1,3,5,\ldots}^{\infty} \frac{(-1)^{(n-1)/2}}{n^2} \sin(n\omega_0 t)x(t)=π28An=1,3,5,...∑∞n2(−1)(n−1)/2sin(nω0t)
只有奇次谐波,幅度按 1/n21/n^21/n2 衰减(比方波衰减更快)。
第五章:傅里叶变换------非周期信号的频域表示
5.1 从傅里叶级数到傅里叶变换
当信号的周期 T→∞T \to \inftyT→∞ 时,离散的频谱变成连续的------这就是傅里叶变换。
5.1.1 推导
傅里叶级数:
x(t)=∑n=−∞∞cnejnω0t,cn=1T∫−T/2T/2x(t)e−jnω0tdtx(t) = \sum_{n=-\infty}^{\infty} c_n e^{jn\omega_0 t}, \quad c_n = \frac{1}{T} \int_{-T/2}^{T/2} x(t) e^{-jn\omega_0 t} dtx(t)=n=−∞∑∞cnejnω0t,cn=T1∫−T/2T/2x(t)e−jnω0tdt
令 T→∞T \to \inftyT→∞,ω0→dω\omega_0 \to d\omegaω0→dω,nω0→ωn\omega_0 \to \omeganω0→ω,求和变为积分:
x(t)=12π∫−∞∞X(jω)ejωtdωx(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} X(j\omega) e^{j\omega t} d\omegax(t)=2π1∫−∞∞X(jω)ejωtdω
X(jω)=∫−∞∞x(t)e−jωtdtX(j\omega) = \int_{-\infty}^{\infty} x(t) e^{-j\omega t} dtX(jω)=∫−∞∞x(t)e−jωtdt
5.2 傅里叶变换的定义
傅里叶变换(Fourier Transform, FT):
X(jω)=F{x(t)}=∫−∞∞x(t)e−jωtdtX(j\omega) = \mathcal{F}\{x(t)\} = \int_{-\infty}^{\infty} x(t) e^{-j\omega t} dtX(jω)=F{x(t)}=∫−∞∞x(t)e−jωtdt
傅里叶逆变换(Inverse FT):
x(t)=F−1{X(jω)}=12π∫−∞∞X(jω)ejωtdωx(t) = \mathcal{F}^{-1}\{X(j\omega)\} = \frac{1}{2\pi} \int_{-\infty}^{\infty} X(j\omega) e^{j\omega t} d\omegax(t)=F−1{X(jω)}=2π1∫−∞∞X(jω)ejωtdω
使用频率 fff(Hz)代替角频率 ω\omegaω(rad/s):
X(f)=∫−∞∞x(t)e−j2πftdtX(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dtX(f)=∫−∞∞x(t)e−j2πftdt
x(t)=∫−∞∞X(f)ej2πftdfx(t) = \int_{-\infty}^{\infty} X(f) e^{j2\pi ft} dfx(t)=∫−∞∞X(f)ej2πftdf
5.3 傅里叶变换的性质
| 性质 | 时域 | 频域 |
|---|---|---|
| 线性性 | ax1(t)+bx2(t)ax_1(t) + bx_2(t)ax1(t)+bx2(t) | aX1(jω)+bX2(jω)aX_1(j\omega) + bX_2(j\omega)aX1(jω)+bX2(jω) |
| 时移 | x(t−t0)x(t - t_0)x(t−t0) | e−jωt0X(jω)e^{-j\omega t_0} X(j\omega)e−jωt0X(jω) |
| 频移 | ejω0tx(t)e^{j\omega_0 t} x(t)ejω0tx(t) | X(j(ω−ω0))X(j(\omega - \omega_0))X(j(ω−ω0)) |
| 尺度变换 | x(at)x(at)x(at) | $\frac{1}{ |
| 时域卷积 | x1(t)∗x2(t)x_1(t) * x_2(t)x1(t)∗x2(t) | X1(jω)⋅X2(jω)X_1(j\omega) \cdot X_2(j\omega)X1(jω)⋅X2(jω) |
| 频域卷积 | x1(t)⋅x2(t)x_1(t) \cdot x_2(t)x1(t)⋅x2(t) | 12πX1(jω)∗X2(jω)\frac{1}{2\pi} X_1(j\omega) * X_2(j\omega)2π1X1(jω)∗X2(jω) |
| 时域微分 | ddtx(t)\frac{d}{dt}x(t)dtdx(t) | jωX(jω)j\omega X(j\omega)jωX(jω) |
| Parseval | $\int | x(t) |
卷积定理 是信号处理中最重要的定理之一:时域的卷积等于频域的乘积。
这意味着:要计算两个信号的卷积,可以:
- 分别计算它们的傅里叶变换
- 在频域相乘
- 计算逆傅里叶变换
这比直接在时域计算卷积要高效得多(特别是结合 FFT 算法)。
5.4 典型信号的傅里叶变换
5.4.1 矩形脉冲
x(t)=rect(t/τ)={1∣t∣≤τ/20∣t∣>τ/2x(t) = \text{rect}(t/\tau) = \begin{cases} 1 & |t| \leq \tau/2 \\ 0 & |t| > \tau/2 \end{cases}x(t)=rect(t/τ)={10∣t∣≤τ/2∣t∣>τ/2
X(jω)=τ⋅sinc(ωτ/2π)=τ⋅sin(ωτ/2)ωτ/2X(j\omega) = \tau \cdot \text{sinc}(\omega\tau/2\pi) = \tau \cdot \frac{\sin(\omega\tau/2)}{\omega\tau/2}X(jω)=τ⋅sinc(ωτ/2π)=τ⋅ωτ/2sin(ωτ/2)
观察 :时域越窄,频域越宽------这是不确定性原理的体现。
5.4.2 高斯脉冲
x(t)=e−t2/(2σ2)x(t) = e^{-t^2/(2\sigma^2)}x(t)=e−t2/(2σ2)
X(jω)=σ2π⋅e−σ2ω2/2X(j\omega) = \sigma\sqrt{2\pi} \cdot e^{-\sigma^2\omega^2/2}X(jω)=σ2π ⋅e−σ2ω2/2
观察:高斯函数的傅里叶变换仍然是高斯函数------它是时频分析中的"最优"信号。
5.4.3 单位脉冲
x(t)=δ(t)x(t) = \delta(t)x(t)=δ(t)
X(jω)=1X(j\omega) = 1X(jω)=1
脉冲包含所有频率成分,且幅度相等------这就是为什么脉冲响应可以完全刻画 LTI 系统。
5.4.4 复指数
x(t)=ejω0tx(t) = e^{j\omega_0 t}x(t)=ejω0t
X(jω)=2πδ(ω−ω0)X(j\omega) = 2\pi\delta(\omega - \omega_0)X(jω)=2πδ(ω−ω0)
纯正弦波在频域是一个脉冲------它只包含一个频率。
5.5 能量谱与功率谱
5.5.1 能量谱密度
对于能量信号,能量谱密度(Energy Spectral Density, ESD) 定义为:
Sxx(ω)=∣X(jω)∣2S_{xx}(\omega) = |X(j\omega)|^2Sxx(ω)=∣X(jω)∣2
总能量:E=12π∫−∞∞Sxx(ω)dω=∫−∞∞∣x(t)∣2dtE = \frac{1}{2\pi} \int_{-\infty}^{\infty} S_{xx}(\omega) d\omega = \int_{-\infty}^{\infty} |x(t)|^2 dtE=2π1∫−∞∞Sxx(ω)dω=∫−∞∞∣x(t)∣2dt
5.5.2 功率谱密度
对于功率信号,功率谱密度(Power Spectral Density, PSD) 定义为:
Sxx(ω)=limT→∞1T∣XT(jω)∣2S_{xx}(\omega) = \lim_{T \to \infty} \frac{1}{T} |X_T(j\omega)|^2Sxx(ω)=T→∞limT1∣XT(jω)∣2
其中 XT(jω)X_T(j\omega)XT(jω) 是 x(t)x(t)x(t) 截断到 −T/2,T/2-T/2, T/2−T/2,T/2 后的傅里叶变换。
Wiener-Khinchin 定理:平稳随机过程的 PSD 是其自相关函数的傅里叶变换:
Sxx(ω)=∫−∞∞Rxx(τ)e−jωτdτS_{xx}(\omega) = \int_{-\infty}^{\infty} R_{xx}(\tau) e^{-j\omega\tau} d\tauSxx(ω)=∫−∞∞Rxx(τ)e−jωτdτ
第六章:离散傅里叶变换与快速算法
6.1 离散傅里叶变换(DFT)
6.1.1 从 DTFT 到 DFT
离散时间傅里叶变换(DTFT):
X(ejω)=∑n=−∞∞xne−jωnX(e^{j\omega}) = \sum_{n=-\infty}^{\infty} xn e^{-j\omega n}X(ejω)=n=−∞∑∞xne−jωn
DTFT 是连续的频率函数,计算机无法直接计算。
离散傅里叶变换(DFT) 对有限长序列进行有限个频率点的采样:
Xk=∑n=0N−1xne−j2πkn/N,k=0,1,...,N−1Xk = \sum_{n=0}^{N-1} xn e^{-j2\pi kn/N}, \quad k = 0, 1, \dots, N-1Xk=n=0∑N−1xne−j2πkn/N,k=0,1,...,N−1
逆 DFT(IDFT):
xn=1N∑k=0N−1Xkej2πkn/N,n=0,1,...,N−1xn = \frac{1}{N} \sum_{k=0}^{N-1} Xk e^{j2\pi kn/N}, \quad n = 0, 1, \dots, N-1xn=N1k=0∑N−1Xkej2πkn/N,n=0,1,...,N−1
6.1.2 DFT 的性质
| 性质 | 时域 | 频域 |
|---|---|---|
| 线性性 | ax1n+bx2nax_1n + bx_2nax1n+bx2n | aX1k+bX2kaX_1k + bX_2kaX1k+bX2k |
| 圆周移位 | x(n−m)mod Nx(n-m) \\mod Nx(n−m)modN | e−j2πkm/NXke^{-j2\pi km/N} Xke−j2πkm/NXk |
| 圆周卷积 | x1n⊛x2nx_1n \circledast x_2nx1n⊛x2n | X1k⋅X2kX_1k \cdot X_2kX1k⋅X2k |
| Parseval | $\sum | xn |
6.1.3 圆周卷积与线性卷积
DFT 的圆周卷积不等于线性卷积。要通过 DFT 计算线性卷积,需要补零:
将 x1nx_1nx1n(长度 LLL)和 x2nx_2nx2n(长度 MMM)都补零到长度 N≥L+M−1N \geq L + M - 1N≥L+M−1,然后:
x1n∗x2n=IDFT{DFT{x1}⋅DFT{x2}}x_1n * x_2n = \text{IDFT}\{\text{DFT}\{x_1\} \cdot \text{DFT}\{x_2\}\}x1n∗x2n=IDFT{DFT{x1}⋅DFT{x2}}
6.2 快速傅里叶变换(FFT)
6.2.1 DFT 的计算复杂度
直接计算 DFT 需要 O(N2)O(N^2)O(N2) 次复数乘法和加法。
6.2.2 Cooley-Tukey FFT 算法
FFT 利用 DFT 的对称性和周期性,将 NNN 点 DFT 分解为两个 N/2N/2N/2 点 DFT:
Xk=∑n=0N−1xnWNknXk = \sum_{n=0}^{N-1} xn W_N^{kn}Xk=n=0∑N−1xnWNkn
其中 WN=e−j2π/NW_N = e^{-j2\pi/N}WN=e−j2π/N 是旋转因子。
蝶形运算:
Xk=Ek+WNkOkXk = Ek + W_N^k OkXk=Ek+WNkOk
Xk+N/2=Ek−WNkOkXk + N/2 = Ek - W_N^k OkXk+N/2=Ek−WNkOk
其中 EkEkEk 和 OkOkOk 分别是偶数项和奇数项的 DFT。
复杂度 :O(NlogN)O(N \log N)O(NlogN)
当 N=1024N = 1024N=1024 时,FFT 比直接 DFT 快约 100 倍。
6.2.3 FFT 的变体
- 基-2 FFT :NNN 必须是 2 的幂
- 分裂基 FFT:混合使用基-2 和基-4
- Chirp-Z 变换:在任意螺旋路径上计算 Z 变换
- Rader 算法 :NNN 为质数时的 FFT
6.3 窗函数
6.3.1 频谱泄漏
对有限长信号进行 DFT 相当于用矩形窗截断信号。这会导致频谱泄漏------能量从一个频率"泄漏"到其他频率。
6.3.2 常用窗函数
| 窗函数 | 主瓣宽度 | 旁瓣衰减 | 应用 |
|---|---|---|---|
| 矩形窗 | 最窄 | -13 dB | 频率分辨率要求高 |
| Hann 窗 | 中等 | -31 dB | 通用 |
| Hamming 窗 | 中等 | -43 dB | 通用 |
| Blackman 窗 | 较宽 | -58 dB | 旁瓣抑制要求高 |
| Kaiser 窗 | 可调 | 可调 | 灵活设计 |
6.3.3 窗函数的选择
- 频率分辨率优先:选择主瓣窄的窗(矩形窗)
- 旁瓣抑制优先:选择旁瓣衰减大的窗(Blackman 窗)
- 折中:Hann 窗或 Hamming 窗
6.4 短时傅里叶变换(STFT)
6.4.1 定义
短时傅里叶变换(STFT) 在信号的不同位置计算局部频谱:
X(t,f)=∫−∞∞x(τ)w(τ−t)e−j2πfτdτX(t, f) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j2\pi f\tau} d\tauX(t,f)=∫−∞∞x(τ)w(τ−t)e−j2πfτdτ
其中 w(t)w(t)w(t) 是窗函数。
6.4.2 时频分辨率
Heisenberg-Gabor 不确定性原理:
Δt⋅Δf≥14π\Delta t \cdot \Delta f \geq \frac{1}{4\pi}Δt⋅Δf≥4π1
- 窗宽(时间分辨率好)→ 频率分辨率差
- 窗窄(频率分辨率好)→ 时间分辨率差
这是信号处理中的基本限制------不可能同时获得任意高的时间分辨率和频率分辨率。
第三部分:数字滤波器
第七章:数字滤波器基础------差分方程与传递函数
7.1 LTI 离散系统
7.1.1 差分方程
线性时不变离散系统的输入-输出关系由常系数线性差分方程描述:
∑k=0Nakyn−k=∑k=0Mbkxn−k\sum_{k=0}^{N} a_k yn-k = \sum_{k=0}^{M} b_k xn-kk=0∑Nakyn−k=k=0∑Mbkxn−k
即:
a0yn+a1yn−1+⋯+aNyn−N=b0xn+b1xn−1+⋯+bMxn−Ma_0 yn + a_1 yn-1 + \cdots + a_N yn-N = b_0 xn + b_1 xn-1 + \cdots + b_M xn-Ma0yn+a1yn−1+⋯+aNyn−N=b0xn+b1xn−1+⋯+bMxn−M
7.1.2 脉冲响应
系统的脉冲响应 hnhnhn 是输入为单位脉冲 δn\deltanδn 时的输出:
hn=output when xn=δnhn = \text{output when } xn = \deltanhn=output when xn=δn
对于 LTI 系统,输出等于输入与脉冲响应的卷积:
yn=(x∗h)n=∑k=−∞∞xkhn−kyn = (x * h)n = \sum_{k=-\infty}^{\infty} xk hn-kyn=(x∗h)n=k=−∞∑∞xkhn−k
7.2 Z 变换
7.2.1 定义
Z 变换是离散系统分析的核心工具:
X(z)=∑n=−∞∞xnz−nX(z) = \sum_{n=-\infty}^{\infty} xn z^{-n}X(z)=n=−∞∑∞xnz−n
其中 zzz 是复变量。
逆 Z 变换:
xn=12πj∮X(z)zn−1dzxn = \frac{1}{2\pi j} \oint X(z) z^{n-1} dzxn=2πj1∮X(z)zn−1dz
7.2.2 Z 变换与 DTFT 的关系
当 z=ejωz = e^{j\omega}z=ejω(单位圆上)时,Z 变换就是 DTFT:
X(ejω)=∑n=−∞∞xne−jωnX(e^{j\omega}) = \sum_{n=-\infty}^{\infty} xn e^{-j\omega n}X(ejω)=n=−∞∑∞xne−jωn
7.2.3 传递函数
系统的传递函数定义为:
H(z)=Y(z)X(z)=∑k=0Mbkz−k∑k=0Nakz−k=b0+b1z−1+⋯+bMz−Ma0+a1z−1+⋯+aNz−NH(z) = \frac{Y(z)}{X(z)} = \frac{\sum_{k=0}^{M} b_k z^{-k}}{\sum_{k=0}^{N} a_k z^{-k}} = \frac{b_0 + b_1 z^{-1} + \cdots + b_M z^{-M}}{a_0 + a_1 z^{-1} + \cdots + a_N z^{-N}}H(z)=X(z)Y(z)=∑k=0Nakz−k∑k=0Mbkz−k=a0+a1z−1+⋯+aNz−Nb0+b1z−1+⋯+bMz−M
- 零点 :使分子为零的 zzz 值
- 极点 :使分母为零的 zzz 值
稳定性条件 :所有极点必须在单位圆内(∣z∣<1|z| < 1∣z∣<1)。
7.3 频率响应
7.3.1 定义
系统的频率响应是传递函数在单位圆上的值:
H(ejω)=H(z)∣z=ejωH(e^{j\omega}) = H(z)\big|_{z=e^{j\omega}}H(ejω)=H(z) z=ejω
- ∣H(ejω)∣|H(e^{j\omega})|∣H(ejω)∣:幅度响应
- ∠H(ejω)\angle H(e^{j\omega})∠H(ejω):相位响应
7.3.2 滤波器的分类
根据频率响应的形状,滤波器分为:
| 类型 | 功能 | 频率响应 |
|---|---|---|
| 低通(LPF) | 通过低频,阻止高频 | $ |
| 高通(HPF) | 通过高频,阻止低频 | $ |
| 带通(BPF) | 通过某个频带 | $ |
| 带阻(BSF) | 阻止某个频带 | $ |
第八章:FIR 滤波器设计
8.1 FIR 滤波器的特点
FIR(有限脉冲响应) 滤波器的脉冲响应 hnhnhn 只有有限个非零值:
yn=∑k=0Mhkxn−kyn = \sum_{k=0}^{M} hk xn-kyn=k=0∑Mhkxn−k
优点:
- 总是稳定(脉冲响应有限)
- 可以实现严格的线性相位
- 没有反馈,不存在极限环
缺点:
- 实现相同性能需要更高的阶数
- 计算量较大
8.2 线性相位 FIR 滤波器
8.2.1 线性相位条件
FIR 滤波器具有线性相位,当且仅当脉冲响应满足对称条件:
Type I :MMM 为偶数,hn=hM−nhn = hM-nhn=hM−n(对称)
Type II :MMM 为奇数,hn=hM−nhn = hM-nhn=hM−n(对称)
Type III :MMM 为偶数,hn=−hM−nhn = -hM-nhn=−hM−n(反对称)
Type IV :MMM 为奇数,hn=−hM−nhn = -hM-nhn=−hM−n(反对称)
8.2.2 线性相位的意义
线性相位意味着所有频率成分经历相同的延迟:
∠H(ejω)=−αω\angle H(e^{j\omega}) = -\alpha\omega∠H(ejω)=−αω
这避免了相位失真------不同频率成分不会发生相对时移。
8.3 窗函数法
8.3.1 基本思想
- 选择理想的(非因果、无限长)脉冲响应 hdnh_dnhdn
- 用窗函数 wnwnwn 截断:hn=hdn⋅wnhn = h_dn \cdot wnhn=hdn⋅wn
8.3.2 理想低通滤波器
理想低通滤波器的脉冲响应:
hdn=sin(ωc(n−M/2))π(n−M/2)h_dn = \frac{\sin(\omega_c (n - M/2))}{\pi (n - M/2)}hdn=π(n−M/2)sin(ωc(n−M/2))
这是非因果的(nnn 从 −∞-\infty−∞ 到 ∞\infty∞),需要用窗函数截断。
8.3.3 设计步骤
- 确定滤波器类型(低通、高通等)
- 确定截止频率 ωc\omega_cωc 和过渡带宽 Δω\Delta\omegaΔω
- 选择窗函数和滤波器阶数 MMM
- 计算理想脉冲响应
- 加窗得到实际脉冲响应
8.4 频率采样法
8.4.1 基本思想
直接在频域采样:指定 H(ejω)H(e^{j\omega})H(ejω) 在 NNN 个等距频率点的值,然后通过 IDFT 得到 hnhnhn。
8.4.2 设计步骤
- 在 [0,2π)[0, 2\pi)[0,2π) 上均匀采样 NNN 个频率点
- 指定期望的幅度和相位响应
- 计算 IDFT 得到 hnhnhn
8.5 最优 FIR 滤波器设计(Parks-McClellan 算法)
8.5.1 等纹波设计
Parks-McClellan 算法设计的滤波器在通带和阻带都有等幅的纹波:
minhmaxω∈S∣W(ω)Hd(ejω)−H(ejω)∣\min_{h} \max_{\omega \in S} |W(\omega)H_d(e\^{j\\omega}) - H(e\^{j\\omega})|hminω∈Smax∣W(ω)Hd(ejω)−H(ejω)∣
其中 SSS 是需要优化的频率集合,W(ω)W(\omega)W(ω) 是加权函数。
8.5.2 Remez 交换算法
Parks-McClellan 算法使用 Remez 交换算法求解这个 minimax 优化问题。
第九章:IIR 滤波器设计
9.1 IIR 滤波器的特点
IIR(无限脉冲响应) 滤波器具有反馈:
yn=∑k=0Mbkxn−k−∑k=1Nakyn−kyn = \sum_{k=0}^{M} b_k xn-k - \sum_{k=1}^{N} a_k yn-kyn=k=0∑Mbkxn−k−k=1∑Nakyn−k
优点:
- 实现相同性能需要更低的阶数
- 计算效率高
缺点:
- 可能不稳定
- 不能实现严格的线性相位
- 可能存在极限环
9.2 从模拟滤波器到数字滤波器
9.2.1 经典模拟滤波器
| 滤波器 | 特点 | 幅度响应 |
|---|---|---|
| Butterworth | 最平坦 | 单调下降 |
| Chebyshev I | 通带等纹波 | 通带有纹波 |
| Chebyshev II | 阻带等纹波 | 阻带有纹波 |
| 椭圆 | 通带和阻带都等纹波 | 最优选择性 |
9.2.2 双线性变换
双线性变换将模拟滤波器转换为数字滤波器:
s=2Ts⋅z−1z+1s = \frac{2}{T_s} \cdot \frac{z-1}{z+1}s=Ts2⋅z+1z−1
优点:
- 保持稳定性(左半平面映射到单位圆内)
- 没有混叠
缺点:
- 频率畸变(warping):ωa=2Tstan(ωdTs/2)\omega_a = \frac{2}{T_s} \tan(\omega_d T_s / 2)ωa=Ts2tan(ωdTs/2)
9.2.3 预畸变
为了补偿频率畸变,在设计模拟滤波器时预先畸变截止频率:
ωa,c=2Tstan(ωd,cTs/2)\omega_{a,c} = \frac{2}{T_s} \tan(\omega_{d,c} T_s / 2)ωa,c=Ts2tan(ωd,cTs/2)
9.3 Butterworth 滤波器
9.3.1 幅度响应
∣H(jω)∣2=11+(ω/ωc)2N|H(j\omega)|^2 = \frac{1}{1 + (\omega/\omega_c)^{2N}}∣H(jω)∣2=1+(ω/ωc)2N1
NNN 阶 Butterworth 滤波器在 ω=0\omega = 0ω=0 处有 2N−12N-12N−1 阶零导数(最平坦)。
9.3.2 极点位置
sss 平面上的极点均匀分布在左半平面的 Butterworth 圆上:
sk=ωcejπ(2k+N−1)/(2N),k=1,2,...,Ns_k = \omega_c e^{j\pi(2k+N-1)/(2N)}, \quad k = 1, 2, \dots, Nsk=ωcejπ(2k+N−1)/(2N),k=1,2,...,N
9.4 Chebyshev 滤波器
9.4.1 Chebyshev I 型
∣H(jω)∣2=11+ϵ2TN2(ω/ωc)|H(j\omega)|^2 = \frac{1}{1 + \epsilon^2 T_N^2(\omega/\omega_c)}∣H(jω)∣2=1+ϵ2TN2(ω/ωc)1
其中 TNT_NTN 是 NNN 阶 Chebyshev 多项式。
通带有等纹波,阻带单调下降。
9.4.2 Chebyshev II 型
∣H(jω)∣2=11+1/(ϵ2TN2(ωs/ω))|H(j\omega)|^2 = \frac{1}{1 + 1/(\epsilon^2 T_N^2(\omega_s/\omega))}∣H(jω)∣2=1+1/(ϵ2TN2(ωs/ω))1
通带单调,阻带有等纹波。
9.5 椭圆滤波器
椭圆滤波器(Cauer 滤波器)在通带和阻带都有等纹波,是给定阶数下选择性最好的滤波器。
第四部分:高级主题
第十章:Z 变换与系统分析
10.1 Z 变换的性质
| 性质 | 时域 | Z 域 |
|---|---|---|
| 线性性 | ax1n+bx2nax_1n + bx_2nax1n+bx2n | aX1(z)+bX2(z)aX_1(z) + bX_2(z)aX1(z)+bX2(z) |
| 时移 | xn−kxn-kxn−k | z−kX(z)z^{-k}X(z)z−kX(z) |
| 卷积 | x1n∗x2nx_1n * x_2nx1n∗x2n | X1(z)⋅X2(z)X_1(z) \cdot X_2(z)X1(z)⋅X2(z) |
| 初值 | x0x0x0 | limz→∞X(z)\lim_{z \to \infty} X(z)limz→∞X(z) |
| 终值 | limn→∞xn\lim_{n \to \infty} xnlimn→∞xn | limz→1(z−1)X(z)\lim_{z \to 1} (z-1)X(z)limz→1(z−1)X(z) |
10.2 逆 Z 变换
10.2.1 部分分式展开
将 X(z)X(z)X(z) 展开为部分分式,然后逐项求逆变换。
10.2.2 幂级数展开
将 X(z)X(z)X(z) 展开为 z−1z^{-1}z−1 的幂级数,系数就是 xnxnxn。
10.2.3 围线积分
xn=12πj∮X(z)zn−1dzxn = \frac{1}{2\pi j} \oint X(z) z^{n-1} dzxn=2πj1∮X(z)zn−1dz
可以用留数定理计算。
10.3 系统分析
10.3.1 稳定性
系统稳定的充要条件:所有极点在单位圆内。
10.3.2 因果性
系统因果的充要条件:hn=0hn = 0hn=0 for n<0n < 0n<0,即 H(z)H(z)H(z) 的 ROC 包含无穷远点。
10.3.3 频率响应
H(ejω)H(e^{j\omega})H(ejω) 给出了系统对不同频率正弦输入的增益和相移。
第十一章:谱估计与频谱分析
11.1 经典谱估计
11.1.1 周期图
周期图(Periodogram) 是最简单的谱估计方法:
S^xx(ejω)=1N∣XN(ejω)∣2\hat{S}_{xx}(e^{j\omega}) = \frac{1}{N} |X_N(e^{j\omega})|^2S^xx(ejω)=N1∣XN(ejω)∣2
其中 XNX_NXN 是 NNN 点数据的 DFT。
问题 :方差大,不随 NNN 增大而减小。
11.1.2 修正周期图
使用窗函数减少泄漏:
S^xx(ejω)=1N∣∑n=0N−1xnwne−jωn∣2\hat{S}{xx}(e^{j\omega}) = \frac{1}{N} \left|\sum{n=0}^{N-1} xn wn e^{-j\omega n}\right|^2S^xx(ejω)=N1 n=0∑N−1xnwne−jωn 2
11.1.3 Bartlett 方法
将数据分为 KKK 段,分别计算周期图,然后平均:
S^xxB(ejω)=1K∑k=1KS^xx(k)(ejω)\hat{S}{xx}^B(e^{j\omega}) = \frac{1}{K} \sum{k=1}^{K} \hat{S}_{xx}^{(k)}(e^{j\omega})S^xxB(ejω)=K1k=1∑KS^xx(k)(ejω)
方差减小 KKK 倍,但频率分辨率也降低。
11.1.4 Welch 方法
Bartlett 方法的改进:允许数据段重叠,并使用窗函数。
11.2 现代谱估计(参数方法)
11.2.1 自回归(AR)模型
将信号建模为白噪声通过全极点滤波器的输出:
xn=−∑k=1pakxn−k+enxn = -\sum_{k=1}^{p} a_k xn-k + enxn=−k=1∑pakxn−k+en
PSD 估计:
S^xx(ejω)=σe2∣1+∑k=1pake−jωk∣2\hat{S}{xx}(e^{j\omega}) = \frac{\sigma_e^2}{|1 + \sum{k=1}^{p} a_k e^{-j\omega k}|^2}S^xx(ejω)=∣1+∑k=1pake−jωk∣2σe2
11.2.2 Yule-Walker 方程
AR 模型参数通过 Yule-Walker 方程求解:
∑k=0pakRxxm−k=0,m=1,2,...,p\sum_{k=0}^{p} a_k R_{xx}m-k = 0, \quad m = 1, 2, \dots, pk=0∑pakRxxm−k=0,m=1,2,...,p
这可以用 Levinson-Durbin 算法高效求解。
11.2.3 MUSIC 算法
MUSIC(Multiple Signal Classification) 是一种基于子空间分解的高分辨率谱估计方法:
- 计算信号的自相关矩阵
- 特征分解,分离信号子空间和噪声子空间
- 利用噪声子空间构造伪谱
第十二章:时频分析与小波变换
12.1 时频分析的动机
傅里叶变换只告诉我们信号包含哪些频率,不告诉我们这些频率何时出现。
对于非平稳信号(频率随时间变化),需要同时分析时间和频率。
12.2 短时傅里叶变换(STFT)
X(t,f)=∫−∞∞x(τ)w(τ−t)e−j2πfτdτX(t, f) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j2\pi f\tau} d\tauX(t,f)=∫−∞∞x(τ)w(τ−t)e−j2πfτdτ
STFT 使用固定宽度的窗函数,时频分辨率是固定的。
12.3 连续小波变换(CWT)
12.3.1 定义
Wx(a,b)=1∣a∣∫−∞∞x(t)ψ∗(t−ba)dtW_x(a, b) = \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} x(t) \psi^*\left(\frac{t-b}{a}\right) dtWx(a,b)=∣a∣ 1∫−∞∞x(t)ψ∗(at−b)dt
其中 ψ(t)\psi(t)ψ(t) 是母小波 ,aaa 是尺度参数(对应频率),bbb 是平移参数(对应时间)。
12.3.2 多分辨率分析
小波变换的精髓是多分辨率分析:
- 大尺度(低频):好的频率分辨率,差的时间分辨率
- 小尺度(高频):差的频率分辨率,好的时间分辨率
这自动适应了不确定性原理的限制。
12.3.3 常用小波
| 小波 | 特点 | 应用 |
|---|---|---|
| Haar | 最简单,不连续 | 教学 |
| Daubechies | 紧支撑,正交 | 通用 |
| Morlet | 类似 Gabor,时频局部化好 | 频率分析 |
| Mexican Hat | 对称,二阶导数 | 边缘检测 |
12.4 离散小波变换(DWT)
12.4.1 Mallat 算法
DWT 通过滤波器组实现:
ylown=∑khkx2n−k(近似系数)y_{\text{low}}n = \sum_k hk x2n-k \quad \text{(近似系数)}ylown=k∑hkx2n−k(近似系数)
yhighn=∑kgkx2n−k(细节系数)y_{\text{high}}n = \sum_k gk x2n-k \quad \text{(细节系数)}yhighn=k∑gkx2n−k(细节系数)
其中 hhh 是低通滤波器,ggg 是高通滤波器,2:1 是下采样。
12.4.2 小波包
小波包扩展了标准小波变换,不仅分解低频部分,也分解高频部分,提供更灵活的时频分析。
第五部分:现代应用
第十三章:自适应滤波
13.1 自适应滤波器的基本结构
13.1.1 问题设置
当滤波器的参数需要根据信号的统计特性在线调整时,使用自适应滤波器:
yn=∑k=0M−1wknxn−k=wTnxnyn = \sum_{k=0}^{M-1} w_kn xn-k = \mathbf{w}^Tn \mathbf{x}nyn=k=0∑M−1wknxn−k=wTnxn
其中 wn\mathbf{w}nwn 是时变的滤波器系数。
13.1.2 自适应算法
自适应算法根据误差信号更新滤波器系数:
en=dn−ynen = dn - ynen=dn−yn
wn+1=wn+μ⋅f(en,xn)\mathbf{w}n+1 = \mathbf{w}n + \mu \cdot f(en, \mathbf{x}n)wn+1=wn+μ⋅f(en,xn)
其中 μ\muμ 是步长参数,f(⋅)f(\cdot)f(⋅) 是更新函数。
13.2 LMS 算法
13.2.1 最小均方(LMS)算法
LMS 算法是最简单的自适应算法:
wn+1=wn+μ⋅en⋅xn\mathbf{w}n+1 = \mathbf{w}n + \mu \cdot en \cdot \mathbf{x}nwn+1=wn+μ⋅en⋅xn
优点 :简单,计算量 O(M)O(M)O(M)
缺点:收敛慢,对步长敏感
13.2.2 收敛条件
LMS 算法收敛的充分条件:
0<μ<2λmax0 < \mu < \frac{2}{\lambda_{\max}}0<μ<λmax2
其中 λmax\lambda_{\max}λmax 是输入自相关矩阵的最大特征值。
实际中常用:0<μ<2M⋅Px0 < \mu < \frac{2}{M \cdot P_x}0<μ<M⋅Px2,其中 PxP_xPx 是输入功率。
13.3 RLS 算法
13.3.1 递推最小二乘(RLS)算法
RLS 算法最小化加权的最小二乘误差:
Jn=∑k=0nλn−k∣ek∣2Jn = \sum_{k=0}^{n} \lambda^{n-k} |ek|^2Jn=k=0∑nλn−k∣ek∣2
其中 λ\lambdaλ(0<λ≤10 < \lambda \leq 10<λ≤1)是遗忘因子。
13.3.2 RLS 的更新公式
kn=λ−1Pn−1xn1+λ−1xTnPn−1xn\mathbf{k}n = \frac{\lambda^{-1} \mathbf{P}n-1 \mathbf{x}n}{1 + \lambda^{-1} \mathbf{x}^Tn \mathbf{P}n-1 \mathbf{x}n}kn=1+λ−1xTnPn−1xnλ−1Pn−1xn
en=dn−wTn−1xnen = dn - \mathbf{w}^Tn-1 \mathbf{x}nen=dn−wTn−1xn
wn=wn−1+knen\mathbf{w}n = \mathbf{w}n-1 + \mathbf{k}n enwn=wn−1+knen
Pn=λ−1Pn−1−λ−1knxTnPn−1\mathbf{P}n = \lambda^{-1} \mathbf{P}n-1 - \lambda^{-1} \mathbf{k}n \mathbf{x}^Tn \mathbf{P}n-1Pn=λ−1Pn−1−λ−1knxTnPn−1
优点:收敛快
缺点 :计算量 O(M2)O(M^2)O(M2)
13.4 自适应滤波的应用
13.4.1 自适应噪声消除
噪声源 ──→ [自适应滤波器] ──→ 估计噪声 ──(−)──→ 干净信号
↑
含噪信号 ──────────────────────────────────┘
13.4.2 回声消除
电话会议中,用自适应滤波器估计并消除回声路径。
13.4.3 系统辨识
用自适应滤波器估计未知系统的脉冲响应。
13.4.4 预测
用自适应滤波器预测信号的未来值。
第十四章:压缩感知与稀疏信号处理
14.1 稀疏信号
14.1.1 稀疏性定义
信号 x∈RNx \in \mathbb{R}^Nx∈RN 是 KKK-稀疏 的,如果它在某个变换域中只有 KKK 个非零系数(K≪NK \ll NK≪N)。
例子:
- 语音信号在频域是近似稀疏的
- 图像信号在小波域是近似稀疏的
- 通信信号在某个字典下是稀疏的
14.1.2 可压缩信号
实际信号通常不是严格稀疏的,但系数按幅度排序后快速衰减------这种信号称为可压缩的。
14.2 压缩感知理论
14.2.1 问题设置
传统采样:以 Nyquist 速率采样 → 存储所有样本 → 压缩(丢弃小系数)
压缩感知:以远低于 Nyquist 的速率采样 → 直接得到压缩的测量 → 通过优化重建
14.2.2 测量矩阵
压缩感知通过线性测量获取信号:
y=Φxy = \Phi xy=Φx
其中 Φ∈RM×N\Phi \in \mathbb{R}^{M \times N}Φ∈RM×N(M≪NM \ll NM≪N)是测量矩阵。
关键问题 :M≪NM \ll NM≪N 意味着欠定方程组,如何从 yyy 恢复 xxx?
14.2.3 RIP 条件
定理 14.1(受限等距性质, RIP) :如果测量矩阵 Φ\PhiΦ 满足 KKK-RIP 条件:
(1−δK)∥x∥22≤∥Φx∥22≤(1+δK)∥x∥22(1-\delta_K) \|x\|_2^2 \leq \|\Phi x\|_2^2 \leq (1+\delta_K) \|x\|_2^2(1−δK)∥x∥22≤∥Φx∥22≤(1+δK)∥x∥22
对所有 KKK-稀疏信号 xxx 成立(δK<1\delta_K < 1δK<1),则可以从 M=O(Klog(N/K))M = O(K \log(N/K))M=O(Klog(N/K)) 个测量中精确恢复 KKK-稀疏信号。
14.2.4 恢复算法
ℓ1\ell_1ℓ1 最小化:
min∥z∥1s.t.Φz=y\min \|z\|_1 \quad \text{s.t.} \quad \Phi z = ymin∥z∥1s.t.Φz=y
这个凸优化问题可以在多项式时间内求解,且在 RIP 条件下精确恢复稀疏信号。
贪婪算法:OMP(正交匹配追踪)、CoSaMP 等。
14.3 稀疏表示
14.3.1 过完备字典
用过完备字典 D∈RN×KD \in \mathbb{R}^{N \times K}D∈RN×K(K>NK > NK>N)表示信号:
x=Dαx = D\alphax=Dα
其中 α\alphaα 是稀疏系数。
14.3.2 字典学习
从数据中学习最优字典:
minD,α∥X−Dα∥F2+λ∥α∥1\min_{D, \alpha} \|X - D\alpha\|_F^2 + \lambda \|\alpha\|_1D,αmin∥X−Dα∥F2+λ∥α∥1
K-SVD 算法是常用的字典学习方法。
第十五章:信号处理与机器学习的联系
15.1 卷积与卷积神经网络
15.1.1 信号处理中的卷积
信号处理中的卷积:
yn=(x∗h)n=∑kxkhn−kyn = (x * h)n = \sum_{k} xk hn-kyn=(x∗h)n=k∑xkhn−k
15.1.2 CNN 中的卷积
CNN 中的卷积操作与信号处理中的卷积完全相同:
yi,j=∑m,nxi+m,j+n⋅wm,nyi,j = \sum_{m,n} xi+m, j+n \cdot wm,nyi,j=m,n∑xi+m,j+n⋅wm,n
CNN 的卷积核就是 FIR 滤波器!
15.1.3 频域视角
CNN 的卷积层可以用 FFT 加速:
Y=IFFT(FFT(X)⊙FFT(W))Y = \text{IFFT}(\text{FFT}(X) \odot \text{FFT}(W))Y=IFFT(FFT(X)⊙FFT(W))
15.2 滤波器组与多分辨率分析
15.2.1 滤波器组
信号处理中的滤波器组(filter bank)将信号分解为多个子带:
x[n] ──→ [H₀(z)] ──→ ↓2 ──→ y₀[n] (低频)
──→ [H₁(z)] ──→ ↓2 ──→ y₁[n] (高频)
15.2.2 与小波变换的联系
离散小波变换就是一种特殊的滤波器组------这连接了信号处理和小波分析。
15.2.3 与 SSM 的联系
SSM 的卷积模式:
y=K∗xy = K * xy=K∗x
其中卷积核 Kn=CAˉnBˉK_n = C\bar{A}^n\bar{B}Kn=CAˉnBˉ 是指数衰减的。这可以看作一种特殊的 FIR 滤波器。
15.3 谱分析与注意力机制
15.3.1 注意力的频域解释
Transformer 的注意力机制:
Attention(Q,K,V)=softmax(QKTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)VAttention(Q,K,V)=softmax(d QKT)V
注意力权重 αij\alpha_{ij}αij 可以看作一个动态滤波器------根据输入内容决定"看哪里"。
15.3.2 与谱估计的联系
线性注意力(去掉 softmax)的计算:
yi=∑jϕ(qi)Tϕ(kj)vjy_i = \sum_j \phi(q_i)^T \phi(k_j) v_jyi=j∑ϕ(qi)Tϕ(kj)vj
这与信号处理中的互相关运算形式相同。
15.4 自适应滤波与在线学习
15.4.1 LMS 与随机梯度下降
LMS 算法:
wn+1=wn+μ⋅en⋅xn\mathbf{w}n+1 = \mathbf{w}n + \mu \cdot en \cdot \mathbf{x}nwn+1=wn+μ⋅en⋅xn
这与随机梯度下降(SGD)完全相同!
15.4.2 RLS 与自然梯度
RLS 算法使用二阶信息(自相关矩阵的逆),类似于自然梯度下降。
15.5 状态空间模型的信号处理视角
15.5.1 SSM 作为滤波器
SSM 的递推:
ht=Aˉht−1+Bˉxth_t = \bar{A}h_{t-1} + \bar{B}x_tht=Aˉht−1+Bˉxt
yt=Chty_t = Ch_tyt=Cht
可以看作一个自回归滤波器------输出是过去输入的加权和。
15.5.2 SSM 的频率响应
SSM 的频率响应:
H(ejω)=C(ejωI−Aˉ)−1BˉH(e^{j\omega}) = C(e^{j\omega}I - \bar{A})^{-1}\bar{B}H(ejω)=C(ejωI−Aˉ)−1Bˉ
HiPPO 矩阵的频率响应具有多尺度特性------不同频率的信号被不同衰减率的模态处理。
15.5.3 选择性机制的滤波器解释
Mamba 的选择性机制(输入依赖的 Δ\DeltaΔ, BBB, CCC)可以看作自适应滤波器:
- 滤波器系数根据输入内容动态调整
- 这使得模型能够根据信号特性自适应地选择"滤波策略"
第十六章:完整可运行代码实现
16.1 傅里叶变换与频谱分析
python
"""
傅里叶变换与频谱分析的完整实现。
包含: DFT, FFT, 频谱分析, 窗函数。
"""
import numpy as np
def dft(x):
"""直接计算 DFT (O(N^2))。
Args:
x: 输入信号 (N,)
Returns:
X: DFT 系数 (N,)
"""
N = len(x)
X = np.zeros(N, dtype=complex)
for k in range(N):
for n in range(N):
X[k] += x[n] * np.exp(-2j * np.pi * k * n / N)
return X
def fft_recursive(x):
"""递归 FFT (Cooley-Tukey, O(N log N))。
要求 N 是 2 的幂。
"""
N = len(x)
if N <= 1:
return x.copy()
if N % 2 != 0:
raise ValueError("N must be a power of 2")
# 分解为偶数项和奇数项
X_even = fft_recursive(x[0::2])
X_odd = fft_recursive(x[1::2])
# 蝶形运算
W = np.exp(-2j * np.pi * np.arange(N // 2) / N)
X = np.zeros(N, dtype=complex)
X[:N//2] = X_even + W * X_odd
X[N//2:] = X_even - W * X_odd
return X
def fft_radix2(x):
"""迭代 FFT (基-2, O(N log N))。"""
N = len(x)
# 位反转置换
j = 0
X = x.copy().astype(complex)
for i in range(1, N):
bit = N >> 1
while j & bit:
j ^= bit
bit >>= 1
j ^= bit
if i < j:
X[i], X[j] = X[j], X[i]
# 蝶形运算
length = 2
while length <= N:
half = length // 2
W = np.exp(-2j * np.pi * np.arange(half) / length)
for i in range(0, N, length):
for k in range(half):
u = X[i + k]
v = W[k] * X[i + k + half]
X[i + k] = u + v
X[i + k + half] = u - v
length *= 2
return X
def generate_test_signals(N=1024, fs=1000):
"""生成测试信号。"""
t = np.arange(N) / fs
# 多频率叠加信号
f1, f2, f3 = 50, 120, 300 # Hz
x_clean = (np.sin(2*np.pi*f1*t) +
0.5*np.sin(2*np.pi*f2*t) +
0.3*np.sin(2*np.pi*f3*t))
# 添加噪声
noise = np.random.randn(N) * 0.5
x_noisy = x_clean + noise
return t, x_clean, x_noisy, fs
def demonstrate_fft():
"""演示 FFT 算法。"""
print("=" * 60)
print("FFT 算法演示")
print("=" * 60)
np.random.seed(42)
N = 1024
# 生成测试信号
t, x_clean, x_noisy, fs = generate_test_signals(N)
# 比较不同 FFT 实现
X_numpy = np.fft.fft(x_noisy)
X_recursive = fft_recursive(x_noisy)
X_radix2 = fft_radix2(x_noisy)
# 验证正确性
diff_recursive = np.max(np.abs(X_numpy - X_recursive))
diff_radix2 = np.max(np.abs(X_numpy - X_radix2))
print(f"\nFFT 算法验证 (N={N}):")
print(f" NumPy FFT vs 递归 FFT 最大差异: {diff_recursive:.2e}")
print(f" NumPy FFT vs 迭代 FFT 最大差异: {diff_radix2:.2e}")
# 计算频率轴
freqs = np.fft.fftfreq(N, 1/fs)
# 计算功率谱
power = np.abs(X_numpy)**2 / N
# 找到峰值频率
positive_mask = freqs > 0
peak_indices = np.argsort(power[positive_mask])[-3:][::-1]
peak_freqs = freqs[positive_mask][peak_indices]
peak_powers = power[positive_mask][peak_indices]
print(f"\n频谱分析:")
print(f" 采样率: {fs} Hz")
print(f" 频率分辨率: {fs/N:.2f} Hz")
print(f" 检测到的峰值频率:")
for f, p in zip(peak_freqs, peak_powers):
print(f" {f:.1f} Hz (功率: {p:.1f})")
return X_numpy, freqs, power
def demonstrate_windowing():
"""演示窗函数的影响。"""
print("\n" + "=" * 60)
print("窗函数演示")
print("=" * 60)
N = 256
fs = 1000
t = np.arange(N) / fs
# 生成信号 (频率接近,测试分辨率)
f1, f2 = 100, 110 # Hz,频率差 10 Hz
x = np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t)
# 不同窗函数
windows = {
'矩形窗': np.ones(N),
'Hann 窗': 0.5 * (1 - np.cos(2*np.pi*np.arange(N)/(N-1))),
'Hamming 窗': 0.54 - 0.46 * np.cos(2*np.pi*np.arange(N)/(N-1)),
'Blackman 窗': (0.42 - 0.5*np.cos(2*np.pi*np.arange(N)/(N-1)) +
0.08*np.cos(4*np.pi*np.arange(N)/(N-1))),
}
freqs = np.fft.fftfreq(N, 1/fs)
positive_mask = (freqs > 0) & (freqs < 200)
print(f"\n两个正弦波: {f1} Hz 和 {f2} Hz")
print(f"频率差: {f2-f1} Hz, 频率分辨率: {fs/N:.1f} Hz")
results = {}
for name, w in windows.items():
X = np.fft.fft(x * w)
power = np.abs(X)**2 / N
# 检查是否能分辨两个峰
p = power[positive_mask]
f = freqs[positive_mask]
peaks = np.argsort(p)[-2:]
peak_freqs = np.sort(f[peaks])
# 计算旁瓣衰减
main_lobe_idx = np.argmax(p)
sidelobe_level = np.max(np.delete(p, range(max(0,main_lobe_idx-5),
min(len(p),main_lobe_idx+6))))
main_lobe_level = p[main_lobe_idx]
sidelobe_attenuation = 10 * np.log10(sidelobe_level / main_lobe_level) if main_lobe_level > 0 else -100
results[name] = {
'peak_freqs': peak_freqs,
'sidelobe_atten': sidelobe_attenuation,
}
print(f"\n {name}:")
print(f" 检测到的峰: {peak_freqs[0]:.1f} Hz, {peak_freqs[1]:.1f} Hz")
print(f" 旁瓣衰减: {sidelobe_attenuation:.1f} dB")
return results
if __name__ == "__main__":
demonstrate_fft()
demonstrate_windowing()
16.2 FIR 滤波器设计
python
"""
FIR 滤波器设计的完整实现。
包含: 窗函数法, 频率采样法, 滤波器应用。
"""
import numpy as np
def ideal_lowpass(cutoff, num_taps):
"""设计理想低通滤波器 (窗函数法)。
Args:
cutoff: 归一化截止频率 (0 到 1, 1 对应 π)
num_taps: 滤波器阶数 (应为奇数)
Returns:
h: 脉冲响应 (num_taps,)
"""
M = num_taps - 1
n = np.arange(num_taps)
wc = cutoff * np.pi
# 理想脉冲响应
h = np.where(
n == M/2,
wc / np.pi,
np.sin(wc * (n - M/2)) / (np.pi * (n - M/2))
)
return h
def ideal_highpass(cutoff, num_taps):
"""设计理想高通滤波器。"""
h_lp = ideal_lowpass(cutoff, num_taps)
M = num_taps - 1
delta = np.zeros(num_taps)
delta[M//2] = 1
return delta - h_lp
def ideal_bandpass(low, high, num_taps):
"""设计理想带通滤波器。"""
h_lp1 = ideal_lowpass(high, num_taps)
h_lp2 = ideal_lowpass(low, num_taps)
return h_lp1 - h_lp2
def apply_window(h, window_type='hann'):
"""应用窗函数。
Args:
h: 脉冲响应
window_type: 窗类型 ('rect', 'hann', 'hamming', 'blackman')
Returns:
h_windowed: 加窗后的脉冲响应
"""
N = len(h)
n = np.arange(N)
if window_type == 'rect':
w = np.ones(N)
elif window_type == 'hann':
w = 0.5 * (1 - np.cos(2*np.pi*n/(N-1)))
elif window_type == 'hamming':
w = 0.54 - 0.46 * np.cos(2*np.pi*n/(N-1))
elif window_type == 'blackman':
w = 0.42 - 0.5*np.cos(2*np.pi*n/(N-1)) + 0.08*np.cos(4*np.pi*n/(N-1))
else:
raise ValueError(f"Unknown window type: {window_type}")
return h * w
def fir_filter(x, h):
"""应用 FIR 滤波器 (直接卷积)。
Args:
x: 输入信号
h: 滤波器脉冲响应
Returns:
y: 滤波后的信号
"""
return np.convolve(x, h, mode='same')
def fir_filter_fft(x, h, N_fft=None):
"""应用 FIR 滤波器 (FFT 卷积)。
Args:
x: 输入信号
h: 滤波器脉冲响应
N_fft: FFT 长度
Returns:
y: 滤波后的信号
"""
N_x = len(x)
N_h = len(h)
if N_fft is None:
N_fft = N_x + N_h - 1
X = np.fft.fft(x, N_fft)
H = np.fft.fft(h, N_fft)
Y = X * H
y = np.fft.ifft(Y).real
# 截断到原始长度
start = (N_h - 1) // 2
return y[start:start + N_x]
def frequency_response(h, N=1024):
"""计算滤波器的频率响应。
Args:
h: 脉冲响应
N: 频率点数
Returns:
w: 频率轴 (0 到 π)
H: 复频率响应
"""
H = np.fft.fft(h, 2*N)
w = np.linspace(0, np.pi, N)
return w, H[:N]
def demonstrate_fir_design():
"""演示 FIR 滤波器设计。"""
print("=" * 60)
print("FIR 滤波器设计演示")
print("=" * 60)
# 生成测试信号
fs = 1000 # 采样率
t = np.arange(0, 1, 1/fs)
N = len(t)
# 信号: 50 Hz + 200 Hz + 噪声
x_clean = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*200*t)
x_noisy = x_clean + np.random.randn(N) * 0.3
# 设计低通滤波器
cutoff = 0.2 # 归一化截止频率 (对应 100 Hz)
num_taps = 51
print(f"\n滤波器参数:")
print(f" 采样率: {fs} Hz")
print(f" 截止频率: {cutoff * fs/2:.0f} Hz")
print(f" 滤波器阶数: {num_taps}")
# 不同窗函数
windows = ['rect', 'hann', 'hamming', 'blackman']
results = {}
for window in windows:
h = ideal_lowpass(cutoff, num_taps)
h = apply_window(h, window)
# 频率响应
w, H = frequency_response(h)
# 应用滤波器
y = fir_filter_fft(x_noisy, h)
# 计算误差
error = np.sqrt(np.mean((y - x_clean)**2))
# 计算旁瓣衰减
H_mag = np.abs(H)
main_lobe_idx = np.argmax(H_mag[:len(H_mag)//2])
sidelobe_start = min(main_lobe_idx + 10, len(H_mag) - 1)
if sidelobe_start < len(H_mag):
sidelobe_level = np.max(H_mag[sidelobe_start:])
main_lobe_level = H_mag[main_lobe_idx]
sidelobe_atten = 20 * np.log10(sidelobe_level / main_lobe_level) if main_lobe_level > 0 else -100
else:
sidelobe_atten = -100
results[window] = {
'error': error,
'sidelobe_atten': sidelobe_atten,
}
print(f"\n {window}:")
print(f" 重建误差 (RMSE): {error:.4f}")
print(f" 旁瓣衰减: {sidelobe_atten:.1f} dB")
return results
if __name__ == "__main__":
demonstrate_fir_design()
16.3 自适应滤波
python
"""
自适应滤波器的完整实现。
包含: LMS, NLMS, RLS 算法。
"""
import numpy as np
class LMSFilter:
"""LMS 自适应滤波器。"""
def __init__(self, num_taps, mu=0.01):
"""
Args:
num_taps: 滤波器阶数
mu: 步长参数
"""
self.num_taps = num_taps
self.mu = mu
self.w = np.zeros(num_taps)
self.x_buffer = np.zeros(num_taps)
def update(self, x, d):
"""一步更新。
Args:
x: 当前输入样本
d: 期望信号
Returns:
y: 滤波器输出
e: 误差信号
"""
# 更新缓冲区
self.x_buffer = np.roll(self.x_buffer, 1)
self.x_buffer[0] = x
# 计算输出
y = np.dot(self.w, self.x_buffer)
# 计算误差
e = d - y
# 更新权重
self.w += 2 * self.mu * e * self.x_buffer
return y, e
class NLMSFilter:
"""归一化 LMS (NLMS) 自适应滤波器。"""
def __init__(self, num_taps, mu=0.5, epsilon=1e-10):
self.num_taps = num_taps
self.mu = mu
self.epsilon = epsilon
self.w = np.zeros(num_taps)
self.x_buffer = np.zeros(num_taps)
def update(self, x, d):
self.x_buffer = np.roll(self.x_buffer, 1)
self.x_buffer[0] = x
y = np.dot(self.w, self.x_buffer)
e = d - y
# 归一化步长
norm = np.dot(self.x_buffer, self.x_buffer) + self.epsilon
self.w += 2 * self.mu * e * self.x_buffer / norm
return y, e
class RLSFilter:
"""RLS 自适应滤波器。"""
def __init__(self, num_taps, lam=0.99, delta=0.01):
self.num_taps = num_taps
self.lam = lam
self.w = np.zeros(num_taps)
self.x_buffer = np.zeros(num_taps)
self.P = np.eye(num_taps) / delta
def update(self, x, d):
self.x_buffer = np.roll(self.x_buffer, 1)
self.x_buffer[0] = x
# 计算增益向量
Px = self.P @ self.x_buffer
denom = self.lam + self.x_buffer @ Px
k = Px / denom
# 计算输出和误差
y = np.dot(self.w, self.x_buffer)
e = d - y
# 更新权重
self.w += k * e
# 更新协方差矩阵
self.P = (self.P - np.outer(k, self.x_buffer @ self.P)) / self.lam
return y, e
def demonstrate_adaptive_filtering():
"""演示自适应滤波。"""
print("=" * 60)
print("自适应滤波演示")
print("=" * 60)
np.random.seed(42)
# 生成信号
N = 2000
t = np.arange(N)
# 未知系统 (FIR 滤波器)
num_taps_true = 16
w_true = np.random.randn(num_taps_true) * 0.5
# 输入信号
x = np.random.randn(N) * 0.5
# 期望信号 (通过未知系统)
d = np.convolve(x, w_true, mode='same') + np.random.randn(N) * 0.1
# 自适应滤波器参数
num_taps = 16
print(f"\n系统辨识实验:")
print(f" 未知系统阶数: {num_taps_true}")
print(f" 自适应滤波器阶数: {num_taps}")
print(f" 信号长度: {N}")
# 测试不同算法
algorithms = {
'LMS (μ=0.01)': LMSFilter(num_taps, mu=0.01),
'LMS (μ=0.05)': LMSFilter(num_taps, mu=0.05),
'NLMS (μ=0.5)': NLMSFilter(num_taps, mu=0.5),
'RLS (λ=0.99)': RLSFilter(num_taps, lam=0.99),
}
results = {}
for name, filt in algorithms.items():
# 运行自适应滤波
y = np.zeros(N)
e = np.zeros(N)
for i in range(N):
y[i], e[i] = filt.update(x[i], d[i])
# 计算最终误差
mse_final = np.mean(e[-200:]**2)
# 计算权重误差
w_error = np.sqrt(np.sum((filt.w - w_true)**2))
results[name] = {
'mse_final': mse_final,
'w_error': w_error,
'w_estimated': filt.w.copy(),
}
print(f"\n {name}:")
print(f" 最终 MSE: {mse_final:.6f}")
print(f" 权重误差: {w_error:.4f}")
return results
if __name__ == "__main__":
demonstrate_adaptive_filtering()
16.4 谱估计
python
"""
谱估计方法的完整实现。
包含: 周期图, Welch 方法, AR 模型。
"""
import numpy as np
def periodogram(x, fs=1.0, N_fft=None):
"""计算周期图。
Args:
x: 输入信号
fs: 采样率
N_fft: FFT 长度
Returns:
f: 频率轴
S: 功率谱密度
"""
N = len(x)
if N_fft is None:
N_fft = N
X = np.fft.fft(x, N_fft)
S = np.abs(X)**2 / (N * fs)
f = np.fft.fftfreq(N_fft, 1/fs)
# 只返回正频率
positive = f > 0
return f[positive], S[positive]
def welch_psd(x, fs=1.0, segment_len=None, overlap=None, window='hann'):
"""Welch 方法估计功率谱密度。
Args:
x: 输入信号
fs: 采样率
segment_len: 段长
overlap: 重叠样本数
window: 窗函数
Returns:
f: 频率轴
S: 功率谱密度估计
"""
N = len(x)
if segment_len is None:
segment_len = N // 4
if overlap is None:
overlap = segment_len // 2
# 生成窗函数
if window == 'hann':
w = 0.5 * (1 - np.cos(2*np.pi*np.arange(segment_len)/(segment_len-1)))
elif window == 'hamming':
w = 0.54 - 0.46 * np.cos(2*np.pi*np.arange(segment_len)/(segment_len-1))
else:
w = np.ones(segment_len)
# 计算窗的功率
win_power = np.sum(w**2)
# 分段
step = segment_len - overlap
num_segments = (N - segment_len) // step + 1
# 计算每段的周期图并平均
N_fft = segment_len
S_avg = np.zeros(N_fft // 2)
for i in range(num_segments):
start = i * step
segment = x[start:start + segment_len] * w
X = np.fft.fft(segment, N_fft)
S_avg += np.abs(X[:N_fft//2])**2
S_avg /= (num_segments * fs * win_power)
f = np.fft.fftfreq(N_fft, 1/fs)[:N_fft//2]
return f, S_avg
def ar_psd(x, order, fs=1.0):
"""AR 模型谱估计 (Yule-Walker 方法)。
Args:
x: 输入信号
order: AR 模型阶数
fs: 采样率
Returns:
f: 频率轴
S: 功率谱密度估计
"""
N = len(x)
# 计算自相关
r = np.correlate(x, x, mode='full') / N
r = r[N-1:] # 只取非负延迟
# Levinson-Durbin 算法
a = np.zeros(order + 1)
a[0] = 1.0
e = r[0]
for k in range(1, order + 1):
# 计算反射系数
lambda_k = r[k]
for j in range(1, k):
lambda_k += a[j] * r[k-j]
lambda_k /= -e
# 更新系数
a_new = a.copy()
for j in range(1, k):
a_new[j] = a[j] + lambda_k * a[k-j]
a_new[k] = lambda_k
a = a_new
# 更新误差
e *= (1 - lambda_k**2)
# 计算功率谱密度
N_fft = 1024
A = np.fft.fft(a, N_fft)
S = e / (np.abs(A)**2 + 1e-10)
f = np.fft.fftfreq(N_fft, 1/fs)
positive = f > 0
return f[positive], S[positive]
def demonstrate_spectral_estimation():
"""演示谱估计方法。"""
print("=" * 60)
print("谱估计演示")
print("=" * 60)
np.random.seed(42)
# 生成 AR(4) 过程
N = 1000
fs = 1000
# AR 系数 (产生 100 Hz 和 200 Hz 的共振峰)
a_true = np.array([1, -1.5, 1.18, -0.45, 0.18])
sigma_e = 0.5
# 生成信号
e = np.random.randn(N) * sigma_e
x = np.zeros(N)
for n in range(4, N):
x[n] = -sum(a_true[k] * x[n-k] for k in range(1, 5)) + e[n]
print(f"\nAR(4) 过程:")
print(f" 信号长度: {N}")
print(f" 采样率: {fs} Hz")
# 不同谱估计方法
methods = {
'周期图': lambda: periodogram(x, fs),
'Welch (段长=256)': lambda: welch_psd(x, fs, segment_len=256),
'Welch (段长=128)': lambda: welch_psd(x, fs, segment_len=128),
'AR (阶数=4)': lambda: ar_psd(x, 4, fs),
'AR (阶数=8)': lambda: ar_psd(x, 8, fs),
}
results = {}
for name, method in methods.items():
f, S = method()
results[name] = (f, S)
# 找到峰值频率
peak_idx = np.argsort(S)[-2:]
peak_freqs = np.sort(f[peak_idx])
print(f"\n {name}:")
print(f" 检测到的峰值: {peak_freqs[0]:.1f} Hz, {peak_freqs[1]:.1f} Hz")
return results
if __name__ == "__main__":
demonstrate_spectral_estimation()
附录
A. 数学符号表
| 符号 | 含义 | 维度/单位 |
|---|---|---|
| x(t)x(t)x(t) | 连续时间信号 | 时间的函数 |
| xnxnxn | 离散时间信号 | 整数的函数 |
| X(jω)X(j\omega)X(jω) | 傅里叶变换 | 频率的函数 |
| XkXkXk | DFT | 长度 NNN 的序列 |
| X(z)X(z)X(z) | Z 变换 | 复变量的函数 |
| hnhnhn | 脉冲响应 | 长度 MMM 的序列 |
| H(ejω)H(e^{j\omega})H(ejω) | 频率响应 | 频率的复函数 |
| fff | 频率 | Hz |
| ω\omegaω | 角频率 | rad/s |
| TsT_sTs | 采样间隔 | 秒 |
| fsf_sfs | 采样频率 | Hz |
| NNN | 信号长度 | 样本数 |
| MMM | 滤波器阶数 | 样本数 |
B. 关键公式速查
傅里叶变换 :
X(jω)=∫−∞∞x(t)e−jωtdtX(j\omega) = \int_{-\infty}^{\infty} x(t) e^{-j\omega t} dtX(jω)=∫−∞∞x(t)e−jωtdt
逆傅里叶变换 :
x(t)=12π∫−∞∞X(jω)ejωtdωx(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} X(j\omega) e^{j\omega t} d\omegax(t)=2π1∫−∞∞X(jω)ejωtdω
DFT :
Xk=∑n=0N−1xne−j2πkn/NXk = \sum_{n=0}^{N-1} xn e^{-j2\pi kn/N}Xk=n=0∑N−1xne−j2πkn/N
卷积定理 :
F{x∗h}=X(jω)⋅H(jω)\mathcal{F}\{x * h\} = X(j\omega) \cdot H(j\omega)F{x∗h}=X(jω)⋅H(jω)
Parseval 定理 :
∫∣x(t)∣2dt=12π∫∣X(jω)∣2dω\int |x(t)|^2 dt = \frac{1}{2\pi} \int |X(j\omega)|^2 d\omega∫∣x(t)∣2dt=2π1∫∣X(jω)∣2dω
采样定理 :
fs>2fmaxf_s > 2f_{\max}fs>2fmax
LMS 更新 :
wn+1=wn+μ⋅en⋅xn\mathbf{w}n+1 = \mathbf{w}n + \mu \cdot en \cdot \mathbf{x}nwn+1=wn+μ⋅en⋅xn
Wiener-Khinchin :
Sxx(ω)=∫−∞∞Rxx(τ)e−jωτdτS_{xx}(\omega) = \int_{-\infty}^{\infty} R_{xx}(\tau) e^{-j\omega\tau} d\tauSxx(ω)=∫−∞∞Rxx(τ)e−jωτdτ
C. 参考文献
-
Oppenheim, A. V., & Schafer, R. W. (2010). Discrete-Time Signal Processing (3rd ed.). Pearson.
-
Proakis, J. G., & Manolakis, D. G. (2012). Digital Signal Processing (4th ed.). Pearson.
-
Haykin, S. (2014). Adaptive Filter Theory (5th ed.). Pearson.
-
Mitra, S. K. (2011). Digital Signal Processing (4th ed.). McGraw-Hill.
-
Mallat, S. (2009). A Wavelet Tour of Signal Processing (3rd ed.). Academic Press.
-
Candès, E. J., & Wakin, M. B. (2008). An Introduction To Compressive Sampling. IEEE Signal Processing Magazine, 25(2), 21-30.
-
Stoica, P., & Moses, R. L. (2005). Spectral Analysis of Signals. Pearson.
-
Vetterli, M., Kovačević, J., & Goyal, V. K. (2014). Foundations of Signal Processing. Cambridge University Press.
-
Gu, A., & Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces. arXiv:2312.00752.
-
Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
本文涵盖了信号处理从傅里叶分析到现代滤波器设计的完整理论体系,并探讨了信号处理与机器学习(特别是状态空间模型和深度学习)的深刻联系。代码均使用 NumPy 实现,可直接运行。