1  第一章

开始要从一个调音台讲起,当别人第一次把这个设备介绍给我时,我被它震撼了。很难想象这样一个小小的设备集成了那么多的能力,而且它还不会发烫,这简直是黑科技,于是我决定研究一下它的基本原理,就有了接下来的东西。

图 1.1: 调音台

1.1 数模转换

首先让我感到惊奇的是左上角的两个卡农口,它可以连接话筒,这没什么,但是它中间的那个圆孔是个耳机孔,这种双插设计我还是第一次看到。不过无论如何,设备第一步要做的都是先把模拟信号转成数字信号。这个过程被称为采样。

采样涉及两个重要的指标:采样率和采样精度。采样率指的是每秒钟采样的次数,采样精度指的是采样的分辨率。

采样率我们以\(f_s\)表示,采样定律指出:为了无失真地恢复模拟信号,采样率必须大于信号最高频率的两倍,即\(f_s \geq 2f_{max}\)。其中\(f_{max}\)是信号的最高频率。因此音频信号采样率通常为44100Hz,也就是每秒钟采样44100次。采样精度则代表着信号分辨率,例如12位的采样精度表示可以把输入电压量化为 \(2^{12}\) 个不同的电平。采样精度越高,两个相邻的电平之间的差值越小,能够更精细地还原模拟信号。

图 1.2: 不同采样率下的信号采样与恢复过程

1.2 信号切换

1.2和1.3主要参考《Audio Processes》

当涉及到多通道输入时,通道选择可以用这样的开关逻辑:

图 1.3: 切换开关

对于音频总线来说,除了信号切换,用的更多的是多通道信号混合,信号混合就是把所有音轨的声音混合在一起。它需要用到两个基础操作,乘法和加法。

图 1.4: 信号乘法和加法

调音台的信号混合就是这样一个综合过程:

图 1.5: 双声立体混合

\(x\)\(1-x\)此消彼长且为线性关系,因此这样的调音方式也被称为线性调音。\(x=1\)时,输出的左右声道分别来自\(L_1\)\(R_1\),\(x=0\)时则来自\(L_2\)\(R_2\)

想要实现非现效果,只需要把\(x\)\(1-x\)进行非线性映射,这个非线性映射要求输入的定义域和输出的值域范围都是0~1,例如\(y=x^2(0 \leq x \leq 1)\)

一个值得注意的有趣的映射是这样的: \[ y = \begin{cases} 2x, & 0 \le x \le 0.5 \\ 1, & 0.5 < x \le 1 \end{cases} \tag{1.1}\]

考虑如下的操作逻辑:

图 1.6: 非线性混合

随着 \(x\) 变化,输出有如下特点:

图 1.7: 非线性映射下 in1 与 in2 的占比变化

这样的思想应用于左右耳朵的音响或耳机,就是所谓的声像定位。以这段音频为例:

这段音频截取自1984年电影《Purple Rain》的结尾,由王子(Prince)演奏的同名歌曲“Purple Rain”的solo部分。

其原始音频片段,是1983年Prince和他的乐队在明尼阿波利斯一个俱乐部举行慈善演出时,他们首次公开完整地演奏了Purple Rain并现场录音而成的。

2026年,滚石摇滚出具了一份名单,其名字为:“The 100 Greatest Guitar Solos of All Time”,名单包含了各种音乐风格的吉他独奏,而Purple Rain赫然位列其中,那是Top 1、是伟大、是传奇。

通过一个滑块组件,我们可以收听到这段声音的声像定位(Panning)。

左声道 右声道
声像位置: 0.00 (居中)

1.3 滤波器

滤波器描述的是对不同频率正弦波或余弦波的幅值的增益。常见滤波器有高通、低通、带通和带阻。

描述高通和低通滤波器通常使用截止频率\(f_c\)和滚降速率,\(f_c\)指滤波器对原始正弦输入频率降为-3dB,也就是原始幅度的0.707倍。

滚降速率是指滤波器每十倍频程的斜率,例如低通滤波器在截至频率后每十倍频下降20dB,因为\(f_c\)处是-3dB,因此在\(10f_c\)处为-23dB,约为原始信号的0.0708倍。

