python 傅里叶变换_离散傅里叶变换

python 傅里叶变换_离散傅里叶变换_第1张图片

上一篇傅里叶变换我们已经写过了傅里叶变换,它有好多种写法。

傅里叶变换,又称 Fourier Analysis:

这里我们用 j 来表示虚数因为在工程上经常用 j 表示虚数,比如电学中(因为i已经被电流占了)。 傅里叶变换就把时域变换到频域。

逆傅里叶变换,又称 Fourier Synthesis:

当然还有常见的把

所谓的 Herz 写法:

物理中还有更多写法,就不再一一赘述。

在计算机中,我们得到的数据并不是连续的,而是离散采样得到的,也很难想象我们积分要从 -∞ 到 ∞,所以这个时候就有了离散傅里叶变换。

离散傅里叶变换

首先要明白,离散傅里叶变换(Discrete Fourier Transform)和傅里叶变换做的事是一样,也是从时域到频域,然后它做的事是把一组复数

变换到另一组复数
:

相应的,也有逆变换公式:

这两个变换都是

, 为了更好的理解离散傅里叶变换(简写为DFT),现在我们来看一个具体的数字例子,在此之前,先补充一点基础知识。

采样

采样(Sampling ): 自然界中的物理现象大多都是是一种连续的波,比如声音(还是一种纵波),但是在计算机中我们只能用间隔采样离散化,其中采集的频率称为采样率。注意在这里我们的语境下有两个频率,一个是声波震动的频率,一个是采样的频率。

采样的时候我们需要遵循采样定理,采样率需要大于信号中最高频率的2倍信号频率才不会失真。因为人类能听到的声音频率范围是20 Hz ~ 20kHz,所以 CD 的采样率是44.1kHz,这样就会满足需求。

python 傅里叶变换_离散傅里叶变换_第2张图片

看上图,如果我们的声波是 4500Hz 和 5500Hz的余弦波,采样率是10000,我们采到的数据是一样的,所以采样率要大一些的原因就出来了。

例子

假设我们有一个 frequency = 1Hz, Amplitude = 1 的 sin 信号,然后我们采样率是 8Hz, 也就是我们会在 1 sec 中采8个数据:

python 傅里叶变换_离散傅里叶变换_第3张图片

我们得到了这些数据:

python 傅里叶变换_离散傅里叶变换_第4张图片

所以我们有了

:

它们都是实数,当然也可以说是虚部 j = 0 的复数。

所以我们可以根据

来计算
:

我还是用 Python 来算好了,o(╯□╰)o:

from cmath import pi
from cmath import exp 
from cmath import sin

N = 8
x = [0 for _ in range(N) ]
X = [0 for _ in range(N) ]


for i in range(N):
    x[i] = sin(2 * pi * i/N)

for k in range(N):
    for n in range(N):
        X[k] += x[n] * exp(-1j * 2 * pi * k * n / N)

算出来X:

[(-2.220446049250313e-16+0j), 
(2.220446049250313e-16-4j), 
(8.104001475739143e-17+1.1102230246251565e-16j), 
(1.6653345369377348e-16-7.771561172376096e-16j),
(2.220446049250313e-16+2.029061253294536e-16j),
(1.3877787807814457e-15+1.6653345369377348e-15j),
(2.567266157150065e-15+8.881784197001252e-16j),
(-3.4416913763379853e-15+3.999999999999999j)]

因为浮点数精度的问题,定睛一看:

然后我们尝试来画频率的图, 首先我们画横坐标,因为我们的采样率是 8Hz, 一共也就采样了8个数据,那么对于横坐标的分辨率是 sampling frequency / number of samples = 1 Hz,也就是每个 bin 都是前一个加 1Hz.

python 傅里叶变换_离散傅里叶变换_第5张图片

又根据我们的采样定律,我们知道在 8/2 = 4Hz 以上的数据其实都是不做数的,所以我们就应该关注 1 Hz 处,然后我们需要把小于 4Hz 的所有数据 * 2, 所以此时我们得到应该是这样:

python 傅里叶变换_离散傅里叶变换_第6张图片

此时看起来依旧不太对是因为我们的振幅是需要 复数的模除以采样采样数量的,所以 Amplitude = 8/8 = 1. 画出

:

python 傅里叶变换_离散傅里叶变换_第7张图片

此时

因为

是以 cos 为基准的,所以我们知道,移动
, 最终的结论是 Amplitude = 1 的 sin 函数,也就贴合了我们数据的由来。

参考:

wikipedia & youtube video

你可能感兴趣的:(python,傅里叶变换,离散傅里叶变换公式)