![78214aa62569811fb028341ff3dbfb7e.png](https://img-blog.csdnimg.cn/img_convert/78214aa62569811fb028341ff3dbfb7e.png)
傅立叶变换能干啥?
多图预警
![f2d5c9f90ad8cde44f9fdb005abc6bf9.gif](https://img-blog.csdnimg.cn/img_convert/f2d5c9f90ad8cde44f9fdb005abc6bf9.gif)
上面的心就是通过傅里叶变换画出来的!
接下来介绍方法。
离散傅立叶变换
假设我有N个复数,表示为向量x。离散傅立叶变换可以把x转换成N个新数,表示为向量X,满足如下等式:
而X又可以反过来变回x
公式都是维基抄的。数学就到此为止。
下面给具体的例子。
我们来看这8个点组成的粗糙的心形
![6c0a749598af03fbae77c22cc2bb60d7.png](https://img-blog.csdnimg.cn/img_convert/6c0a749598af03fbae77c22cc2bb60d7.png)
如果我把这些点做傅里叶变换,可以得到这样一些点
![adf21c9a9e649bb1003772af706270d4.png](https://img-blog.csdnimg.cn/img_convert/adf21c9a9e649bb1003772af706270d4.png)
看起来很随机没啥规律。把他们的坐标看成向量加起来看看
In [42]: X
Out[42]:
array([24. +22.j , -1.41421356 -1.41421356j,
-2. +0.j , 0.24264069 -0.24264069j,
0. +2.j , 1.41421356 +1.41421356j,
2. +0.j , -8.24264069 +8.24264069j])
In [43]: x
Out[43]: array([2.+4.j, 3.+3.j, 4.+4.j, 5.+3.j, 4.+2.j, 3.+1.j, 2.+2.j, 1.+3.j])
In [44]: fft(x)
Out[44]:
array([24. +22.j , -1.41421356 -1.41421356j,
-2. +0.j , 0.24264069 -0.24264069j,
0. +2.j , 1.41421356 +1.41421356j,
2. +0.j , -8.24264069 +8.24264069j])
In [45]: sum(fft(x))
Out[45]: (16+32j)
看起来蛮整的。是巧合么?
其实它正好是第一个点的8倍。
其实就对应了上面公式
那
验证一下
In [51]: sum(fft(x) * np.exp(np.array(range(8)) * (1j * 2 * np.pi / 8)) / 8)
Out[51]: (3+3j)
确实如此。
其实
相似的
也就是说,x下标的增长,对应着X向量的旋转。
如果x的下标每秒增长1,X里面的向量就会像下面一样转起来旋转