Python ifft
2019-04-11 本文已影响0人
多问Why
1.傅利叶逆变换得到原始信号
import numpy as np
import matplotlib.pyplot as plt
def get_data(sample_time,f_s):
f = 20
t = np.linspace(0, sample_time, sample_time*f_s, endpoint=False)
y = np.cos(f * 2 * np.pi * t) + np.cos(2*f * 2 * np.pi * t)
return y
def demo_fft():
fig = plt.figure()
s_t = 1
f_s = 1024
y = get_data(s_t, f_s)
# signal wave
ax = fig.add_subplot(3, 1, 1)
ax.plot(y)
yf = np.fft.fft(y)
xf = np.fft.fftfreq(len(yf), 1/len(yf))
# frequency
ax = fig.add_subplot(3, 1, 2)
ax.stem(xf, np.abs(yf))
yifft = np.fft.ifft(yf)
ax = fig.add_subplot(3, 1, 3)
# signal from ifft ,can not use np.abs() here
ax.plot(yifft.real)
plt.show()
demo_fft()
注意fft的结果是个复数,这时取绝对值得到频率对应的振幅。ifft的结果也是复数,有正有负,因为原始信号也是有正有负,这时不能取绝对值,而应取实数部分。虚数部分都接近于0.当然如果原始信号没有负数,也可取绝对值。
Figure_1.png
2.模拟去除高频噪声
def get_data(sample_time,f_s):
f = 20
t = np.linspace(0, sample_time, sample_time*f_s, endpoint=False)
y = np.cos(f * 2 * np.pi * t) + 0.1*np.cos(450 * 2 * np.pi * t) + 0.05*np.cos(500 * 2 * np.pi * t)
return y
def demo_fft():
fig = plt.figure()
s_t = 1
f_s = 1024
y = get_data(s_t, f_s)
# signal wave
ax = fig.add_subplot(3, 1, 1)
ax.plot(y)
yf = np.fft.fft(y)
xf = np.fft.fftfreq(len(yf)) * len(yf)
# frequency
ax = fig.add_subplot(3, 1, 2)
ax.stem(xf, np.abs(yf))
M = len(yf)
K = 100
yf[M // 2 - K: M // 2 + K] = 0
yifft = np.fft.ifft(yf)
ax = fig.add_subplot(3, 1, 3)
# signal from ifft ,can not use np.abs() here
ax.plot(yifft.real)
plt.show()
demo_fft()
Figure_1-1.png
现在原始信号中加入了频率为450,500的两个小幅的高频信号,模拟高频噪声,可以发现信号波形中有很多毛刺。fft的结果频率是正频率从0到最高,然后负频率再从最高到0,所以去除高频信号就是让中间那部分为0。