マルチバンド処理用のフィルタバンク実装でバターワースフィルタによるハイパスフィルタを使おうとすると,7次くらいから周波数応答が不安定になりました.
ハイパスフィルタ
周波数応答をプロット してみると,scipy.signal.butterworth
のハイパスフィルタは7次くらいから低域の位相が不安定になっています.
おそらくフィルタ係数の量子化誤差などが関係していると考えられます。
カットオフ周波数を低くしても,それでも9次くらいから位相が歪んでいます.
ローパスフィルタ
一方、ローパスフィルタのほうが比較的高次でも振幅・位相に歪みは目視では確認できません.
補完フィルタ(7次,8バンド)
高次のハイパスフィルタの位相歪みは、例えば補完フィルタできいてきます。
この条件だと,ハイパスフィルタの位相歪みが原因で、マルチバンド処理用の回路全体の振幅特性がフラットになっていません。
検証用スクリプト
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)