用矩阵相乘的方法来计算傅里叶变换
离散傅里叶变换公式
当 k=1,X(1) 的实部是向量 [x(0), x(1), ..., x(N-1)] 与 向量[ ]的乘积,所以傅里叶变换可以用矩阵相乘来计算
python 代码
from math import cos, sin, pi
import numpy as np
def my_fft(inpt, N):
w = np.zeros((N, 2 * N))
for k in range(N):
for n in range(N):
w[k][2*n] = cos(2*pi*k*n/N)
w[k][2*n+1] = -sin(2*pi*k*n/N)
for i in range(N):
print(w[i])
res = np.dot(inpt, w)
return res
if __name__ == "__main__":
N = 8
x = np.linspace(0,N-1, N)
print(x)
my_res = my_fft(x, N)
print("\n my fft:\n")
print(my_res)
print("\n python fft:\n")
fft_res = np.fft.rfft(x, N)
print(fft_res)
输出:
[ 0. 1. 2. 3. 4. 5. 6. 7.] # 输入
# 下面矩阵是cos, sin组成的矩阵
[ 1. -0. 1. -0. 1. -0. 1. -0. 1. -0. 1. -0. 1. -0. 1. -0.]
[ 1.00000000e+00 -0.00000000e+00 7.07106781e-01 -7.07106781e-01
6.12323400e-17 -1.00000000e+00 -7.07106781e-01 -7.07106781e-01
-1.00000000e+00 -1.22464680e-16 -7.07106781e-01 7.07106781e-01
-1.83697020e-16 1.00000000e+00 7.07106781e-01 7.07106781e-01]
[ 1.00000000e+00 -0.00000000e+00 6.12323400e-17 -1.00000000e+00
-1.00000000e+00 -1.22464680e-16 -1.83697020e-16 1.00000000e+00
1.00000000e+00 2.44929360e-16 3.06161700e-16 -1.00000000e+00
-1.00000000e+00 -3.67394040e-16 -4.28626380e-16 1.00000000e+00]
[ 1.00000000e+00 -0.00000000e+00 -7.07106781e-01 -7.07106781e-01
-1.83697020e-16 1.00000000e+00 7.07106781e-01 -7.07106781e-01
-1.00000000e+00 -3.67394040e-16 7.07106781e-01 7.07106781e-01
5.51091060e-16 -1.00000000e+00 -7.07106781e-01 7.07106781e-01]
[ 1.00000000e+00 -0.00000000e+00 -1.00000000e+00 -1.22464680e-16
1.00000000e+00 2.44929360e-16 -1.00000000e+00 -3.67394040e-16
1.00000000e+00 4.89858720e-16 -1.00000000e+00 -6.12323400e-16
1.00000000e+00 7.34788079e-16 -1.00000000e+00 -8.57252759e-16]
[ 1.00000000e+00 -0.00000000e+00 -7.07106781e-01 7.07106781e-01
3.06161700e-16 -1.00000000e+00 7.07106781e-01 7.07106781e-01
-1.00000000e+00 -6.12323400e-16 7.07106781e-01 -7.07106781e-01
-2.69484194e-15 1.00000000e+00 -7.07106781e-01 -7.07106781e-01]
[ 1.00000000e+00 -0.00000000e+00 -1.83697020e-16 1.00000000e+00
-1.00000000e+00 -3.67394040e-16 5.51091060e-16 -1.00000000e+00
1.00000000e+00 7.34788079e-16 -2.69484194e-15 1.00000000e+00
-1.00000000e+00 -1.10218212e-15 -4.90477700e-16 -1.00000000e+00]
-4.28626380e-16 1.00000000e+00 -7.07106781e-01 7.07106781e-01
-1.00000000e+00 -8.57252759e-16 -7.07106781e-01 -7.07106781e-01
-4.90477700e-16 -1.00000000e+00 7.07106781e-01 -7.07106781e-01]
my fft:
[ 2.80000000e+01 0.00000000e+00 -4.00000000e+00 9.65685425e+00
-4.00000000e+00 4.00000000e+00 -4.00000000e+00 1.65685425e+00
-4.00000000e+00 -3.42901104e-15 -4.00000000e+00 -1.65685425e+00
-4.00000000e+00 -4.00000000e+00 -4.00000000e+00 -9.65685425e+00]
python fft:
[ 28.+0.j -4.+9.65685425j -4.+4.j -4.+1.65685425j
-4.+0.j ]
以上。