数学实现信号分析[4]: 离散傅里叶变换
2019-08-11 16:10 作者:nyasyamorina | 我要投稿

*** 越来越简洁的封面 ***
在之前说过了普通的傅里叶变换, 而且也讲过在计算机里是不存在连续的东西, 针对计算机的离散数据, 专门有一种东西叫做离散傅里叶变换 (Discrete Fourier transform), 在学习DFT之前希望读者可以看一下下面关于FT的视频, 这种"缠绕机器"的概念始终贯穿在DFT中 (特别是后面的快速傅里叶变换FFT)


之前说到在计算机里时间是不重要的, 重要的是数据排列顺序, 为了方便理解"频率"这个属性, 我们吧一串间隔相同的数列紧凑地放在 t ∈ [0, 1) 中, 这样频率就有了相应的定义了. 如下图

为了适应离散数据, 原傅里叶变换必须作一些调整
这里记总数据数为 n, 则第 i 个数据对应的t为 i / n , 那么原傅里叶变换再根据定积分的定义可以得到DFT的计算式子, 并且因为数据是分布在0到1之间, 那么频率必须是整数倍, 数据之间间隔为1/n, 那么最大频率为n就已经足够了, 更有在积分定义式里的dt也可以直接无视, 因为结果只会相差n倍, 那么得到:


图解:
黑色点为原点0, 蓝色点为DFT结果/n (既是重心)









现在就来尝试一下用代码实现DFT吧
首先要定义基本的东西

然后就是DFT

我们可以来检验一下

我们可以看到计算结果是和numpy里精确的结果一样 (忽略浮点数误差的话)


拓展:
傅里叶变换通常都有相应的反变换 (即由频率还原f(t)), DFT也有相应的反变换 iDFT, 我这里直接扔代码(无注释), 推到正确的iDFT就当作是作业吧 (这里我假设输入数据全为实数)


终于结束啦, 发一下上一期的那首歌的DFT结果

下一篇预告: FFT >> DFT