Der Frequenzgang für den mit der Butterfunktion ausgelegten Filter
beträgt:
Es gibt jedoch keinen Grund, den Filter auf einen konstanten monotonen Filteraufbau zu beschränken. Wenn Sie eine höhere Dämpfung im Sperrbereich und einen steileren Übergang wünschen, gibt es andere Möglichkeiten. Weitere Informationen zum Festlegen eines Filters mithilfe von iirdesing finden Sie hier . Wie aus den Frequenzgangdiagrammen für das Butterdesign hervorgeht , ist die Grenzfrequenz (-3 dB Punkt) weit vom Ziel entfernt. Dies kann durch Heruntertasten vor dem Filtern verringert werden (die Entwurfsfunktionen werden mit einem derart engen Filter, 2% der Bandbreite, eine schwierige Zeit haben). Betrachten wir das Filtern der ursprünglichen Samplerate mit dem angegebenen Cutoff.
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')
Da wir versuchen, einen so kleinen Prozentsatz der Bandbreite zu filtern, hat der Filter, wie erwähnt, keine scharfe Grenze. In diesem Fall, Tiefpassfilter, können wir die Bandbreite reduzieren, um einen besser aussehenden Filter zu erhalten. Mit der Resample-Funktion python / scipy.signal kann die Bandbreite reduziert werden.
Beachten Sie, dass die Resample-Funktion eine Filterung durchführt, um Aliasing zu verhindern. Das Vorfiltern kann auch durchgeführt werden (um das Aliasing zu reduzieren). In diesem Fall können Sie das Resampling einfach um 100 wiederholen und fertig , aber die Frage zum Erstellen von Filtern wird gestellt. In diesem Beispiel werden wir den Wert um 25 verringern und einen neuen Filter erstellen
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Wenn wir die Entwurfsparameter für den FIR-Filter aktualisieren, lautet die neue Antwort.
# 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)
Der Filter, der mit den heruntergerechneten Daten arbeitet, reagiert besser. Ein weiterer Vorteil der Verwendung eines FIR-Filters besteht darin, dass Sie eine lineare Phasenantwort haben.