SciPy で Parks-McClellan 最適 FIR フィルタ
SciPy での Parks-McClellan 最適 FIR フィルタについてメモ。
remez では Parks-McClellan アルゴリズムによる FIR フィルタの設計が行なえます。 Parks-McClellan アルゴリズムは Remez 交換アルゴリズムと Chebyshev 近似理論により、希望の周波数応答と実際の周波数応答との最適近似をもつフィルタを設計します。 remez によるローパスフィルタの例を以下に示します。
import numpy as np from scipy import signal import matplotlib.pyplot as plt # 時系列のサンプルデータ作成 n = 512 # データ数 dt = 0.01 # サンプリング間隔 f = 1 # 周波数 fn = 1/(2*dt) # ナイキスト周波数 t = np.linspace(1, n, n)*dt-dt y = np.sin(2*np.pi*f*t)+0.5*np.random.randn(t.size) freq = [0, 2, 3, fn] N = 200 taps = signal.remez(N, freq, [1, 0], Hz=2*fn) filtered = signal.lfilter(taps, 1, y) delay = (N-1)/2*dt plt.figure(figsize=(12,9)) plt.plot(t, y) plt.plot(t-delay, filtered, "r", linewidth=2, label="remez") plt.xlim(0, 4) plt.legend(loc="upper right") plt.xlabel("Time [s]") plt.ylabel("Amplitude") plt.show()
