scipyライブラリを使用して、signal.firwin関数によるFIRフィルタ係数を作成します。FIRフィルタ係数はファイル化して、「C#言語によるFIRディジタルフィルタの作成」でFIRフィルタ係数として入力し、wavファイルが作成できるようにします。

FIRフィルタ係数作成プログラムの作成

signal.firwin関数を使って、ローパスフィルタ、ハイパスフィルタ、バンドパスフィルタ、バンドストップフィルタのFIRフィルタ係数を作成し、signal.freqz関数を使って、それぞれのフィルタ係数の周波数領域を表示します。なお作成したFIRフィルタ係数はファイルに保存します。なお、カットオフ周波数は750Hz,バンド幅は750Hz-3kHz、タップ数は255、サンプリング周波数は44.1kHzとします。

firwintest.py

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

fs = 44100
nyq = fs / 2.0  # ナイキスト周波数

# フィルタの設計
# ナイキスト周波数が1になるように正規化
fe1 = 750.0 / nyq       # カットオフ周波数1
fe2 = 3000.0 / nyq      # カットオフ周波数2
numtaps = 255           # フィルタ係数(タップ)の数(要奇数)

# b = signal.firwin(numtaps, fe1)                         # Low-pass
#b = signal.firwin(numtaps, fe2, pass_zero=False)        # High-pass
#b = signal.firwin(numtaps, [fe1, fe2], pass_zero=False) # Band-pass
b = signal.firwin(numtaps, [fe1, fe2])                  # Band-stop

# ファイル係数の保存
np.savetxt("parmBS750-3000", b, fmt='% 7f')

w, h = signal.freqz(b)

plt.figure(figsize=(12, 5))  # (width, height)
plt.title('Digital filter frequency response')
plt.xscale("log")

a = 20 * np.log10(abs(h));
f = w / (2 * np.pi) * fs
plt.plot(f, a  )
plt.title('Digital filter frequency response')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [dB]')
plt.margins(0, 0.1)
plt.xlim(10, 44100)
plt.ylim([-15,15])
plt.grid(which='both', axis='both')
plt.show()

FIRフィルタ係数作成プログラムの実行

次のコマンドでFIRフィルタ係数作成プログラムを実行します。現状、ローパスフィルタ、ハイパスフィルタ、バンドパスフィルタ、バンドストップフィルタのsignal.firwin関数のコメントをプログラムの実行ごとにそれぞれ外し、作成したFIRフィルタ係数の保存ファイル名を「parmLP750」、「parmHP750」、「parmBP750-3000」、「parmBS750-3000」とします。

$ firwintest.py

ローパスフィルタ、ハイパスフィルタ、バンドパスフィルタ、バンドストップフィルタのFIRフィルタ係数の内容とフィルタ係数の周波数領域を次に示します。

ローパスフィルタ:フィルタ係数「parmLP750」

 0.000169
 0.000158
 0.000146
 0.000132
 0.000116
 0.000099
 0.000080
 0.000059
 ・・・          
 ・・・          
 0.000059
 0.000080
 0.000099
 0.000116
 0.000132
 0.000146
 0.000158
 0.000169

ローパスフィルタ係数の周波数領域

ハイパスフィルタ:フィルタ係数「parmHP750」

 0.000154
 0.000088
 0.000004
-0.000082
-0.000158
-0.000208
-0.000222
-0.000197
 ・・・          
 ・・・          
-0.000197
-0.000222
-0.000208
-0.000158
-0.000082
 0.000004
 0.000088
 0.000154

ハイパスフィルタ係数の周波数領域

バンドパスフィルタ:フィルタ係数「parmBP750-3000」

-0.000323
-0.000246
-0.000150
-0.000049
 0.000041
 0.000109
 0.000143
 0.000139
 ・・・          
 ・・・          
 0.000139
 0.000143
 0.000109
 0.000041
-0.000049
-0.000150
-0.000246
-0.000323

バンドパスフィルタ係数の周波数領域

バンドストップフィルタ:フィルタ係数「parmBS750-3000」

 0.000324
 0.000247
 0.000150
 0.000049
-0.000042
-0.000109
-0.000143
-0.000139
 ・・・          
 ・・・          
-0.000139
-0.000143
-0.000109
-0.000042
 0.000049
 0.000150
 0.000247
 0.000324

バンドストップフィルタ係数の周波数領域