Scipy.signal içinde filtre uygulama: Filtre mi yoksa filtre mi kullanıyorsunuz?


21

SO iş parçacığındafiltfilt yerine geri / ileri filtreleme yerine kullanmak için bir öneri gördümlfilter .

Birini diğer tekniğe karşı kullanma motivasyonu nedir?


Filtfilt daha yavaş
Aaron


1
@Aaron filtfiltaynı filtreyi iki defa ters yönlerde yapar, bu nedenle aynı lfilteryönde iki kez yapmaktan daha yavaş değildir , bu aynı frekans cevabını nasıl elde edeceğinizdir.
endolith

Evet demek istediğim buydu. İki kat daha yavaş.
Aaron

Bu konuda yeniyim ve filtre kullanmak için etrafa bakıyordum. @endolith, scipy.signal öğesinin orijinal sinyali kullandığını söyledi. Orijinal sinyalin ne anlama geldiğinden ve nasıl anladığımızdan emin değilim. Sistemime yüklediğim bir wav dosyasına sahibim, ancak bir numpy dizisine ve örneklem sayısına bölündüğü için orijinal sinyal olduğunu sanmıyorum. Biri yardım edebilirse lütfen. Teşekkür ederim!
Arunima Pathania

Yanıtlar:


30
  • filtfiltsıfır fazlı filtreleme olup, filtreyi filtreledikçe sinyali değiştirmez. Faz tüm frekanslarda sıfır olduğundan, aynı zamanda lineer fazdır. Zamanda geriye doğru filtrelemek, geleceği tahmin etmenizi gerektirir, bu nedenle "çevrimiçi" gerçek yaşam uygulamalarında, yalnızca sinyal kayıtlarının çevrimdışı işlenmesi için kullanılamaz.

  • lfilternedensel ileri-zaman filtrelemesidir, gerçek hayattaki elektronik filtreye benzer. Sıfır faz olamaz. Doğrusal faz (simetrik FIR) olabilir, ancak genellikle değildir. Genellikle farklı frekanslarda farklı miktarlarda gecikme ekler.

Bir örnek ve resim bunu açıkça ortaya koymalıdır. Filtrelerin frekans tepkisinin büyüklüğü aynı olsa da (üst sol ve sağ üst), sıfır faz düşük geçişi, yüksek frekans içeriği olmadan, orijinal sinyal ile aynı hizada olurken, minimum faz filtreleme sinyali nedensel bir şekilde geciktirir :

filtrasyon vs filtre

from __future__ import division, print_function
import numpy as np
from numpy.random import randn
from numpy.fft import rfft
from scipy import signal
import matplotlib.pyplot as plt

b, a = signal.butter(4, 0.03, analog=False)

# Show that frequency response is the same
impulse = np.zeros(1000)
impulse[500] = 1

# Applies filter forward and backward in time
imp_ff = signal.filtfilt(b, a, impulse)

# Applies filter forward in time twice (for same frequency response)
imp_lf = signal.lfilter(b, a, signal.lfilter(b, a, impulse))

plt.subplot(2, 2, 1)
plt.semilogx(20*np.log10(np.abs(rfft(imp_lf))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('lfilter')

plt.subplot(2, 2, 2)
plt.semilogx(20*np.log10(np.abs(rfft(imp_ff))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('filtfilt')

sig = np.cumsum(randn(800))  # Brownian noise
sig_ff = signal.filtfilt(b, a, sig)
sig_lf = signal.lfilter(b, a, signal.lfilter(b, a, sig))
plt.subplot(2, 1, 2)
plt.plot(sig, color='silver', label='Original')
plt.plot(sig_ff, color='#3465a4', label='filtfilt')
plt.plot(sig_lf, color='#cc0000', label='lfilter')
plt.grid(True, which='both')
plt.legend(loc="best")

4
lfiltermutlaka minimum faz olması gerekmez, filtre katsayılarına bağlı olarak herhangi bir şey olabilir, ancak her durumda nedenseldir , ki filtfiltbu değildir. Bu nedenle filtfilt, sıfır gecikme olan ve lfilterher zaman biraz gecikme ekleyen karşılaştırmanın sonucu tam olarak doğru değildir, çünkü her şeyden önce filtfiltnedensel değildir. Asıl mesele şu ki filtfilt, herhangi bir faz bozulmasına neden olmaz, oysa lfilter(doğrusal faz FIR filtresi olarak kullanılmadığı sürece, yani payda = 1 ile).
Matt L.

Ayrıca, N. sıradaki filtfiltfiltrelemenin, (2N-1) ile yapılan sıralamaya göre filtrelemeye karşılık geldiğine dikkat etmek önemlidir lfilter.
Thomas Arildsen

@ThomasArildsen Sadece 2N değil mi? Senaryoda gösterdiğim şey buydu
end

@ArunimaPathania Cevabım altında yorum yapmalısınız, soru altında değil. "Orijinal sinyal" sadece filtrelendiğiniz sinyal anlamına gelir. Ya ile filtre lfilterveya filtfilt. Gösterildiği gibi farklı davranıyorlar
endolith

7

Tarafından cevap @endolith tam ve doğru! Lütfen önce gönderisini, sonra da buna bir tane daha okuyun. Düşük itibarımdan dolayı @Thomas Arildsen ve @ endolith'in aşağıdakilerden elde edilen etkili filtre sırasını tartıştıkları yorumlarına cevap veremedim filtfilt:

  • lfilter Verilen filtreyi uygular ve Fourier uzayında ONCE filtre transfer fonksiyonunu uygulamak gibidir.

  • filtfiltaynı filtreyi iki kez uygulayın ve efekt, SQUARED filtre transfer fonksiyonunu uygulamak gibidir. scipy.signal.butterTransfer fonksiyonu ile Butterworth filtresi ( ) durumunda

G(n)=11ω2nwhere n is order of filter

etkili kazanç olacak

G,(n)fbenltfbenlt=G,(n)2=11-ω2n

2n2n-1

G,(n)fbenltfbenltG,(2n).

1
Lütfen yorumlarınızı cevap olarak eklememeye çalışın. Ancak, SE.DSP'ye hoş geldiniz ve benden bir +1 alabilirsiniz. Sanırım bu cevabı ekler ... en azından yorum yapmak için yeterli rep almaya çalışın! :-)
Peter K.

Bunun doğru olduğunu sanmıyorum. G (n), filtrenin genlik kazancıdır. Karmaşık aktarım işlevini basamaklandırırsanız 2n'ye kadar çalışacağını düşünüyorum.
Mike,

Bir 6. sıra Butterworth'un aynı G (x) değerini 2 x (3. dereceden Butterworth) kademeli olarak verdiğini ancak 3. derecenin kesilme frekansını 1.6 ile ölçeklendirdiğini hızlı bir simülasyonla onayladım. Sonuçlar, kesme frekansının ölçeklendirilmesi dışında aynıdır. Bu nedenle, sipariş 2n ile ölçeklenir, ancak geçiş yaptığınızda ve telafi edilmesi gerektiğinde geçiş bandının azalacağını unutmayın. Birisi teoriyi açıklamakta özgürsün ama ben gerçekten bütün matematiği geçmek istemiyorum.
Mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.