tastynoob
Articles58
Tags18
Categories7
离散傅里叶变换

离散傅里叶变换

离散傅里叶变换及逆变换

这里直接上离散傅里叶变换的数学公式:

用D(x)代表傅里叶变换输出,E(x)代表原始波形数据
用ID(x)代表傅里叶逆变换输出
(x=0,1,2,3…)
用N代表数据量,也就是采样点数量

$D(k) = \sum_{n=0}^{N-1}E(n)(cos\frac{2\pi kn}{N} - jsin\frac{2\pi kn}{N})$
$ID(k) = \frac{1}{N}\sum_{n=0}^{N-1}D(n)(cos\frac{2\pi kn}{N} + jsin\frac{2\pi kn}{N})$

其中的”j”代表虚数单位

python代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import math

pi = 3.1415926
def DFT(origin): # 计算给定序列的离散傅里叶变换结果
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) - math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp)
return output


def IDFT(origin):
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) + math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp / N)
return output

样例:
滤波

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import numpy as np
import math
import matplotlib.pyplot as plt

start_X = -2*np.pi
end_x = 2*np.pi
slice_num = 200 #切分
X = np.linspace(start_X,end_x,slice_num,endpoint=True) #X轴向
wave1 = 10*np.sin(X) + 5*np.append(np.random.rand(len(X)-100),np.zeros(100))
wave1 = X + wave1 * 1j
wave1_real=np.real(wave1)
wave1_imag=np.imag(wave1)

plt.title('original data')
plt.plot(np.real(wave1), np.imag(wave1))
plt.show()

pi = 3.1415926
def DFT(origin): # 计算给定序列的离散傅里叶变换结果
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) - math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp)
return output


def IDFT(origin):
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) + math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp / N)
return output

#dft输出 , 对波形1做傅里叶变换
dft_wave = DFT(wave1_imag)
#idft输出 逆变换
idft_wave = IDFT(dft_wave)


#傅里叶滤波
dft_new_wave = dft_wave.copy()
#过滤杂波
for i in range(len(dft_new_wave)):
if(dft_new_wave[i].__abs__() <= 200):
dft_new_wave[i]=0
idft_wave = IDFT(dft_new_wave)


fig = plt.figure()
plt.title('DFT filter data')
plt.plot(np.real(wave1), np.real(idft_wave))
plt.show()


结果:

图像

Author:tastynoob
Link:https://tastynoob.github.io/1970/01/01/%E7%AE%97%E6%B3%95/%E7%A6%BB%E6%95%A3%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×