Lec1 信号
关于信号的基本了解省略,下面介绍信号的谐波结构。对一个连续信号 ,我们使用傅里叶分解
可以将其分解成一些正弦和余弦信号的和,我们把正弦和余弦信号合起来
其中 的分布就是这个信号的谐波结构(harmonic structure)。
我们可以用谐波结构区分不同的乐器
image-20200726172247120
傅里叶分解的计算
下面来看一个例子
image-20200726161021803
首先分析 ,
用 Python 做出图像
>>> from math import cos, pi
>>> from matplotlib.pyplot import plot, show
>>> ff = []
>>> tt = []
>>> t = -1.2*pi
>>> while t 1.2*pi:
... ff.append(2/pi+sum([-4/pi/(4*k*k-1)*cos(2*k*t) for k in r
ange(1,100)]))
... tt.append(t)
... t += 0.01
>>> plot(tt,ff)
[0x0000025F78BD2EF0>]>>> show()
>>> from math import cos, pi
>>> from matplotlib.pyplot import plot, show
>>> ff = []
>>> tt = []
>>> t = -1.2*pi
>>> while t 1.2*pi:
... ff.append(2/pi+sum([-4/pi/(4*k*k-1)*cos(2*k*t) for k in r
ange(1,100)]))
... tt.append(t)
... t += 0.01
>>> plot(tt,ff)
[0x0000025F78BD2EF0>]>>> show()
image-20200726162242237
然后
同样的我们可以做出图像
image-20200726163150326
对于离散的变量,我们可以将其转化为方波,再进行傅里叶变换,但是无论取多少项,在断点处
一定会有 9% 的误差,这叫做 Gibbs 现象(Gibbs Phenomenon)
image-20200726175055381
Lec2 傅里叶变换的复数形式
下面我们把复数加进来
那么傅里叶变换
- 当 ,
- 当 ,
- 当 ,
要注意到 。
如果 存在复数部分,我们可以直接用 计算
一个重要的观点是,把 看成一个向量, 就是不同的分量, 就是不同的基底。用这样的观点,两个向量的内积就是
- 要注意到,T 选取的不同,可能导致正交性的不同
- 比如 和 ,在 的时候不正交,在 的时候正交
还讨论了延后半、四分之一、八分之一个周期,对傅里叶分解的系数的影响,和高中学的差不多在此省略。
Lec2b 采样
在采样的时候,我们会损失一些信息
image-20200727135231660
下面我们来介绍混叠现象(aliasing),来看几个不同采样率的例子
image-20200727135723967
image-20200727135741090
- 前三种情况,随着原信号的频率升高,采样信号的频率也在升高
- 后三种情况,随着原信号的频率升高,采样信号的频率不断降低
如果我们把原信号的频率和采样信号的频率放在一张图里,会看到这样的现象
image-20200727140331235
- 这个过程就叫做混叠
- 为了采样信号和原信号的频率保持一致,我们可以把高于 的输入都清除掉,这是一种反混叠的方法
- 这里有一个 BMV1001 IV. Presto - Nathan Milstein, violin 的例子,第一段音频是按 2.8kHz 直接采样的,第二段音频是用上面这种反混叠方法采样的
下面介绍量化,采样信号包含的信息不仅与采样率有关,与量化也有关
image-20200727141518170
- 这里也有两个例子,第一个是按 2-bit 量化的,第二个是按 4-bit 量化的
举一个例子,如果有一段 74min 的双声道音频,按照 44.1kHz 采样,16bits 量化,那么它的大小就是
- 2 channels * 16 bits/sample * 44100 sample/sec * 60 sec/min * 74min
- ~= 6.3 Gbits
- ~= 0.78 G bytes
图片也是一样的道理
image-20200727142536599
下面来用 Python 进行一个声波的小实验
首先要安装 lib6003
这个库,如果是 Windows 可以在安装 wheel 之后运行
pip install https://sigproc.mit.edu/_static/spring20/software/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl https://sigproc.mit.edu/_static/spring20/software/lib6003-0.0.4.tar.gz
pip install https://sigproc.mit.edu/_static/spring20/software/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl https://sigproc.mit.edu/_static/spring20/software/lib6003-0.0.4.tar.gz
如果是 Linux 可以直接
pip3 install https://sigproc.mit.edu/_static/spring20/software/lib6003-0.0.4.tar.gz
pip3 install https://sigproc.mit.edu/_static/spring20/software/lib6003-0.0.4.tar.gz
比如我们要对一个 1000Hz 的余弦波进行采样,采样率 44.1kHz,我们希望得到 3s 的 .wav 文件。
- 首先,我们要得到 3s 的采样信号,那么一共需要 3*44100 个样本。
- 我们会使用一个
for i in range(0, 3*44100)
的循环,对一个余弦波进行采样,那么采样时的频率应该是2*pi*1000/44100
所以代码是
import math
from lib6003.audio import wav_write
EXPR1 = 2*math.pi*1000/44100
EXPR2 = int(3*44100)
f = [math.cos(EXPR1 * n) for n in range(0, EXPR2)]
wav_write(f, 44100, 'output.wav')
import math
from lib6003.audio import wav_write
EXPR1 = 2*math.pi*1000/44100
EXPR2 = int(3*44100)
f = [math.cos(EXPR1 * n) for n in range(0, EXPR2)]
wav_write(f, 44100, 'output.wav')
下面是生成的文件(音调很高,建议调低音量)
Lec3 离散信号
这一节我们来讨论下离散信号的傅里叶分解。
首先,对一个离散信号,只有周期是正整数的时候才是周期性的信号。
例如 ,如果它的周期是 那么
所以一定有
- 如果 ,那么 只有 8 个根
- 更一般的,频率只有 个互异的根
离散信号的傅里叶分解是这样的
复数形式是这样的
我们可以证明
- 这个级数是线性的
- 对于 ,有
- 对于 ,有