Wizard Notes

Pythonを使った音楽信号分析の技術録、作曲活動に関する雑記

高次のバターワースフィルタ(ハイパス)の不安定性について scipy.signal.butterworth

マルチバンド処理用のフィルタバンク実装でバターワースフィルタによるハイパスフィルタを使おうとすると,7次くらいから周波数応答が不安定になりました.

ハイパスフィルタ

f:id:Kurene:20211009132213p:plain:w500

周波数応答をプロット してみると,scipy.signal.butterworthのハイパスフィルタは7次くらいから低域の位相が不安定になっています.

おそらくフィルタ係数の量子化誤差などが関係していると考えられます。

カットオフ周波数を低くしても,それでも9次くらいから位相が歪んでいます.

f:id:Kurene:20211009133856p:plain

ローパスフィルタ

f:id:Kurene:20211009132249p:plain:w500

一方、ローパスフィルタのほうが比較的高次でも振幅・位相に歪みは目視では確認できません.

補完フィルタ(7次,8バンド)

f:id:Kurene:20211009133023p:plain:w500

高次のハイパスフィルタの位相歪みは、例えば補完フィルタできいてきます。

この条件だと,ハイパスフィルタの位相歪みが原因で、マルチバンド処理用の回路全体の振幅特性がフラットになっていません。

検証用スクリプト

import numpy as np
import scipy.signal

from bode_plot import bode_plot 


sr = 44100
order_list = [1, 3, 5, 7, 9, 11]
btype = "low"#'high' #

n_order = len(order_list)

b_list = [None]*n_order
a_list = [None]*n_order
h_list = [None]*n_order 
label_list = [None]*n_order


for k, order in enumerate(order_list):
    b, a = scipy.signal.butter(order, 0.1, btype=btype)
    w, h = scipy.signal.freqz(b, a, worN=2048)
    
    b_list[k] = b
    a_list[k] = a
    h_list[k] = h
    label_list[k] = f"Bw-{btype}-{order}"

bode_plot(w, h_list, sr=sr, labels=label_list, xscale="log")


np.set_printoptions(3, suppress=True)
for order, b, a in zip(order_list, b_list, a_list):
    print("order:", order)
    print("b", b)
    print("a", a)