知识背景:傅里叶变换可以分为连续傅里叶变化和离散傅里叶变换,分别是FT,FS,DTFT,DTFS。其中DTFT是我们常说的离散时间傅里叶变换,但这种变换并不一定能够由计算机进行处理,因为对于非周期信号来说其谱一般是连续谱,这样就无法由计算机完成了。所以DFT就出现了,我们知道DTFT是以2π为周期的,我们一般只需要取其主值(可以看作取一个完整的周期)进行分析,如果对DTFT在0到2π内均匀尽行采样的话得到的结果就一定是离散的,如果我们的采样是遵循一定规则的那就可以用采样后的谱完整的恢复原信号。
完整的过程是:原信号遵循采样定理采样得到离散时间信号序列,假设其序列长度为n,如果我们的DFT的点数为K,只要K>=n,那么我们就可以完全重构其频谱(也就是要恢复其DTFT的谱),再由恢复的谱就可以恢复出原信号。再到后来对DFT的计算方式进行改进就有了FFT,是按照DFT具有周期性对称性把多点的DFT分为点数最少的DFT来进行计算。
FFT的算法实现比较复杂,我们一般都是调用第三方库中已经实现的通用的FFT,但是DFT这种不关心运算效率的算法实现起来就很简单,无非就是两层循环。
外层循环就是对K的遍历,内层循环就是对n的遍历,相乘,求和。
比如我们要对
这样一个信号做DFT,f1=0.1 f2=0.3,实现过程如下:
from math import *
import numpy as np
import matplotlib.pyplot as plt
#懒得导包了,直接全抓进来
def signal(n):
return (sin(0.2*pi*n+pi/3)+10*sin(0.6*pi*n+pi/4))
#生成WN项
def wn_k(k,n,N):
return complex(cos(2*pi*n*k/N