- 1. 信号与系统基础
- 2. 傅里叶级数 (Fourier Series)
- 3. 傅里叶变换 (Fourier Transform)
- 4. 离散傅里叶变换 (DFT) & FFT
- 5. 拉普拉斯变换 (Laplace Transform)
- 6. Z 变换
- 7. 数字滤波器设计
- 8. 控制系统基础
- 9. PID 控制器
- 10. 状态空间表示 (State Space)
- 11. AI/ML 与信号处理
- 12. 小测验
- 参考文献
1. 信号与系统基础
1.1 信号的分类
信号(Signal)是传递信息的物理量的变化。基本分类如下。
连续时间信号 vs 离散时间信号
连续时间信号(CT Signal)在所有时间 上都有定义。例:模拟语音信号
离散时间信号(DT Signal)仅在整数索引 上有定义。例:数字音频采样
能量信号与功率信号
信号的能量 与平均功率 :
若 则为能量信号,若 则为功率信号。
1.2 基本信号
单位冲激(Unit Impulse)
筛选(Sifting)性质:
单位阶跃(Unit Step)
成立关系式 。
1.3 线性时不变(LTI)系统
LTI 系统满足以下两条核心性质。
- 线性(Linearity):
- 时不变性(Time Invariance):
1.4 卷积
LTI 系统的输出可以表示为输入与冲激响应的卷积。
离散时间情形:
卷积满足交换律、结合律与分配律。
2. 傅里叶级数 (Fourier Series)
2.1 周期信号的傅里叶级数
周期为 的信号 可以表示为复指数函数之和。基频为 。
傅里叶系数:
2.2 方波(Square Wave)示例
振幅为 A、周期为 T、占空比 50% 的方波的傅里叶系数:
只存在奇次谐波,且谐波次数越高振幅越小。吉布斯现象(Gibbs Phenomenon)会出现在不连续点附近。
2.3 帕塞瓦尔定理
时域的平均功率与频域系数的平方和相等。
3. 傅里叶变换 (Fourier Transform)
3.1 连续傅里叶变换 (CTFT)
非周期信号的傅里叶变换对:
3.2 重要变换对
| 信号 | 傅里叶变换 |
|---|---|
| 方波 |
3.3 傅里叶变换的性质
- 线性:
- 时移:
- 频移(调制):
- 卷积定理:
- 乘法定理:
- 微分:
- 帕塞瓦尔:
3.4 用 Python 计算傅里叶变换
import numpy as np
from scipy.fft import fft, ifft, fftfreq, fftshift
import matplotlib.pyplot as plt
# 生成方波信号
fs = 1000 # 采样频率 (Hz)
T = 1.0 # 信号时长 (秒)
t = np.linspace(0, T, int(fs * T), endpoint=False)
# 方波: 周期 0.1 秒 (10Hz)
from scipy.signal import square
x = square(2 * np.pi * 10 * t)
# 计算 FFT
N = len(x)
X = fft(x)
freqs = fftfreq(N, 1/fs)
# 双边频谱 (归一化)
magnitude = np.abs(fftshift(X)) / N
freq_shifted = fftshift(freqs)
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(t[:100], x[:100])
plt.title('Square Wave (time domain)')
plt.xlabel('Time (s)')
plt.subplot(1, 2, 2)
plt.plot(freq_shifted, magnitude)
plt.xlim(-100, 100)
plt.title('Fourier Transform (frequency domain)')
plt.xlabel('Frequency (Hz)')
plt.tight_layout()
plt.show()
4. 离散傅里叶变换 (DFT) & FFT
4.1 离散时间傅里叶变换 (DTFT)
离散时间信号 的 DTFT:
逆变换:
DTFT 的频率 是连续的,且以 为周期。
4.2 DFT 的定义
点 DFT 是把 DTFT 在 个频率上做均匀采样得到的结果。
逆 DFT:
4.3 FFT 算法
直接计算 DFT 的复杂度是 ,而 FFT(Cooley-Tukey 算法)是 。当 时用分治法(Divide and Conquer)实现。
旋转因子(Twiddle Factor):
4.4 频谱分析示例
import numpy as np
from scipy.fft import fft, fftfreq
import matplotlib.pyplot as plt
# 生成信号: 50Hz + 120Hz 复合信号
fs = 1000 # 采样频率 (Hz)
N = fs # 采样点数 (1秒)
t = np.linspace(0, 1, N, endpoint=False)
# 复合信号 (含噪声)
signal = (np.sin(2 * np.pi * 50 * t)
+ 0.5 * np.sin(2 * np.pi * 120 * t)
+ 0.2 * np.random.randn(N))
# 计算 FFT
yf = fft(signal)
xf = fftfreq(N, 1/fs)
# 单边频谱 (仅正频率)
half = N // 2
amplitude = 2.0 / N * np.abs(yf[:half])
freq_pos = xf[:half]
plt.figure(figsize=(10, 4))
plt.plot(freq_pos, amplitude)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.title('Single-Sided Amplitude Spectrum')
plt.axvline(x=50, color='r', linestyle='--', label='50 Hz')
plt.axvline(x=120, color='g', linestyle='--', label='120 Hz')
plt.legend()
plt.grid(True)
plt.show()
# 频率分辨率: delta_f = fs / N = 1 Hz
print(f"Frequency resolution: {fs/N} Hz")
print(f"Nyquist frequency: {fs/2} Hz")
4.5 采样定理 (Nyquist-Shannon)
采样频率 必须至少是信号最大频率 的两倍,才能在没有混叠(Aliasing)的情况下复原信号。
5. 拉普拉斯变换 (Laplace Transform)
5.1 定义
双边(Bilateral)拉普拉斯变换:
单边(Unilateral)拉普拉斯变换:
5.2 重要变换对
| 信号 | 变换 | 收敛域 |
|---|---|---|
| 整个 s-平面 | ||
5.3 传递函数 (Transfer Function)
LTI 系统在 s-域中的输入输出关系:
极点(Poles): 使 的 值(分母 = 0)
零点(Zeros): 使 的 值(分子 = 0)
极点的位置决定系统的稳定性。若所有极点都位于 s-平面左半平面(LHP),则系统 BIBO 稳定。
5.4 二阶系统标准型
- : 自然频率(Natural Frequency)
- : 阻尼比(Damping Ratio)
- : 欠阻尼(Underdamped) — 振荡响应
- : 临界阻尼(Critically Damped) — 最快的无振荡响应
- : 过阻尼(Overdamped) — 缓慢的无振荡响应
6. Z 变换
6.1 定义
离散时间信号 的 Z 变换:
将 代入(单位圆上)时,与 DTFT 相同。
6.2 Z 变换与拉普拉斯变换的关系
以采样周期 对连续时间系统做离散化时:
由这一关系,s-平面与 z-平面相互对应。
- s-平面的虚轴 z-平面的单位圆
- s-平面的左半平面 z-平面的单位圆内部
6.3 稳定性分析
离散时间系统要稳定,所有极点都必须位于单位圆内部。
6.4 重要 Z 变换对
| 信号 | Z 变换 |
|---|---|
7. 数字滤波器设计
7.1 FIR vs IIR 滤波器
FIR (Finite Impulse Response) 滤波器
- 冲激响应长度有限
- 始终稳定(无反馈)
- 可实现线性相位
- 要获得陡峭的截止特性,需要较高的阶数
IIR (Infinite Impulse Response) 滤波器
- 含反馈,冲激响应无限长
- 用较低阶数即可获得陡峭的截止特性
- 相位非线性(可能产生相位失真)
- 设计不当时可能不稳定
7.2 滤波器类型
- 低通 (LPF): 通过低频,阻断高频
- 高通 (HPF): 通过高频,阻断低频
- 带通 (BPF): 仅通过特定频段
- 带阻 (BEF/Notch): 阻断特定频段
7.3 滤波器设计函数
巴特沃斯(Butterworth): 通带内响应尽可能平坦
切比雪夫(Chebyshev) I 型: 通带内允许波纹,截止更陡峭
椭圆(Elliptic): 通带与阻带都存在波纹,以最低阶数获得最大衰减
7.4 用 scipy.signal 设计滤波器
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 采样频率
fs = 1000 # Hz
# 巴特沃斯低通滤波器 (4阶,截止频率 100Hz)
nyq = fs / 2
cutoff = 100 / nyq # 归一化频率 (0~1)
b_butter, a_butter = signal.butter(N=4, Wn=cutoff, btype='low')
# 切比雪夫 I 型 (4阶,1dB 波纹,截止频率 100Hz)
b_cheby, a_cheby = signal.cheby1(N=4, rp=1, Wn=cutoff, btype='low')
# 计算频率响应
w, h_butter = signal.freqz(b_butter, a_butter, fs=fs)
w, h_cheby = signal.freqz(b_cheby, a_cheby, fs=fs)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(w, 20 * np.log10(np.abs(h_butter)), label='Butterworth')
plt.plot(w, 20 * np.log10(np.abs(h_cheby)), label='Chebyshev I')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude (dB)')
plt.title('Filter Frequency Response')
plt.legend()
plt.grid(True)
plt.ylim(-80, 5)
# 对含噪信号进行滤波
t = np.linspace(0, 1, fs, endpoint=False)
clean = np.sin(2 * np.pi * 50 * t)
noisy = clean + 0.5 * np.sin(2 * np.pi * 300 * t)
filtered = signal.filtfilt(b_butter, a_butter, noisy)
plt.subplot(1, 2, 2)
plt.plot(t[:200], noisy[:200], alpha=0.5, label='Noisy')
plt.plot(t[:200], filtered[:200], label='Filtered')
plt.xlabel('Time (s)')
plt.legend()
plt.title('Filtering Result')
plt.tight_layout()
plt.show()
7.5 FIR 滤波器设计 (窗函数法)
from scipy.signal import firwin, freqz
# 使用 Hamming 窗设计的 FIR 低通滤波器
# 抽头数 = 51, 截止频率 = 100Hz
numtaps = 51
cutoff_hz = 100
b_fir = firwin(numtaps, cutoff_hz / (fs/2), window='hamming')
# 频率响应
w_fir, h_fir = freqz(b_fir, [1.0], fs=fs)
print(f"FIR filter order: {numtaps - 1}")
print(f"Linear phase: True (symmetric coefficients)")
8. 控制系统基础
8.1 开环 vs 闭环控制
开环(Open-Loop)控制: 输出不会影响控制动作。结构简单,但对扰动或建模误差较为脆弱。
闭环(Closed-Loop)控制: 测量输出并与参考输入比较,从而使误差最小化。借助反馈(Feedback)获得更高的鲁棒性。
基本反馈回路:
其中 是被控对象(Plant), 是传感器传递函数。
8.2 稳定性: 劳斯-赫尔维茨判据
若特征方程 的所有根都位于 s-平面左半平面,则系统稳定。
利用劳斯阵列(Routh Array)可仅凭系数判断极点位置。第一列符号变化的次数等于位于右半平面的极点个数。
8.3 波特图 (Bode Plot)
以对数刻度表示频率响应 。
- 增益图: [dB] vs
- 相位图: [度] vs
稳定裕度:
- 相位裕度(Phase Margin, PM): 增益为 0 dB 时,相位距离 -180 度还有多少余量
- 增益裕度(Gain Margin, GM): 相位为 -180 度时,增益距离 0 dB 还有多少余量
通常认为 PM > 45 度、GM > 6 dB 的系统是稳定的。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
# 二阶系统传递函数: H(s) = 10 / (s^2 + 2s + 10)
num = [10]
den = [1, 2, 10]
sys = signal.TransferFunction(num, den)
# 波特图
w, mag, phase = signal.bode(sys)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
ax1.semilogx(w, mag)
ax1.set_ylabel('Magnitude (dB)')
ax1.set_title('Bode Plot')
ax1.grid(True, which='both')
ax2.semilogx(w, phase)
ax2.set_ylabel('Phase (degrees)')
ax2.set_xlabel('Frequency (rad/s)')
ax2.grid(True, which='both')
plt.tight_layout()
plt.show()
9. PID 控制器
9.1 PID 控制动作
PID 控制器是三种动作之和。
其中 是误差信号。
- 比例(P) 控制: 与当前误差成比例的控制输出。响应快,但会残留稳态误差。
- 积分(I) 控制: 消除累积误差,使稳态误差趋于零。响应会变慢。
- 微分(D) 控制: 对误差变化率作出反应以抑制超调。对噪声敏感。
传递函数:
9.2 齐格勒-尼科尔斯调参法
方法 1 (开环阶跃响应):
从过程响应曲线求出延迟时间 与时间常数 后:
| 控制器 | |||
|---|---|---|---|
| P | - | - | |
| PI | - | ||
| PID |
方法 2 (闭环极限灵敏度):
令 ,逐步增大 ,求出出现持续振荡的临界增益 与振荡周期 。
| 控制器 | |||
|---|---|---|---|
| PID |
9.3 用 Python 模拟 PID
import numpy as np
import matplotlib.pyplot as plt
class PIDController:
def __init__(self, kp, ki, kd, dt):
self.kp = kp
self.ki = ki
self.kd = kd
self.dt = dt
self.integral = 0.0
self.prev_error = 0.0
def update(self, setpoint, measured):
error = setpoint - measured
self.integral += error * self.dt
derivative = (error - self.prev_error) / self.dt
output = self.kp * error + self.ki * self.integral + self.kd * derivative
self.prev_error = error
return output
# 一阶被控对象: dy/dt = -y + u (时间常数 1秒)
def plant_step(y, u, dt):
return y + dt * (-y + u)
# 仿真参数
dt = 0.01
t = np.arange(0, 10, dt)
setpoint = 1.0
# PID 增益设置 (基于齐格勒-尼科尔斯法调参)
pid = PIDController(kp=2.0, ki=1.0, kd=0.5, dt=dt)
y = 0.0
y_list = []
for _ in t:
u = pid.update(setpoint, y)
u = np.clip(u, -10, 10) # 执行器饱和限制
y = plant_step(y, u, dt)
y_list.append(y)
plt.figure(figsize=(10, 4))
plt.plot(t, y_list, label='Plant Output')
plt.axhline(setpoint, color='r', linestyle='--', label='Setpoint')
plt.xlabel('Time (s)')
plt.ylabel('Output')
plt.title('PID Control Simulation')
plt.legend()
plt.grid(True)
plt.show()
10. 状态空间表示 (State Space)
10.1 状态方程
连续时间 LTI 系统的状态空间表示:
- : 状态向量 ()
- : 输入向量 ()
- : 输出向量 ()
- : 系统矩阵 ()
- : 输入矩阵 ()
- : 输出矩阵 ()
- : 直接传递矩阵 ()
与传递函数的关系:
10.2 可观测性与可控性
可控性(Controllability): 能否在有限时间内,从任意初始状态转移到期望的状态?
若可控性矩阵 的秩为 ,则系统完全可控。
可观测性(Observability): 能否仅凭输出确定初始状态?
若可观测性矩阵 的秩为 ,则系统完全可观测。
10.3 线性二次调节器 (LQR)
使代价函数最小化的最优状态反馈控制:
最优控制输入:
是状态误差权重, 是控制输入能量权重。
import numpy as np
from scipy import linalg
# 双积分器系统示例
# x'' = u (二阶系统)
A = np.array([[0, 1], [0, 0]])
B = np.array([[0], [1]])
C = np.array([[1, 0]])
D = np.array([[0]])
# LQR 权重
Q = np.diag([10, 1]) # 更重视位置误差
R = np.array([[1]])
# 求解黎卡提方程
P = linalg.solve_continuous_are(A, B, Q, R)
K = np.linalg.inv(R) @ B.T @ P
print("LQR Gain K:", K)
print("Closed-loop poles:", np.linalg.eigvals(A - B @ K))
11. AI/ML 与信号处理
11.1 用于一维信号的 CNN
一维卷积神经网络非常擅长识别心电图(ECG)、地震信号、语音等时间序列信号中的模式。
import torch
import torch.nn as nn
class Signal1DCNN(nn.Module):
def __init__(self, num_classes=5):
super().__init__()
self.conv_layers = nn.Sequential(
nn.Conv1d(1, 32, kernel_size=7, padding=3),
nn.BatchNorm1d(32),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Conv1d(32, 64, kernel_size=5, padding=2),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Conv1d(64, 128, kernel_size=3, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool1d(8)
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(128 * 8, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, num_classes)
)
def forward(self, x):
x = self.conv_layers(x)
return self.classifier(x)
# 使用示例
model = Signal1DCNN(num_classes=5)
# 输入形状: (batch_size, channels=1, sequence_length=1000)
x = torch.randn(8, 1, 1000)
output = model(x)
print("Output shape:", output.shape) # (8, 5)
11.2 STFT 与 Mel 频谱图
在语音 AI 中,广泛采用将信号转换为时频表示后再交由 CNN 处理的方法。
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
# 加载音频
# y, sr = librosa.load('audio.wav', sr=22050)
# STFT (Short-Time Fourier Transform)
# D = librosa.stft(y)
# S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
# Mel 频谱图
# mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
# mel_db = librosa.power_to_db(mel_spec, ref=np.max)
# MFCC (Mel-Frequency Cepstral Coefficients)
# mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print("STFT window: Hann window, hop_length=512, n_fft=2048")
print("Mel-filterbank: 128 mel bands, 0Hz ~ Nyquist")
print("MFCC: 13 coefficients commonly used for speech recognition")
11.3 信号处理 + 深度学习的应用案例
- 心电图(ECG)心律失常分类: 用 1D CNN + LSTM 检测心律异常
- 异常振动检测: 先做 FFT 特征提取,再用自编码器进行异常检测
- 语音识别: MFCC + Transformer (Whisper, wav2vec 2.0)
- 地震检测: 对地震仪信号中的 P 波/S 波自动分类
- 脑电(EEG)分析: 用各频段的功率谱分类专注度/睡眠状态
12. 小测验
Q1. 在采样频率为 8000 Hz 的系统中,不出现混叠即可表示的最大信号频率是多少?
答案: 4000 Hz
解析: 根据奈奎斯特-香农采样定理,采样频率一半的奈奎斯特频率(4000 Hz)是不发生混叠即可表示的最大频率。这也是电话语音编解码器(8 kHz 采样)最多只能处理 4 kHz 语音的原因。
Q2. FIR 滤波器相较于 IIR 滤波器最大的优势是什么?
答案: 线性相位特性与无条件稳定性
解析: FIR 滤波器没有反馈,因此始终 BIBO 稳定。此外,只要将系数设计成对称形式,就能保证线性相位(linear phase),使所有频率分量的延迟相同。这在不允许相位失真的数据通信等场景中十分重要。相对地,IIR 滤波器的优点是能以较低阶数获得陡峭的截止特性。
Q3. PID 控制器中微分(D)动作的作用与缺点是什么?
答案: 对误差的变化率作出反应以抑制超调,但对测量噪声非常敏感。
解析: D 动作会在误差快速变化时产生强烈的控制输出,从而抑制系统超过目标值的现象(超调)。但是,对带噪声的测量值求导会放大噪声。在实用的 PID 中,会加入微分滤波器(在微分项上加低通滤波器),或者采用直接对输出求导的 Derivative on Measurement 方式。
Q4. Z 变换中数字滤波器的稳定性条件是什么?
答案: 所有极点(poles)都必须位于 z-平面单位圆的内部。
解析: 离散时间系统的极点位置与稳定性的关系: 位于单位圆内部(绝对值小于 1)则稳定,位于单位圆上则临界稳定,位于单位圆外部则不稳定。这与连续时间中极点必须位于 s-平面左半平面才稳定相对应。在 z = exp(sT) 变换中,左半平面被映射到单位圆内部。
Q5. 在波特图中,若相位裕度(Phase Margin)为负值,系统会怎样?
答案: 系统将是不稳定的(Unstable)。
解析: 相位裕度表示在增益穿越频率(gain crossover frequency,增益为 0 dB 的频率)处,相位距离 -180 度还有多少余量。若相位裕度为负,意味着增益为 0 dB 时相位已经越过了 -180 度,闭环系统将不稳定。通常为了获得稳定且良好的响应特性,设计时会以 PM 在 45 度~60 度之间为目标。
参考文献
- Oppenheim, A. V. & Schafer, R. W. — Discrete-Time Signal Processing (3rd ed.), Prentice Hall, 2010
- Ogata, K. — Modern Control Engineering (5th ed.), Prentice Hall, 2010
- Proakis, J. G. & Manolakis, D. G. — Digital Signal Processing, Prentice Hall, 2007
- SciPy Signal Processing Documentation — https://docs.scipy.org/doc/scipy/reference/signal.html
- MIT OpenCourseWare 6.003 — Signals and Systems — https://ocw.mit.edu/courses/6-003-signals-and-systems-fall-2011/
- NumPy FFT 文档 — https://numpy.org/doc/stable/reference/routines.fft.html
현재 단락 (1/380)
信号(Signal)是传递信息的物理量的变化。基本分类如下。