我有一个复杂的信号,可以在傅里叶空间中看到,并希望过滤掉一些不需要的频率。我在网上读到,应该在进行傅里叶变换之前应用汉宁窗来避免泄漏。
因此,如下所示的代码,我正在对我的数据应用汉宁窗,然后对其进行傅里叶变换。作为测试,我想看看如果我不过滤任何内容,是否可以获取我的原始信号。然而,信号在边缘处变为零。
现在,我明白这是因为汉宁窗滤波器在其结束时也变为零。那么,我如何应用汉宁窗,进入频域并回到我的时间域,以恢复我的信号?如果我的信号在两端变为零,当我尝试过滤所需频率时,在时间域中得到的结果仍将在边缘处变为零。
我的方法有什么错误吗?谢谢您提供任何帮助!
这是我正在做的示例代码:
以下是翻译的结果:
因此,如下所示的代码,我正在对我的数据应用汉宁窗,然后对其进行傅里叶变换。作为测试,我想看看如果我不过滤任何内容,是否可以获取我的原始信号。然而,信号在边缘处变为零。
现在,我明白这是因为汉宁窗滤波器在其结束时也变为零。那么,我如何应用汉宁窗,进入频域并回到我的时间域,以恢复我的信号?如果我的信号在两端变为零,当我尝试过滤所需频率时,在时间域中得到的结果仍将在边缘处变为零。
我的方法有什么错误吗?谢谢您提供任何帮助!
这是我正在做的示例代码:
import sys
import matplotlib
def fourier(time,array):
fft = np.fft.fft(array*np.hanning(len(array)))
Npts = len(array)
spacing_array = time[::-1][:-1][::-1] - time[:-1]
if np.mean(spacing_array) - spacing_array[0] > 1.e-16:
print "time axis not equally separated. cannot compute fft"
sys.exit()
spacing = spacing_array[0]
freq = np.fft.fftfreq(Npts, spacing)
return freq,fft
if __name__ == "__main__":
import numpy as np
import matplotlib.pyplot as plt
# generate a sample signal
sample_rate = 100.0
nsamples = int(2.e3)
t = np.arange(nsamples) / sample_rate
x = np.cos(2*np.pi*0.5*t) + 0.2*np.sin(2*np.pi*2.5*t+0.1) + \
0.2*np.sin(2*np.pi*15.3*t) + 0.1*np.sin(2*np.pi*16.7*t + 0.1) + \
0.1*np.sin(2*np.pi*23.45*t+.8)
y = np.cos(7*np.pi*1.1*t) + 3*np.sin(0.2*np.pi*2.8*t+1) + \
0.2*np.sin(8*np.pi*2.7*t) + 1*np.sin(2*np.pi*t + 2.1) + \
0.1*np.sin(0.2*np.pi*0.45*t+1.4)
z = x*np.exp(y*1j)
z_freq,z_fft = fourier(t,z)
plt.clf()
plt.figure(figsize=(8,12))
plt.subplot(4,1,1) # original signal
plt.plot(t,np.absolute(z))
plt.subplot(4,1,2) # fourier transform
plt.semilogy(sorted(z_freq),[b for (a,b) in sorted(zip(z_freq,np.absolute(z_fft)/nsamples))])
# filtering
plt.subplot(4,1,3)
idx = np.where(np.abs(z_freq)>2.0)
z_fft[idx]=0
z_filter = np.fft.ifft(z_fft)
plt.plot(t,np.real(z_filter))
z_freq,z_fft = fourier(t,z_filter)
plt.subplot(4,1,4)
plt.semilogy(sorted(z_freq),[b for (a,b) in sorted(zip(z_freq,np.absolute(z_fft)/nsamples))])
plt.show()
以下是翻译的结果:
其生成的图像如下所示:汉宁窗口进行滤波前后的信号时域和频域