La risposta in frequenza per il filtro progettato utilizzando la
funzione burro è:
Ma non c'è motivo di limitare il filtro a un design di filtro monotonico costante. Se si desidera una maggiore attenuazione nella banda di arresto e nella banda di transizione più ripida, esistono altre opzioni. Per ulteriori informazioni sulla specifica di un filtro tramite iirdesing, consultare questo . Come mostrato dai grafici di risposta in frequenza per la progettazione del burro , la frequenza di taglio (punto -3 dB) è lontana dall'obiettivo. Questo può essere alleviato dal down-sampling prima del filtraggio (le funzioni di progettazione avranno un momento difficile con un filtro così stretto, il 2% della larghezza di banda). Vediamo come filtrare la frequenza di campionamento originale con il valore soglia specificato.
import numpy as np
from scipy import signal
from matplotlib import pyplot as plt
from scipy.signal import fir_filter_design as ffd
from scipy.signal import filter_design as ifd
# setup some of the required parameters
Fs = 1e9 # sample-rate defined in the question, down-sampled
# remez (fir) design arguements
Fpass = 10e6 # passband edge
Fstop = 11.1e6 # stopband edge, transition band 100kHz
Wp = Fpass/(Fs) # pass normalized frequency
Ws = Fstop/(Fs) # stop normalized frequency
# iirdesign agruements
Wip = (Fpass)/(Fs/2)
Wis = (Fstop+1e6)/(Fs/2)
Rp = 1 # passband ripple
As = 42 # stopband attenuation
# Create a FIR filter, the remez function takes a list of
# "bands" and the amplitude for each band.
taps = 4096
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
# The iirdesign takes passband, stopband, passband ripple,
# and stop attenuation.
bc, ac = ifd.iirdesign(Wip, Wis, Rp, As, ftype='ellip')
bb, ab = ifd.iirdesign(Wip, Wis, Rp, As, ftype='cheby2')
Come accennato, poiché stiamo cercando di filtrare una percentuale così piccola della larghezza di banda, il filtro non avrà un netto taglio. In questo caso, filtro passa-basso, possiamo ridurre la larghezza di banda per ottenere un filtro più bello. La funzione di ricampionamento python / scipy.signal può essere utilizzata per ridurre la larghezza di banda.
Si noti che la funzione di ricampionamento eseguirà il filtro per impedire l'aliasing. Il prefiltro può anche essere eseguito (per ridurre l'aliasing) e in questo caso potremmo semplicemente ricampionare per 100 ed essere fatto , ma la domanda posta sulla creazione di filtri. Per questo esempio, eseguiremo un downsampling di 25 e creeremo un nuovo filtro
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Se aggiorniamo i parametri di progettazione per il filtro FIR la nuova risposta è.
# Down sampled version, create new filter and plot spectrum
R = 25. # how much to down sample by
Fsr = Fs/R # down-sampled sample rate
Fstop = 11.1e6 # modified stopband
Wp = Fpass/(Fsr) # pass normalized frequency
Ws = Fstop/(Fsr) # stop normalized frequency
taps = 256
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
Il filtro che opera sui dati sottocampionati ha una risposta migliore. Un altro vantaggio dell'utilizzo di un filtro FIR è che si avrà una risposta di fase lineare.