filtro passa-basso e FFT per principianti con Python


23

Sono nuovo nell'elaborazione del segnale e specialmente in FFT, quindi non sono sicuro di fare la cosa giusta qui e sono un po 'confuso con il risultato.

Ho una funzione reale discreta (dati di misurazione) e voglio impostare un filtro passa basso su quello. Lo strumento preferito è Python con il pacchetto numpy. Seguo questa procedura:

  • calcola il fft della mia funzione
  • tagliare le alte frequenze
  • eseguire il fft inverso

Ecco il codice che sto usando:

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)

È questa la procedura corretta? Il risultato inversecontiene valori complessi, che mi confondono.


1
Quando stavo imparando FFT, ho trovato questo post sul blog molto utile. glowingpython.blogspot.com/2011/08/…
David Poole l'

Risposte:


23

È prevedibile che il risultato sia complesso. Voglio sottolineare un paio di cose:

Si sta applicando un filtro di dominio di frequenza a muro di mattoni ai dati, tentando di azzerare tutte le uscite FFT che corrispondono a una frequenza maggiore di 0,005 Hz, quindi di trasformare inversamente per ottenere di nuovo un segnale nel dominio del tempo. Affinché il risultato sia reale, l'ingresso dell'invertitore FFT deve essere coniugato simmetrico . Questo significa che per un length- FFT,N

X[K]=X*[N-K],K=1,2,...,N2-1(Neven)

X[K]=X*[N-K],K=1,2,...,N2(Nodd)
  • Si noti che per pari, X [ 0 ] e X [ NNX[0]non sono uguali in generale, ma sono entrambi reali. PerNdispari,X[0]deve essere reale.X[N2]NX[0]

Vedo che hai tentato di fare qualcosa del genere nel tuo codice sopra, ma non è del tutto corretto. Se imponi la condizione di cui sopra sul segnale che passi alla FFT inversa, allora dovresti ottenere un segnale reale.

Sionc(X)Sionc

Sionc

trama della funzione sinc

SioncSionc

Esistono mezzi più pratici per applicare i filtri passa-basso, sia nei domini di tempo che di frequenza. La risposta agli impulsi finiti e i filtri di risposta agli impulsi infiniti possono essere applicati direttamente usando la loro rappresentazione dell'equazione delle differenze . Oppure, se il tuo filtro ha una risposta all'impulso sufficientemente lunga, puoi spesso ottenere vantaggi prestazionali utilizzando tecniche di convoluzione rapida basate sulla FFT (applicando il filtro moltiplicando nel dominio della frequenza invece della convoluzione nel dominio del tempo), come la sovrapposizione- salvare e sovrapporre-aggiungere metodi.


La funzione sinc è il filtro ideale, no? Questo è ciò che tutti gli altri filtri mirano, ma non raggiungono. È dannoso per l'elaborazione delle immagini perché le immagini non sono antialiasing per prime, quindi produce uno squillo che sembra orribile, ma per i segnali audio o altri che sono stati filtrati antialias prima del campionamento, non è il miglior filtro che puoi ottenere?
endolito il

1
Sì, il mio risultato non è stato coniugato simmetrico. Ho corretto il codice, ora tutto funziona bene. Grazie!
Fino a B

3
@endolith - a Sinc è un interpolatore ideale per determinati tipi di interpolazione, ma può essere tutt'altro che ideale come filtro per la maggior parte dei requisiti di filtro comuni, come la planarità della risposta della banda passante, l'arresto del rifiuto della banda, ecc.
hotpaw2

+1 per la bella spiegazione sul "perché le persone non implementano il filtro come fa l'OP"
Sibbs Gambling

Devi usare un sinc finestra. Se non sei vincolato dal tempo, questo è il filtro ottimale, molto meglio di Chebichev.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.