01 / 导读
导读
引用
Downey, A. B. (2016). Think DSP: Digital Signal Processing in Python (Version 1.1.4). Green Tea Press. Free official edition: https://greenteapress.com/wp/think-dsp/
章节概要
第1章:声音与信号
开篇一章把信号定义为随时间变化的量,并以声音作为贯穿全书的例子,随后介绍本书的核心思想、核心数学工具和核心算法:频谱分解、离散傅里叶变换(DFT)和快速傅里叶变换(FFT)。作者用一段小提琴录音讲解基频、谐波和音色。本章其余部分介绍作者编写的 thinkdsp 模块及其三个主要类 Signal、Wave 和 Spectrum,演示如何读写 WAV 文件、绘制波形,以及对频谱施加简单的低通、高通和带阻滤波。
第2章:谐波
本章用代码生成三角波和方波并考察其频谱:两者都只含奇次谐波,但三角波的谐波幅度随频率的平方衰减,方波的谐波则与频率成反比衰减。接着,本章有意制造一个令人困惑的频谱来引出混叠:以每秒 10,000 帧采样时,4500 Hz 和 5500 Hz 的余弦信号得到完全相同的采样值,由此解释折叠(奈奎斯特)频率。最后说明 make_spectrum 如何调用 NumPy 的实数 FFT,以及如何把每个复数值理解为一个幅度和一个相位偏移。
第3章:非周期信号
本章从频率成分恒定的信号更进一步,构造线性啁啾和指数啁啾,并顺带说明相位是频率的积分、人耳感知的音高与频率的对数相关。由于啁啾的频谱无法显示各个频率何时出现,本章引入短时傅里叶变换和频谱图。随后解释时间分辨率与频率分辨率之间的权衡(伽博极限)、把有限片段当作周期信号处理所造成的频谱泄漏,以及作为补救措施的汉明窗,最后给出用相互重叠的加窗片段实现 make_spectrogram 的代码。
第4章:噪声
本章生成并分析噪声。先从不相关均匀噪声开始,通过功率谱和积分谱说明它是白噪声。布朗噪声(红噪声)由随机游走构造,在双对数坐标上拟合直线,可以看出其功率按 1/f² 衰减。具有一般指数 β 的粉红噪声,以及用正态概率图检验的不相关高斯噪声,构成了这一家族的其余成员。习题把这些思想应用到自然声音录音和比特币价格数据上,并要求读者实现巴特利特方法和 Voss-McCartney 粉红噪声算法。
第5章:自相关
本章从皮尔逊相关系数出发,定义序列相关和自相关函数,并用它们精确说明第4章噪声信号所谓的“相关”与“不相关”,包括粉红噪声的长程依赖。主要应用是根据自相关的第一个峰值估计一段人声啁啾录音的音高,这比读取短片段频谱所得的频率精度高得多。本章最后把相关重新表述为点积,并使用 NumPy 的 correlate。
第6章:离散余弦变换
从这里开始,本书着手解释变换的工作原理,以 DCT(用于 MP3、JPEG 和 MPEG 压缩)作为通往 DFT 的台阶。本章把合成问题(由幅度得到信号)和分析问题(由信号求幅度)表述为线性代数问题:先求解线性方程组,再说明只要仔细选择时间点和频率,合成矩阵就成为正交矩阵(DCT-IV),其逆矩阵就是转置。本章最后介绍逆 DCT 以及基于 SciPy DCT-II 的 Dct 类。
第7章:离散傅里叶变换
本章沿着同样的“先合成、后分析”路线,借助欧拉公式引入复指数、复正弦信号和复数幅度,然后把 DFT 构造为与一个酉矩阵相乘,其逆矩阵是共轭转置。本章说明 DFT 关于频率下标是周期性的,并通过对实数锯齿波做完整 DFT,解释为什么实信号的频谱后半部分是前半部分的镜像——这也是前面各章使用 rfft 的原因。一道习题引导读者借助 Danielson-Lanczos 引理实现递归 FFT。
第8章:滤波与卷积
本章以某只股票日收盘价和方波的 30 日移动平均为例引入卷积,并说明平滑相当于低通滤波。由此引出卷积定理:时域中的卷积对应频域中的乘法。本章把高斯窗与移动平均(矩形)窗相比较,展示旁瓣的影响,并解释 FFT 如何使卷积、互相关和自相关的计算变得高效(N log N 而非 N²)。
第9章:微分与积分
本章继续讨论窗与滤波器之间的联系,说明差分窗 [1, −1] 表现为高通滤波器,而精确微分对应于把每个频率分量乘以 2πif。相应地,积分对应于除以 2πif,累积和是它的近似,可以把锯齿波变成抛物线形信号。本章随后从频域解释为什么对白噪声积分会得到功率与 1/f² 成正比的布朗噪声。
第10章:LTI 系统
本章以音乐声学为例介绍信号与系统理论。在定义线性时不变(LTI)系统之后,本章说明系统的冲激响应及其 DFT——传递函数——可以完全刻画该系统:一段枪声录音被用作某个房间的冲激响应,并作用于一段小提琴录音。随后把卷积解释为冲激响应经平移和缩放后的副本之和,最后用复指数证明卷积定理。
第11章:调制与采样
最后一章回到第2章出现的混叠现象并给出解释。与冲激卷积会产生平移的副本,这解释了幅度调制与解调;接着把采样建模为与冲激串相乘,这会复制频谱。本章用一段鼓独奏录音说明低通滤波器在什么情况下能够去除这些副本,介绍砖墙滤波器及其在时域中的对应物 sinc 函数,并通过这些例子非正式地介绍奈奎斯特—香农采样定理。
核心概念
第1章:声音与信号
- 频谱分解:信号可以写成不同频率正弦波之和的思想,是全书的组织主线。
- Signal、Wave 与 Spectrum:
thinkdsp的三个类,分别表示随时间连续变化的函数、在离散帧上采样后的该函数,以及它的频率成分。 - 基频与谐波:通常决定感知音高的最低频率分量,以及塑造音色的整数倍分量。
第2章:谐波
- 谐波结构:包含哪些谐波、其幅度衰减多快的模式,用来区分三角波、方波和锯齿波。
- 混叠:高于采样率一半的分量在采样后与某个较低频率分量无法区分的现象。
- 折叠频率:采样率的一半,超出范围的频率会以它为轴被折回可测范围。
第3章:非周期信号
- 啁啾:频率随时间线性或指数变化的信号;相位通过对频率积分得到。
- 频谱图:由短而重叠的片段的频谱(短时傅里叶变换)构成的时频图像。
- 伽博极限:要提高频率分辨率就必须加长片段,从而降低时间分辨率的权衡。
- 泄漏与加窗:片段边缘不连续造成的虚假频率分量,以及用汉明窗等窗函数使片段两端平滑衰减以减轻泄漏的方法。
第4章:噪声
- 白噪声:平均而言在所有频率上功率相等的噪声,如不相关的均匀噪声或高斯噪声。
- 布朗(红)噪声:由随机游走构成、功率与 1/f² 成正比的噪声。
- 粉红噪声:功率按 1/f^β(β 介于 0 与 2 之间)衰减、介于白噪声与红噪声之间的噪声。
第5章:自相关
- 序列相关:信号每个值与下一个值之间的相关。
- 自相关函数:作为滞后量函数计算的序列相关,可揭示周期性和长程依赖。
- 音高估计:根据第一个自相关峰值所在的滞后量求周期信号的基频。
第6章:离散余弦变换
- 合成问题与分析问题:从分量幅度得到信号及其逆过程,表述为矩阵乘法和线性方程组求解。
- 正交矩阵:逆矩阵等于转置的矩阵,使分析与合成一样廉价。
- DCT-IV 与 DCT-II:按特定方式选择采样时间和频率而得到的离散余弦变换版本;实践中常用的是 DCT-II。
第7章:离散傅里叶变换
- 复正弦信号:形如 e^{i(2πft+φ)} 的信号,是一种方便的抽象,其实部就是普通的正弦信号。
- 酉合成矩阵:DFT 矩阵,其逆为共轭转置,因此 DFT 与逆 DFT 都是矩阵乘法。
- DFT 的周期性与对称性:DFT 在频率下标上以 N 为周期重复;对实信号而言,上半部分是下半部分的镜像。
第8章:滤波与卷积
- 卷积:把反转的窗沿信号滑动并对乘积求和的运算,是移动平均等操作的一般形式。
- 卷积定理:卷积的 DFT 等于各自 DFT 的逐元素乘积。
- 高斯滤波器:其变换近似为高斯形的平滑窗,比矩形窗得到更干净的低通滤波器。
第9章:微分与积分
- 微分滤波器:把每个分量乘以 2πif,是一种高通滤波器,可用差分近似。
- 积分滤波器:除以 2πif,可用累积和近似。
第10章:LTI 系统
- 线性时不变系统:输入的加权和产生输出的加权和、输入平移则输出同样平移的系统。
- 冲激响应与传递函数:对单个冲激的输出及其 DFT,二者共同刻画 LTI 系统。
第11章:调制与采样
- 幅度调制:把信号与载波余弦相乘,从而把其频谱的副本搬移到更高频率。
- 把采样看作与冲激串相乘:说明采样会复制频谱的模型,可解释混叠。
- 采样定理与 sinc 插值:以高于最高频率两倍的速率采样的带限信号,可以用砖墙低通滤波器(等价于用 sinc 函数插值)恢复。
评析
优点
- 以代码为先、以真实声音为材料的教学方式。 前言指出,多数信号处理教材从相量等抽象概念自下而上展开,本书则反其道而行:每章先介绍一种技术,把它应用到录制的信号上(小提琴、钟声、人声啁啾、枪声、鼓独奏),然后才解释其原理。读完第1章,读者就能分析和生成声音。
- 用线性代数构建变换。 第6章和第7章把合成与分析表述为矩阵问题,再通过选择采样点使矩阵成为正交或酉矩阵,从而推导出 DCT 和 DFT。这为程序员提供了一条具体的途径,去理解变换为何可逆、为何高效,而不是直接给出 DFT 公式。
- 反复出现、前后连贯的例子。 第4章的噪声在第5章和第9章再次出现,第8章的股价序列在第9章的微分与积分中被重复使用,第2章的混叠之谜在第11章得到解答。这些前后呼应展示了各个概念之间的联系。
- 开放、可运行的材料。 正文以知识共享 BY-NC-SA 许可免费提供,每章在作者的 GitHub 仓库中都有 Jupyter 笔记本和解答笔记本,并附有 Binder 链接,无需安装即可运行。
局限
- 作为完整的信号课程,覆盖面偏窄。 书中没有 z 变换、拉普拉斯变换和零极点分析,也没有系统的 FIR 或 IIR 滤波器设计;连续时间傅里叶分析只是非正式地出现。学习信号与系统或控制课程的学生需要另一本教材来补充这些内容。
- 数学表述不够严格。 采样定理只是举例说明而未加证明,作者本人也承认复信号缺乏令人满意的解释。只有卷积定理得到了证明(第10章)。
- 依赖作者的库和较旧的工具。 大量正文是围绕
thinkdsp类编写的,前言还提到兼容 Python 2 和 Python 3 以及scipy.fftpack;在当前的 Python 环境中,读者可能需要做少量调整。部分习题链接(例如价格数据网站)可能已经变化。 - 要求熟练的编程能力。 前言假定读者掌握 Python 核心语法并熟悉对象;尚不习惯编程的读者会觉得节奏不均。
书中的应用
应用分散在各章之中,而非集中成章:分析乐器和人声录音(第1–3章和第5章)、用自相关追踪音高(第5章)、DCT 在音频和图像压缩中的作用(第6章,附压缩习题)、对股价时间序列做平滑和差分(第8–9章)、用枪声的冲激响应模拟房间声学(第10章),以及用于广播的幅度调制和按 CD、DVD 采样率对音频采样(第11章)。习题还涉及自然噪声录音、比特币价格、盖革计数器(泊松)噪声,以及来自在线声学资料库的冲激响应。
在课程中的定位
在“信号、系统与控制”课程的书单中,Think DSP 是为擅长通过编程学习的学生准备的入门书。Sadiku、Ali 和 Musa 的 Signals and Systems: A Primer with MATLAB 同样如书名所示,是借助 MATLAB 介绍信号与系统的入门书;作为信号与系统的专门入门书,它很可能更接近常规教学大纲;而 Think DSP 则通过 Python 实验建立对频谱、卷积和采样的直觉。Oppenheim、Willsky 和 Nawab 的 Signals and Systems 是自然的下一步,可以补上本书省略的正式内容,例如连续时间变换和 z 变换。
书单中的控制与机器人教材——Nise 的 Control Systems Engineering、Åström 与 Murray 的 Feedback Systems 以及 Craig 的 Introduction to Robotics——都建立在信号与系统的基础之上,而 Think DSP 对这些基础只是点到为止(第10章介绍了 LTI 系统和传递函数,但没有涉及反馈、稳定性或拉普拉斯域设计)。本书最好在主教材之前或与之并行阅读,而不能取而代之。
如何使用本书
本书面向掌握 Python 核心语法和基本对象用法、熟悉复数、了解微分与积分含义的程序员和学生;前言说明线性代数会在用到时讲解。开始之前,先克隆或下载 GitHub 仓库,确保能在本地或 Binder 上运行各章笔记本。
第1–3章是必读内容,应按顺序阅读,读完即可掌握频谱、混叠和频谱图的实用术语。第4章和第5章(噪声与自相关)在以系统为重点的课程中可以压缩,但第5章对音频处理很有用。第6–8章是概念核心,不应跳过:DCT 一章为 DFT 一章做铺垫,第8章的卷积定理是第9–11章的基础。每章阅读时都打开对应笔记本,运行所有示例并聆听声音,在查看提供的解答笔记本之前至少完成两道习题。一学期的选修课大约每周一章即可讲完全部 11 章;把本书作为正式课程辅助读物的学生,可以配合相应讲次阅读第1–3、7、8、10 和 11 章。
版本与来源
本导读依据 Think DSP Version 1.1.4(© 2014 Allen B. Downey,知识共享 BY-NC-SA 4.0 许可),阅读的是 Green Tea Press 官方页面 https://greenteapress.com/wp/think-dsp/ 所链接的免费 PDF;该书的印刷版于 2016 年由 O'Reilly Media 出版。本导读参考了前言、完整目录,以及全部 11 章的引言、每一节、代码示例和章末习题。
