У меня есть сложный сигнал, который я могу видеть в пространстве Фурье и хотел бы фильтровать некоторые частоты, которых я не желаю. Я читал в Интернете, что я должен применить окно Ханнинга, прежде чем принимать преобразование Фурье, чтобы избежать утечки.Восстанавливающий сигнал после фильтра Фурье с окном Ханнинга
Следовательно, то, что я делаю, как видно из приведенного ниже кода, заключается в том, чтобы применить окно Ханнинга к моим данным, а затем принять его преобразование. В качестве теста я хотел посмотреть, не фильтрую ли я что-нибудь, могу ли я вернуть исходный сигнал. Однако сигнал по краям достиг нулевого уровня.
Теперь я понимаю, что это происходит из-за того, что оконный фильтр Ханнинга также заканчивается на нуле. В этом случае, как я могу применить окно Ханнинга, перейдите в частотный домен и вернитесь в мой временной домен с восстановленным сигналом? Если мой сигнал достигает нуля на концах, когда я пытаюсь фильтровать частоты, которые я желаю, результат во временной области будет по-прежнему идти к нулю по краям.
Что мне не хватает/не работает в моем методе? Спасибо за любую помощь!
Вот пример кода, что я делаю:
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()
И образ, который выходит из него следующий: Real space and Frequency space of signal before and after filtering with Hanning window
Обычно фильтрация в частотной области осуществляется с использованием перекрывающихся блоков и либо [сложение с перекрытием] (https://en.wikipedia.org/wiki/Overlap-add_method) или [перекрытие сохранить] (HTTPS://en.wikipedia.org/wiki/Overlap-save_method) для линейной свертки. –