Python ile yeni başlayanlar için düşük geçişli filtre ve FFT


23

İşleme ve özellikle de FFT'ye yeni bir yönelttim, bu yüzden burada doğru olanı yaptığımdan ve sonuçtan biraz karıştığımdan emin değilim.

Ayrık bir gerçek fonksiyonum (ölçüm verileri) var ve bunun üzerine düşük geçişli bir filtre kurmak istiyorum. Seçim aracı numpy paketi ile Python'dur. Bu prosedürü takip ediyorum:

  • fonksiyonumun fft değerini hesapla
  • yüksek frekansları kesmek
  • ters fft yapmak

İşte kullanıyorum kodu:

import numpy as np
sampling_length = 15.0*60.0 # measured every 15 minutes
Fs = 1.0/sampling_length
ls = range(len(data)) # data contains the function
freq = np.fft.fftfreq(len(data), d = sampling_length)
fft = np.fft.fft(data)
x = freq[:len(data)/2] 
for i in range(len(x)):
if x[i] > 0.005: # cut off all frequencies higher than 0.005
    fft[i] = 0.0
    fft[len(data)/2 + i] = 0.0
inverse = np.fft.ifft(fft)

Bu doğru prosedür mü? Sonuç inversebeni şaşırtan karmaşık değerler içeriyor.


1
FFT öğrenirken, bu blog gönderisini çok faydalı buldum. glowingpython.blogspot.com/2011/08/…
David Poole

Yanıtlar:


23

Sonucun karmaşık olması beklenir. Birkaç şeye dikkat çekmek istiyorum:

Verilere bir tuğla duvar frekans alanı filtresi uyguluyorsunuz, 0.005 Hz'den daha büyük bir frekansa karşılık gelen tüm FFT çıkışlarını sıfırlamayı deniyorsunuz, sonra tekrar zaman alanı sinyali almak için ters çevriliyor. Sonucun gerçek olması için, ters FFT'ye giriş konjuge simetrik olmalıdır . Bunun anlamı, bir uzunluk için - FFT,N-

X[k]=X*[N--k],k=1,2,...,N-2-1(N-even)

X[k]=X*[N--k],k=1,2,...,N-2(N-Odd)
  • Not bunun için da, ve genel olarak eşit, ancak her ikisi de gerçek değildir. Tek , gerçek olmalıdır.N-X [ NX[0]NX[0]X[N-2]N-X[0]

Yukarıdaki kodunuzda böyle bir şey yapmaya çalıştığınızı görüyorum, ancak bu doğru değil. Yukarıdaki koşulu ters FFT'ye ilettiğiniz sinyale zorlarsanız, gerçek bir sinyal almalısınız.

İkinci noktam daha çok felsefi bir konu: Yaptığınız şey, istemediğiniz frekans-alan içeriğini bastırmak için işe yarayacak. Bununla birlikte, bu tipik olarak bir alçak geçiren filtrenin pratikte uygulanma şekli değildir. Daha önce de belirttiğim gibi, yaptığınız şey aslında tuğla duvarlı (yani mükemmel dikdörtgen şeklinde) büyüklük tepkisine sahip bir filtre uygulamak. Böyle bir filtrenin darbe tepkisi, bir iç şekline sahiptir. Frekans domeninde çarpma, zaman domeninde (DFT, dairesel) konvolüsyona eşdeğer olduğu için, bu işlem, zaman domen sinyalinin bir fonksiyonuyla çevrilmesine eşdeğerdir .s i n csbennc(x)sbennc

Bu neden bir problem? işlevinin zaman alanında nasıl göründüğünü hatırlayın (Wikipedia'dan utanmadan ödünç alınan resmin altındakiler):sbennc

sinc fonksiyonunun arsa

fonksiyon zaman alanındaki çok geniş desteğe sahip; zaman içinde ana lobundan uzaklaştıkça yavaş yavaş çürür. Birçok uygulama için bu arzu edilen bir özellik değildir; Bir sinyali bir , yavaş yavaş azalan sidelob'lerin etkileri, genellikle filtrelenmiş çıkış sinyalinin zaman-alanı formunda açıkça görülecektir. Bu tür bir etki genellikle zil sesi olarak adlandırılır . Ne yaptığınızı biliyorsanız, bu tür filtrelemenin uygun olabileceği bazı durumlar vardır, ancak genel durumda, istediğiniz şey bu değildir.s ı n Csbenncsbennc

Hem zaman hem de frekans alanlarında, düşük geçişli filtreleri uygulamanın daha pratik yolları vardır. Sonlu dürtü yanıtı ve sonsuz dürtü yanıt filtreleri, fark denklem gösterimleri kullanılarak doğrudan uygulanabilir . Filtre yeterince uzun dürtü yanıtı vardır Ya da, genellikle kullanarak performans yararları elde etmek için hızlı bir kıvrım gibi, FFT dayalı teknikleri (yerine zaman alanında konvolüsyon frekans alanında çarparak filtre uygulama) Üst üste binme- kaydet ve üst üste bindirme yöntemleri.


Sinc işlevi ideal filtrelemedir, değil mi? Diğer tüm filtrelerin hedeflediği ancak başarmadığı şey budur. Görüntü işleme için kötü çünkü görüntüler ilk olarak antialiased değil, bu yüzden korkunç görünen zil sesi oluşturuyor, ancak örneklemeden önce antialias filtrelenmiş ses veya diğer sinyaller için, alabileceğiniz en iyi filtre değil mi?
Endolith

1
Evet, sonucum eşlenik simetrik değildi. Kodu düzelttim, şimdi her şey iyi çalışıyor. Teşekkür ederim!
B

3
@endolith - bir Sinc, belirli enterpolasyon türleri için ideal bir enterpolatördür, ancak geçiş bandının tepkisi, stop band reddi ve benzeri gibi çoğu genel filtre gereksinimi için bir filtre olarak ideal olabilir
hotpaw2

"Neden insanlar
PO'yu

Pencereli bir samim kullanmak zorundasın. Zaman kısıtlı değilseniz, bu en uygun filtredir, Chebichev'den çok daha iyidir.
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.