图 1.8: 低通滤波器幅频特性曲线

描述带通和带阻滤波器通常使用其中心频率\(f_c\)和品质因子\(Q\),\(Q\)描述的是从中心频率开始,\(f_c\)与其两侧到-3dB的频宽的比值:

\[ Q=\frac{f_c}{f_{bandwidth}} \tag{1.2}\]

图 1.9: 带阻滤波器中心频率 \(f_c\) 与 -3dB 带宽示意图

通常来说\(Q\)越大意味着滤波器性能越好,因为高\(Q\)滤波器越能精准地选中中心频率。

滤波器组合包括串联和并联,我么可以用一个高通滤波器和一个低通滤波器分别组成带通滤波器和带阻滤波器:

图 1.10: 滤波器组合

串联可以看成先经过高通,保留高于\(f_{c1}\)频率的成分,再经过低通滤波器把高于\(f_{c1}\)频率的成分中高于\(f_{c2}\)的成分过滤掉。

并联则是假设\(f_{c1}\)\(f_{c2}\)隔地比较远的情况下,\(f_{c1}\)\(f_{c2}\)中间的部分要么由低通滤波器主导,要么由高通滤波器主导,最终拼接形成的滤波器的特性图。

滤波器设计通常配置为以下两种形式,分别是一阶滤波和二阶滤波。一阶滤波可以分别配置成高通和低通:

图 1.11: 一阶滤波器

\(Z^{-1}\)在信号处理里面代表延迟一个采样点,若当前采集到的信号是\(x[n]\),那么前一个时刻采集到的信号就是\(x[n-1]\),即\(x[n-1]=Z^{-1}x[n]\)

一阶滤波器具有 -20dB 每十倍频的滚降速率。通过拖动下方滑块,可以实时调节一阶低通滤波器的截止频率 \(f_c\)(串联了4个一阶低通滤波器)。

100 Hz 1200 Hz
截止频率 fc: 600 Hz

除了串联,使用更高阶的滤波器也能获得更快的滚降速率,二阶滤波器如下:

图 1.12: 二阶滤波器

\(Q=\sqrt{0.5}\)时,特性图是平坦的,随着\(Q\)增大,特性图会在截至频率到来之前出现共振现象(滤波器反而会放大某些频率的信号)。

图 1.13: 不同 Q 值下二阶低通与高通滤波器的幅频响应

同时二阶滤波器还可以配置成带通或带阻的形式:

图 1.14: 二阶带通、带阻滤波器参数配置
图 1.15: 不同 Q 值下二阶带通与带阻滤波器的幅频响应

1.4 频域分析

不同频率、幅度和相位的三角波组合在一起可以构成任意波形,因此波形也可以被分解为不同频率、不同幅值、不同相位的三角波,例如:

图 1.16: 方波分解

这个分解的过程叫傅里叶变换。对于离散的数字型号而言,离散傅里叶变化更像是找到一组特定的基。例如我们所处的三维空间,空间里的任何一个点都可以用\((x,y,z)\)表示,而\(x\)\(y\)\(z\)分别是在基\((1,0,0)\)\((0,1,0)\)\((0,0,1)\)上的幅值:

\[ (x,y,z) = x \cdot (1,0,0)+y \cdot (0,1,0)+z \cdot (0,0,1) \tag{1.3}\]

对于具有特定长度 \(N\) 的音频信号,只需要找到 \(N\) 个长度也为 \(N\) 的特殊的基就行,只不过这些基是用复数来表示的,是\(e^{j \frac{2\pi k n}{N}}\),其中\(k\)代表第\(k\)个基,\(n\)代表复数域上的第\(k\)个基的第\(n\)个分量。同样地每个基上的幅值也是一个复数,假设为 \(a+bi\)

则第\(k\)个离散复震动的形式为:

\[ z[n] = (a + bi) \cdot e^{j \frac{2\pi k n}{N}} \quad (n = 0, 1, \dots, N-1) \tag{1.4}\]

图 1.17: 离散复震动信号 \(z[n] = (a+bi) e^{j 2\pi k n / N}\) 三维采样示意图(连续螺旋线为辅助包络,实际信号仅在 \(n\) 整数点采样)

