バンドパスフィルタ
Pythonで音声信号処理(2011/05/14)
ハイパスフィルタ(2011/10/29)の続き。今回は、バンドパスフィルタを実験します。バンドパスフィルタは、エッジ周波数を2つ指定します。ある周波数からある周波数までの領域を通すようなフィルタです。式で書くと
となります。これを逆フーリエ変換してフィルタ係数b(i)を求めると、
となります。LPF、HPFと同様にb(i)は無限個のフィルタ係数を持つため窓関数をかけて有限で打ち切ります。
LPF、HPFのプログラムとほとんど同じなので差分のみ書きます。これだけでは動きません。コード全体は、ローパスフィルタ(2011/10/28)を参照のこと。
def createBPF(fe1, fe2, delta): """バンドパスフィルタを設計、fe1:エッジ周波数(低)、fe2:エッジ周波数(高) delta:遷移帯域幅""" # 遷移帯域幅を満たすフィルタ係数の数を計算 # N+1が奇数になるように調整が必要 N = round(3.1 / delta) - 1 if N + 1 % 2 == 0: N += 1 N = int(N) # フィルタ係数を求める b = [] for i in range(-N/2, N/2 + 1): b.append(2 * fe2 * sinc(2 * math.pi * fe2 * i) - 2 * fe1 * sinc(2 * math.pi * fe1 * i)) # ハニング窓をかける(窓関数法) hanningWindow = np.hanning(N + 1) for i in range(len(b)): b[i] *= hanningWindow[i] return b # BPFの設計 fe1 = 1000.0 / fs fe2 = 3000.0 / fs b = createBPF(fe1, fe2, delta) # フィルタをかける y = fir(x, b)
結果は、
となります。上がb(i)で下がB(f)です。B(f)を見るとエッジ周波数fe1の1000Hzからfe2の3000Hzまでの領域は1を掛けるのでそのまま通るけど、それ以外の領域は0を掛けるため0に減衰します。ためしに、ホワイトノイズに上のBPFを適用してみました。結果は、
となります。次、バンドストップフィルタいきます。