filtr dolnoprzepustowy i FFT dla początkujących z Pythonem

23

Jestem nowy w przetwarzaniu sygnałów, a zwłaszcza w FFT, dlatego nie jestem pewien, czy robię tutaj właściwe rzeczy, i jestem nieco mylony z wynikiem.

Mam dyskretną funkcję rzeczywistą (dane pomiarowe) i chcę ustawić na niej filtr dolnoprzepustowy. Wybranym narzędziem jest Python z pakietem numpy. Postępuję zgodnie z tą procedurą:

  • obliczyć fft mojej funkcji
  • odciąć wysokie częstotliwości
  • wykonaj odwrotną fft

Oto kod, którego używam:

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)

Czy to jest poprawna procedura? Wynik inversezawiera złożone wartości, które mnie dezorientują.

Do B.
źródło
1
Kiedy uczyłem się FFT, ten post na blogu był dla mnie bardzo pomocny. glowingpython.blogspot.com/2011/08/…
David Poole

Odpowiedzi:

23

Oczekiwany jest fakt, że wynik jest złożony. Chcę wskazać kilka rzeczy:

Stosujesz filtr danych w dziedzinie częstotliwości w ścianie z cegły, próbując wyzerować wszystkie wyjścia FFT, które odpowiadają częstotliwości większej niż 0,005 Hz, a następnie przekształcić odwrotnie, aby ponownie uzyskać sygnał w dziedzinie czasu. Aby wynik był prawdziwy, dane wejściowe do odwrotnej FFT muszą być sprzężone symetrycznie . Oznacza to, że dla długości - FFT,N.

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

X[k]=X[N.-k],k=1,2),,N.2)(N.orere)
  • Zauważ, że dla parzystej, X [ 0 ] i X [ NN.X[0]ogólnie nie są równe, ale oba są prawdziwe. Dla nieparzystychN,X[0]musi być prawdziwe.X[N.2)]N.X[0]

Widzę, że próbowałeś zrobić coś takiego w powyższym kodzie, ale nie jest to całkiem poprawne. Jeśli wymusisz powyższy warunek na sygnale, który przekazujesz do odwrotnej FFT, powinieneś uzyskać prawdziwy sygnał.

sjando(x)sjando

sjando

wykres funkcji sinc

sjandosjando

Istnieją bardziej praktyczne sposoby stosowania filtrów dolnoprzepustowych, zarówno w dziedzinie czasu, jak i częstotliwości. Skończone odpowiedzi impulsowe i nieskończone filtry odpowiedzi impulsowej można zastosować bezpośrednio przy użyciu ich reprezentacji równania różnicowego . Lub, jeśli filtr ma wystarczająco długo-odpowiedź impulsową, można często uzyskać korzyści wydajności przy użyciu szybkich splatania techniki oparte na FFT (stosując filtr przez mnożenie w dziedzinie częstotliwości zamiast splotu w dziedzinie czasu), tak jak nakładanie z metody zapisywania i nakładania-dodawania .

Jason R.
źródło
Funkcja sinc jest jednak idealna do filtrowania, nie? Do tego dążą wszystkie inne filtry, ale nie osiągają. Jest to złe w przypadku przetwarzania obrazu, ponieważ obrazy nie są najpierw wygładzane, więc wywołuje dzwonienie, które wygląda okropnie, ale w przypadku audio lub innych sygnałów, które były filtrowane przed próbkowaniem, czy nie jest to najlepszy filtr, jaki można uzyskać?
endolith
1
Tak, mój wynik nie był sprzężony symetryczny. Poprawiłem kod, teraz wszystko działa dobrze. Dziękuję Ci!
Do B
3
@endolith - Sinc to idealny interpolator do potwierdzania rodzajów interpolacji, ale może być daleki od idealnego jako filtr do większości popularnych wymagań dotyczących filtrów, takich jak płaskość odpowiedzi pasma przepustowego, odrzucanie pasma zatrzymania itp.
hotpaw2
+1 za dobre wyjaśnienie „dlaczego ludzie nie wdrażają filtra tak, jak robi to PO”
Sibbs Gambling 13.08.13
Musisz użyć okienka z okienkiem. Jeśli nie masz ograniczeń czasowych, jest to optymalny filtr, znacznie lepszy niż Czebiczew.