本記事では、PythonでFIRフィルタを実装します。
目次
FIRフィルタの構成
FIRフィルタは次式で定義されます。
$$y[n] = \sum_{i=0}^N b_i x[n-i]$$
ここで、\(b_i\)はi番目のフィルタ係数を表します。
FIRフィルタは大きく分けて2つの実装方法があります。
直接型
直接型は次の図のように、定義式をそのまま実装した形です。

転置型
転置型はz変換の線形性より定数倍の乗算と遅延は入れ替えても問題ないので、次のような形で実装されることもあります。

FIRフィルタの実装
import numpy as np
class Fir():
def __init__(self, coeffs):
self.n_taps = len(coeffs)
self.state = np.zeros(self.n_taps, dtype=float)
self.coeffs = np.array(coeffs)
def process(self, input_signal):
output = np.zeros_like(input_signal, dtype=float)
for i_sample in range(len(input_signal)):
# Shift state and insert new sample
self.state[1:] = self.state[:-1]
self.state[0] = input_signal[i_sample]
# Compute FIR filter output
output[i_sample] = np.dot(self.state, self.coeffs)
return output
if __name__ == "__main__":
import matplotlib.pyplot as plt
coeffs = [0.2, 0.2, 0.2]
fir_filter = Fir(coeffs=coeffs)
input_signal = np.array([1, 0, 0, 0, 0], dtype=float)
output_signal = fir_filter.process(input_signal)
plt.stem(output_signal)
plt.show()
テスト
上記のコードを実行すると、以下のような結果が得られます。
ここで、入力信号は単位インパルス信号として、[1, 0, 0, 0, 0]を入力として与えています。ここで、FIRフィルタの定義式および性質より単位インパルス応答は、フィルタ係数を出力します。
実際に実行してみると以下のような結果が得られます。

まとめ
本記事では、FIRフィルタの実装を行いました。また、その実装したものに単位インパルス信号を入力して応答を確かめました。
コメント