がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

scipy.signal.iirfilterを使ってIIRフィルタを設計する

前回はiirdesignメソッドで設計したがもう一つのほうのメソッドも紹介しておく。
前回の記事はこちら



gsmcustomeffects.hatenablog.com

scipy.signal.iirfilter

メソッドの引数はこのような感じ

  • scipy.signal.iirfilter(N, Wn, rp=None, rs=None, btype='band', analog=False, ftype='butter', output='ba', fs=None)

示す通り次数とフィルタの型を指定してIIR係数を計算する形である。

引数の簡単な説明

  • Nはフィルタ次数(高次にするほど急な特性を出せるが制約はある)
  • Wnがカットオフ周波数(バンドパスの場合[120,140]みたいにすると区間指定できる)
  • rp,rsはgain指定[dB]
  • btypeでフィルタの型を決めれる{‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’}
  • ftypeが特性(バタワース、チェビシェフなど)
  • outputが返り値の種類指定(ba,zpk,sos)

ソースコード

Scipyのバージョンは1.2以降を前提にしているので注意

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

fs =48000
bpfc1 = 100
order = 2
b, a = signal.iirfilter(order, bpfc1,btype='lowpass',rs = 40,rp = 1.0, analog=False, ftype='cheby1',output='ba',fs=fs)

fs, h = signal.freqz(b,a,fs=fs)

fig, ax1 = plt.subplots()
plt.grid(which="both")
ax1.set_title('Digital filter frequency response')
ax1.semilogx(fs, 20 * np.log10(abs(h)))
ax1.axis((10, 10000, -100, 10))
ax1.set_ylabel('Amplitude [dB]')
ax1.set_xlabel('Frequency [Hz]')

plt.show()

f:id:gsmcustomeffects:20190117004339p:plain
周波数応答