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

e868964d371e16ed3738acef951e1169.png

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

傅里叶变换,又称 Fourier Analysis:

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

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

当然还有常见的把

所谓的 Herz 写法:

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

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

离散傅里叶变换

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

变换到另一组复数
:

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

这两个变换都是

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

采样

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

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

14231f82988b80b2e81dd165e5eec9ee.png

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

例子

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

4303a93197170e57437feeb7d835e3e7.png

我们得到了这些数据:

16e9ae29db2eb4b3c67339b81ea9f0c6.png

所以我们有了

:

它们都是实数,当然也可以说是虚部 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.

2d352267a6c5d687e999fb36c2555f87.png

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

57bd8cf0045a175135b7773b4e7a3b15.png

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

:

0016e424085d4036cffbb55a2497f631.png

此时

因为

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

参考:

wikipedia & youtube video

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值