読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



バンドパスフィルタ

音声信号処理

Pythonで音声信号処理(2011/05/14)

ハイパスフィルタ(2011/10/29)の続き。今回は、バンドパスフィルタを実験します。バンドパスフィルタは、エッジ周波数を2つ指定します。ある周波数からある周波数までの領域を通すようなフィルタです。式で書くと

f:id:aidiary:20111029223510p:plain

となります。これを逆フーリエ変換してフィルタ係数b(i)を求めると、

f:id:aidiary:20111029223709p:plain

となります。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)

結果は、

f:id:aidiary:20111029220425p:plain

となります。上がb(i)で下がB(f)です。B(f)を見るとエッジ周波数fe1の1000Hzからfe2の3000Hzまでの領域は1を掛けるのでそのまま通るけど、それ以外の領域は0を掛けるため0に減衰します。ためしに、ホワイトノイズに上のBPFを適用してみました。結果は、

f:id:aidiary:20111029220443p:plain

となります。次、バンドストップフィルタいきます。