\(\sqrt{a^2+b^2}\)代表当前复振幅的幅值,也就是信号的傅立叶变换在当前频率处的振幅,变换的振幅图也只是把不同基的\(\sqrt{a^2+b^2}\)画在同一个表格里。

下图是前文音频型号的振幅图:

图 1.18: 音频信号的振幅谱

另一个值得讨论的问题是频谱泄漏,假设真实世界有一个纯正弦波:\(x(t)=A_0 \sin(2\pi f_0 t)\),如果我们能无限地观察它(从 \(-\infty < t < +\infty\)),那它的傅里叶变换 \(X(f)\) 只会在 \(f = f_0\) 处存在一条理想的谱线:

图 1.19: 无限长纯正弦信号的理想傅里叶振幅谱

但现实中我们对信号的观察都是有限长的,实际得到的是\(x_\omega(t) = x(t) w(t)\),其中\(w(t)\)是窗函数: \[ \omega(t) = \begin{cases} 1 & t \in [0, T_\omega] \\ 0 & else \end{cases} \tag{1.5}\]

添加上窗函数的傅立叶变化是这样的:

图 1.20: 加窗截断信号的频谱(包含中心主瓣与两侧衰减旁瓣)

会发现在\(f_0\)周围其他频率产生了“成分”,这个现象就叫频谱泄漏,其根本原因来自人们对于信号的有限观察:即人们记录的所有信号都只是理想无限长时间信号下的加窗截断版本(但如果原始信号在窗口之外一直就为0,那傅立叶变换就是完整准确的)。

当对\(x_\omega(t)\)\(f_s\)的频率离散化采样,会得到\(N=f_s·T_\omega\)个点,采样后离散傅里叶变化的分辨率是\(\Delta f = \frac{f_s}{N}=\frac{1}{T_\omega}\),如果恰好\(f_0 = k \Delta f\),那离散傅里叶变化的频谱图又会回到 图 1.19 这种没有旁瓣的形式。理解的关键在于离散傅里叶变换的频谱图等于以\(\Delta f\)的间隔对连续信号频谱图进行采样,若\(f_0\)落在采样点上,从 图 1.20 的坐标可以看出,\(f_0+\Delta f\)也正好落在0上,因此也不会采集到旁瓣的“成分”。

这有点像一个“bug”让系统崩坏了,但是另一个“bug”恰巧又修复了上一个“bug”的问题。但其本质上来说,也就是连续时间上的频谱泄漏仍旧是存在的。

1.5 短时傅里叶变换

从前文中可以得到一个很重要的观点:即离散傅里叶变换的分辨率和原始信号的长度\(T_\omega\)成反比,信号观察时间\(T_\omega\)越大,分辨率越高,观察时间越小,分辨率越低。这和采样率\(f_s\)无关(前提是\(f_s\)满足采样定律),增大\(f_s\)并不能提高离散傅里叶变换的细节。

但正如 图 1.18 看到的,我们只知道全局的频率成分,对于不同时间具体发生了什么一无所知。为了解决这个问题,人们发明了短时傅里叶变换(STFT),对原始信号进行分帧,也就是添加窗口在更小的时间范围里做分析。随着窗口的移动,人们也就知道了更具体的“当下”所发生的事情。

越短的窗口也意味着越模糊的分辨率,越高的分辨率需要越长的时间窗口,窗口长度和频率分辨率构成了频域分析里的“不确定性准则”。

为了尽量避免频谱泄漏,人们开发了更多类型的窗函数代替矩形窗。常见的窗函数(如矩形窗、汉宁窗、海明窗、布莱克曼窗等)在时域及其对应的连续时间傅里叶变换频谱对比如下图所示:

图 1.21: 常用窗函数的时域波形及其连续傅里叶变换频谱幅度与旁瓣抑制对比

下图为前文音频信号的短时傅里叶变换,展现出不同时间段内频率分量的动态演变:

图 1.22: 音频信号短时傅里叶变换

要看懂这个图呢,想象把 图 1.18 竖着排列,并用颜色区分幅值大小。不过 图 1.22 每个竖轴的时间窗口约0.1秒,每次窗口移动向右约0.02秒,并用分贝(dB)来表示幅度大小并将其映射成不同的颜色。