バター
関数を使用して設計されたフィルターの周波数応答は次のとおりです。
ただし、フィルターを一定の単調フィルター設計に制限する理由はありません。遮断帯域とより急峻な遷移帯域でより高い減衰を望む場合、他のオプションが存在します。iirdesingを使用してフィルターを指定する方法の詳細については、こちらを参照してください。バター設計の周波数応答プロットが示すように、カットオフ周波数(-3dBポイント)は目標からはほど遠いです。これは、フィルタリングの前にダウンサンプリングすることで軽減できます(帯域幅の2%のこのような狭いフィルターでは、設計機能に困難な時間がかかります)。カットオフが指定された元のサンプルレートのフィルタリングを見てみましょう。
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')
前述したように、帯域幅のこのような小さな割合をフィルター処理しようとしているため、フィルターにはシャープなカットオフがありません。この場合、ローパスフィルターでは、帯域幅を削減して見た目の良いフィルターを得ることができます。python / scipy.signal resample関数を使用して、帯域幅を削減できます。
resample関数は、エイリアスを防ぐためにフィルタリングを実行します。事前フィルタリングは(エイリアスを減らすために)実行することもできます。この場合、100だけリサンプリングして完了できますが、フィルターの作成について質問されました。この例では、25ダウンサンプリングし、新しいフィルターを作成します
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
FIRフィルターの設計パラメーターを更新すると、新しい応答が得られます。
# 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)
ダウンサンプリングされたデータで動作するフィルターは、より良い応答を示します。FIRフィルターを使用するもう1つの利点は、線形位相応答が得られることです。