Respons frekuensi untuk filter yang dirancang menggunakan
fungsi mentega adalah:
Tetapi tidak ada alasan untuk membatasi filter ke desain filter monotonik konstan. Jika Anda menginginkan atenuasi yang lebih tinggi di pita transisi stopband dan curam, ada opsi lain. Untuk informasi lebih lanjut tentang menentukan filter menggunakan iirdesing lihat ini . Seperti yang ditunjukkan oleh plot respons frekuensi untuk desain mentega frekuensi cutoff (-3dB point) jauh dari tujuan. Ini dapat dikurangi dengan pengambilan sampel sebelum disaring (fungsi desain akan mengalami kesulitan dengan filter yang sempit, 2% dari bandwidth). Mari kita lihat penyaringan laju sampel asli dengan cutoff yang ditentukan.
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')
Seperti yang disebutkan, karena kami mencoba memfilter persentase kecil dari bandwidth, filter tidak akan memiliki cutoff yang tajam. Dalam hal ini, filter lowpass, kita dapat mengurangi bandwidth untuk mendapatkan filter yang terlihat lebih baik. Fungsi resample python / scipy.signal dapat digunakan untuk mengurangi bandwidth.
Perhatikan fungsi resample akan melakukan penyaringan untuk mencegah alias. Prefilter juga dapat dibuat (untuk mengurangi alias) dan dalam hal ini kita bisa dengan sederhana melakukan resample sebanyak 100 dan dilakukan , tetapi pertanyaannya adalah tentang membuat filter. Untuk contoh ini, kami akan menurunkan sampel sebanyak 25 dan membuat filter baru
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Jika kami memperbarui parameter desain untuk filter FIR, respons yang baru adalah.
# 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)
Filter yang beroperasi pada data downsampled memiliki respons yang lebih baik. Manfaat lain menggunakan filter FIR adalah bahwa Anda akan memiliki respons fase linier.