Lec1 信号

关于信号的基本了解省略,下面介绍信号的谐波结构。对一个连续信号 ,我们使用傅里叶分解

可以将其分解成一些正弦和余弦信号的和,我们把正弦和余弦信号合起来

其中 的分布就是这个信号的谐波结构(harmonic structure)。

我们可以用谐波结构区分不同的乐器



pytorch分数阶傅里叶变换 python 傅里叶级数_傅里叶变换

image-20200726172247120

傅里叶分解的计算

下面来看一个例子



pytorch分数阶傅里叶变换 python 傅里叶级数_采样率_02

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()



pytorch分数阶傅里叶变换 python 傅里叶级数_求周期方波信号的傅里叶级数_03

image-20200726162242237

然后

同样的我们可以做出图像



pytorch分数阶傅里叶变换 python 傅里叶级数_采样率_04

image-20200726163150326

对于离散的变量,我们可以将其转化为方波,再进行傅里叶变换,但是无论取多少项,在断点处

一定会有 9% 的误差,这叫做 Gibbs 现象(Gibbs Phenomenon)



pytorch分数阶傅里叶变换 python 傅里叶级数_傅里叶变换_05

image-20200726175055381

Lec2 傅里叶变换的复数形式

下面我们把复数加进来

那么傅里叶变换

  • 当 ,
  • 当 ,
  • 当 ,

要注意到 。

如果 存在复数部分,我们可以直接用 计算

一个重要的观点是,把 看成一个向量, 就是不同的分量, 就是不同的基底。用这样的观点,两个向量的内积就是

  • 要注意到,T 选取的不同,可能导致正交性的不同
  • 比如 和 ,在 的时候不正交,在 的时候正交

还讨论了延后半、四分之一、八分之一个周期,对傅里叶分解的系数的影响,和高中学的差不多在此省略。

Lec2b 采样

在采样的时候,我们会损失一些信息



pytorch分数阶傅里叶变换 python 傅里叶级数_采样率_06

image-20200727135231660

下面我们来介绍混叠现象(aliasing),来看几个不同采样率的例子



pytorch分数阶傅里叶变换 python 傅里叶级数_spring_07

image-20200727135723967

pytorch分数阶傅里叶变换 python 傅里叶级数_采样率_08

image-20200727135741090

  • 前三种情况,随着原信号的频率升高,采样信号的频率也在升高
  • 后三种情况,随着原信号的频率升高,采样信号的频率不断降低

如果我们把原信号的频率和采样信号的频率放在一张图里,会看到这样的现象



pytorch分数阶傅里叶变换 python 傅里叶级数_求周期方波信号的傅里叶级数_09

image-20200727140331235

  • 这个过程就叫做混叠
  • 为了采样信号和原信号的频率保持一致,我们可以把高于 的输入都清除掉,这是一种反混叠的方法
  • 这里有一个 BMV1001 IV. Presto - Nathan Milstein, violin 的例子,第一段音频是按 2.8kHz 直接采样的,第二段音频是用上面这种反混叠方法采样的

下面介绍量化,采样信号包含的信息不仅与采样率有关,与量化也有关



pytorch分数阶傅里叶变换 python 傅里叶级数_傅里叶变换_10

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

图片也是一样的道理



pytorch分数阶傅里叶变换 python 傅里叶级数_spring_11

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 个根
  • 更一般的,频率只有 个互异的根

离散信号的傅里叶分解是这样的

复数形式是这样的

我们可以证明

  • 这个级数是线性的
  • 对于 ,有
  • 对于 ,有