У меня есть некоторые проблемы при применении полосового фильтра для сигнала в Python. Перепробовал следующие вещи:
- Сделайте окно окна "от руки", то есть сделайте БПФ на сигнале, примените
фильтр с окном окна и сделать IFFT, чтобы вернуться к времени
домен.
- Используйте модуль scipy.signal, где я использую firwin2 для создания
фильтр, а затем lfilter к фильтрации.
Кроме того, я провел ту же фильтрацию в аудиопрограмме Cool Edit и сравнил результат двух вышеупомянутых тестов.
Как видно (я новый пользователь, поэтому не могу опубликовать свой png рис), результаты FFT и scipy.signal очень разные. Если сравнивать с результатом от Cool edit, БПФ близко, но не идентично. Код как ниже:
# imports
from pylab import *
import os
import scipy.signal as signal
# load data
tr=loadtxt('tr6516.txt',skiprows=1)
sr = 500 # [samples/s]
nf = sr/2.0 # Nyquist frequence
W = 512 # Window widht for filtering
N=float(8192) # Fourier settings
Ns = len(tr[:,0]) # Total number of samples
# Create inpulse responce from the filter
fv=12.25
w =0.5
r =0.5*w
Hz=[0, fv-w-r, fv-w, fv+w, fv+w+r, nf]
ff=[0, 0, 1, 1, 0, 0]
b = signal.firwin2(W,Hz,ff,nfreqs=N+1,nyq=nf)
SigFilter = signal.lfilter(b, 1, tr[:,1])
# Fourier transform
X1 = fft(tr[:,1],n=int(N))
X1 = fftshift(X1)
F1 = arange(-N/2.0,N/2.0)/N*sr
# Filter data
ff=[0,1,1,0]
fv=12.25
w =0.5
r =0.5*w
Hz=[fv-w-r,fv-w,fv+w,fv+w+r]
k1=interp(-F1,Hz,ff)+interp(F1,Hz,ff)
X1_f=X1*k1
X1_f=ifftshift(X1_f)
x1_f=ifft(X1_f,n=int(N))
Может кто-нибудь объяснить мне, почему эта разница? Фильтрация в редактировании Cool была выполнена с использованием тех же настроек, что и в scipy.signal (окно Hanning, ширина окна 512). Или я все понял неправильно.
С уважением,
Андерс
Над кодом:
По сравнению с Cool Edit: