FFT фильтр против lfilter в питоне - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть некоторые проблемы при применении полосового фильтра для сигнала в 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). Или я все понял неправильно.

С уважением, Андерс

Над кодом:

enter image description here

По сравнению с Cool Edit:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 08 ноября 2011

Небольшие различия могут быть объяснены библиотеками, использующими разные алгоритмы, которые накапливают ошибку немного по-разному.

Например, если вы вычисляете ДПФ с использованием БПФ с основанием-2, БПФ с разделением-основанием и обычным БПФ, результаты будут немного отличаться. На самом деле обычный DFT имеет худшую точность, чем все приличные реализации FFT, потому что он использует гораздо больше операций с плавающей запятой и, таким образом, накапливает больше ошибок.

Может ли это объяснить близкие (но не идентичные) результаты, которые вы видите?

...