Tereyağı
işlevi kullanılarak tasarlanan filtre için frekans yanıtı :
Ancak, filtreyi sabit bir monotonik filtre tasarımıyla sınırlamak için bir neden yoktur. Stop bandında ve daha dik geçiş bandında daha yüksek bir zayıflama istiyorsanız, başka seçenekler de vardır. Kullanarak bir filtre belirtmeye ilişkin daha fazla bilgi için iirdesing bkz bu . Tereyağı tasarımı için frekans tepki çizimlerinde gösterildiği gibi , kesme frekansı (-3dB noktası) hedeften uzaktır. Bu, filtrelemeden önce aşağı örnekleme ile hafifletilebilir (tasarım işlevleri, böyle dar bir filtreyle, bant genişliğinin% 2'si ile zor bir zaman geçirecektir). Orijinal numune hızını belirtilen kesim ile filtrelemeye bakalım.
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')
Belirtildiği gibi, bant genişliğinin bu kadar küçük bir yüzdesini filtrelemeye çalıştığımız için filtrenin keskin bir kesimi olmayacaktır. Bu durumda, düşük geçiş filtresi, daha iyi görünümlü bir filtre elde etmek için bant genişliğini azaltabiliriz. Bant genişliğini azaltmak için python / scipy.signal resample işlevi kullanılabilir.
Yeniden örnekleme işlevinin, örtüşme önlemek için filtreleme yapacağını unutmayın. Ön filtreleme de yapılabilir (takma adı azaltmak için) ve bu durumda 100 ile yeniden örnekleyebilir ve yapılabiliriz , ancak filtre oluşturmakla ilgili soru soruldu. Bu örnek için 25'e kadar örnek atarız ve yeni bir filtre oluştururuz
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
FIR filtresinin tasarım parametrelerini güncellersek yeni yanıt gelir.
# 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)
Aşağı örneklenmiş veriler üzerinde çalışan filtrenin daha iyi bir yanıtı vardır. FIR filtresi kullanmanın bir diğer yararı da doğrusal faz tepkisine sahip olmanızdır.