作为一名计算机/AI背景的学生,我们习惯了离散的数据(数组、张量),但物理世界是连续的。
最近开始系统性复习信号处理,我发现如果跳出死记硬背公式的怪圈,从物理直觉和工程实现的角度去理解,这些概念其实非常优美且实用。这是我的第一篇学习总结,涵盖了信号基础、系统特性(LTI)与冲激响应。
1. 核心概念:连接两个世界的桥梁
连续 (CT) vs 离散 (DT)
现实世界的声音、温度、电压是连续变化的(Continuous Time, CT),但在计算机中,我们只能存储离散的点(Discrete Time, DT)。
- 直觉理解:就像电影胶卷,虽然画面是跳跃的(一帧帧),但只要播放得够快,大脑就会把它补全为连续动作。
- 采样 (Sampling):这就是把现实世界“数字化”的过程。
- 关键点:采样率决定了我们能保留多少原始信息(后续会学到奈奎斯特采样定理)。
冲激响应 (Impulse Response)
这是一个让我产生顿悟的概念。
- 定义:如果你给系统一个无限短、无限强的脉冲(Unit Impulse,就像踢了系统一脚),系统后续产生的“回声”或“余震”,就是冲激响应 $h[n]$。
- 为什么它最重要:对于线性系统,只要知道了它被踢一脚的反应,你就知道了它对世间万物的反应。(这是卷积的基础)。
2. Python 实操与可视化
光说不练假把式。我用 Python 模拟了信号采样以及线性/非线性系统的区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import numpy as np import matplotlib.pyplot as plt import platform
def set_chinese_font(): system_name = platform.system() if system_name == "Windows": plt.rcParams['font.sans-serif'] = ['SimHei'] elif system_name == "Darwin": plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'PingFang SC', 'Heiti TC'] else: plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False
set_chinese_font() plt.style.use('seaborn-v0_8-whitegrid')
def module_1_visualization(): t_continuous = np.linspace(0, 1, 1000) f = 5 signal_ct = np.sin(2 * np.pi * f * t_continuous)
fs = 20 n_discrete = np.arange(0, 1, 1/fs) signal_dt = np.sin(2 * np.pi * f * n_discrete)
plt.figure(figsize=(14, 6)) plt.subplot(1, 2, 1) plt.plot(t_continuous, signal_ct, label='连续信号 (Analog)', color='gray', alpha=0.5) plt.stem(n_discrete, signal_dt, linefmt='b-', markerfmt='bo', basefmt='r-', label='离散采样 (Samples)') plt.title("概念 1: 采样 (CT 转 DT)", fontsize=14) plt.xlabel("时间 Time (s)") plt.ylabel("幅度 Amplitude") plt.legend(loc='upper left', bbox_to_anchor=(1, 1))
x = np.linspace(-1, 1, 50) y_linear = 2 * x y_nonlinear = x**2
plt.subplot(1, 2, 2) plt.plot(x, x, 'k--', label='输入信号 x', alpha=0.5) plt.plot(x, y_linear, 'g-', label='线性系统 (y=2x)') plt.plot(x, y_nonlinear, 'r-', label='非线性系统 (y=x^2)') plt.title("概念 2: 系统特性 (线性 vs 非线性)", fontsize=14) plt.xlabel("输入幅度 Input") plt.ylabel("输出幅度 Output") plt.legend(loc='upper left', bbox_to_anchor=(1, 1))
plt.tight_layout() plt.show()
if __name__ == "__main__": module_1_visualization()
|
实验结果图:

观察与思考
- 左图 (采样):蓝色的点是我们存储在计算机里的数据,灰色的线是真实世界的信号。可以看出,离散点丢失了点与点之间的信息,但保留了整体趋势。
- 右图 (系统特性):这是容易被忽视的深层细节。
- 绿色 (线性):波形形状没变,只是幅度变了。
- 红色 (非线性):输入是直线(或正弦波),输出变成了抛物线。注意:非线性系统会创造出输入信号中原本不存在的频率!(例如 $sin^2(t)$ 会导致正弦波频率加倍)。
3. 深度解析:线性时不变 (LTI) 系统
在教材中,LTI (Linear Time-Invariant) 往往是一堆枯燥的判定公式,但在工程视角下,它们是算法成立的前提。
线性 (Linearity) = “可叠加”
- 公式:$T(a x_1 + b x_2) = a T(x_1) + b T(x_2)$
- 人话:复杂问题可以拆解。如果系统是线性的,我们可以把一个复杂的语音信号拆成无数个简单的正弦波(傅里叶变换),分别处理后再加回去。如果系统是非线性的,这种拆解就失效了。
时不变 (Time-Invariance) = “可复现”
- 人话:系统的性格很稳定。今天测试的结果,明天也能复现;不管信号是第 1 秒进来还是第 10 秒进来,系统的处理方式一模一样。
冲激响应的上帝视角:筛选性质
数学上有一个极美的公式:
这告诉我:任何复杂的信号,本质上都是无数个“冲激信号”在不同时间、不同强度下的叠加。
因为系统是线性的(可叠加),且信号是由冲激组成的,所以:
系统的输出 = 无数个“冲激响应”的叠加。
这就是我们要学的下一个模块——卷积的物理本质。
Next Step: 下一篇我们将手写卷积算法,看看如何用代码实现“翻转、平移、相乘”。