1/12 オクターブバンド・フィルタ (9)

2016 年 3 月 30 日の記事 (→こちら) で検証したように、PSoC5LP の DFB (Digital Filter Block) のデータ RAM 容量 (128 ワード) の制限のため、一般的な IIR バイクアッド・フィルタを使用する場合には 1/12 オクターブバンド・フィルタ 8 バンド分 (IIR 2 次セクション 24 個分) が限界です。
この制限は、IIR 2 次セクションあたりフィルタ係数が 5 個必要であることに由来しています。2 次セクションあたりのフィルタ係数の数を減らすことができれば、実現可能なバンド数が増えることになります。
アナログのプロトタイプ・フィルタ特性をバタワースやチェビシェフなどの、(伝送零点を持たない) 全極型のタイプに選ぶと、それを双 1 次 s-z 変換して得られたディジタル・フィルタの特性も (ゼロ周波数とナイキスト周波数以外には) 伝送零点を持たないタイプとなり、フィルタ係数の数を減らせます。
まず、(伝送零点を持たない全極型の) アナログ 2 次 BPF の伝達関数 H(s) は、一般的に、
\qquad\qquad H(s)\,=\,K\cdot\frac{\large\frac{\omega_0}{Q}\cdot s}{\large s^2\,+\,\frac{\omega_0}{Q}\cdot s\,+\,\omega_0^2}
と表すことができます。 ここで、K はピーク・ゲイン、ω0 はピーク角周波数、Q はピークの鋭さを表すパラメタです。
これを
双 1 次 s-z 変換
\qquad\qquad s\,=\,\frac{\large 2}{\large T}\cdot\frac{\large 1\,-\,z^{\tiny -1}}{\large 1\,+\,z^{\tiny-1}}
でディジタル・フィルタの伝達関数 H(z) に変換すると、一般的に
\qquad\qquad H(z) \,=\, \frac{\large a_0\, \cdot\, (\large 1\,-\,z^{\tiny -2})}{\large 1\, +\, b_1 z^{\tiny -1}\, +\, b_2 z^{\tiny -2}}
と表されます。
この式の分子の (1 - z-2) = (1 - z-1)(1 + z-1) は z = 1 (正規化角周波数 Ω = 0) および z = -1 (正規化角周波数 Ω = π) に零点を持ちます。
これはもとの s 領域の式でのゼロ角周波数と無限大角周波数の零点が z 領域の点に写像されたもので、もとのアナログ領域での BPF の特性によらず、変換後のディジタル 2 次 BPF ですべて同じ形となります。
1/12 オクターブバンド・フィルタを 6 次 BPF、つまり、2 次セクション 3 段の縦続接続で実現する場合には、トータルの伝達関数の分子には (1 - z-2)3 という因子が必ず含まれ、それはすべてのバンドのフィルタに共通しています。
そこで、この分子の部分を先に計算して各バンドで共通して利用し、各バンドごとの計算では、各バンドごとに異なる分母の計算のみを行なう構成にした図を下に示します。 図では 2 バンド分だけ示してあります。

青色の破線より上の部分が分子の計算で、これは DFB ではなく、マイコンで計算することを念頭に置いています。
(1 - z-2) の計算は現在のサンプル・データの値から 2 個前のサンプル・データの値を減算するだけであり、乗算の必要はありません。 ただし、この計算では最大のゲインが 2 となり、スケーリングを行なわないとオーバーフローする恐れがあります。
(1 - z-2)3 の周波数特性は、

となり、サンプリング周波数の 1/4 の周波数 (12 kHz) で最大ゲイン 8 となります。
途中でオーバーフローしないためには、各段ごとに 1/2 するか、あるいは最初に 1/8 (0.125 倍) します。 これも、3 ビット右シフトで実現でき、乗算も除算も必要ありません。
入力データが 16 ビット幅だったとしても、この分子の計算で有効ビット幅は 3 ビット増えて 19 ビット幅になりますが、最初から 32 ビット幅で計算しておけば精度を失うこともありません。
計算方法の図の青色の破線より下の部分が DFB で計算する分母の部分です。
「bk,m,n」のように表示してあるフィルタ係数は、バンド k の、2 次セクション m 内の、係数インデクス n を意味しています。
ひとつの 2 次セクション内では、

  ak,m,0

  bk,m,1

  bk,m,2

の 3 つの係数だけが有効です。 したがって、バンドひとつあたり 3 × 3 = 9 個のフィルタ係数を「消費」することになります。
DFB のデータ RAM 容量は 128 ワードですから、128 / 9 = 14.22... となり、フィルタ計算に必要なオーバーヘッド分を考慮しても 12 バンド分は確保できることが分かります。
各バンド、各 2 次セクションの ak,m,0 は分母の計算途中でオーバーフローしないためのスケーリング係数の役割がありますが、フィルタ係数計算プログラムで想定している通常の構成とは異なっているので、この構成方法に合わせて計算し直す必要があります。
MIDI ノート・ナンバー 120 (8.372 kHz) から、MIDI ノート・ナンバー 131 (相当)(15.354 kHz) までの 1 オクターブ分 12 バンドのフィルタを設計した例を下に示します。
まず、分母の 1 段目の出力です。 この段は、Q が約 17 の、バンドの中心周波数に一致する中心周波数の BPF です。

この図は、WaveGene に付属の TSP (Time Stretched Pulse) 法の入力波形ファイル「FLATSWEEP_016384.WAV」(16 K ポイント FFT 用) を利用して PC 上のプログラムでディジタル・フィルタの動作をシミュレートして得られたものです。
ハードウェアのディジタル・フィルタに WaveGene + WaveSpectra の組み合わせで信号を流して TSP 法で測定するのに相当します。
スケーリングは簡易的な方法で行なっていますが、1 段目に関しては、すべてのバンドでピーク・ゲイン 0 dB に揃えられています。
2 段目の出力を下に示します。 2 段目は Q が約 35 の、バンドの中心周波数より低い中心周波数を持つ BPF です。

スケーリングを簡易的な方法で行なっているため、ピーグのゲインが 0 dB ではなく数 dB 低くなっています。
3 段目の出力、つまり、バンドの最終出力を下に示します。 3 段目は Q が約 35 の、バンドの中心周波数より高い中心周波数を持つ BPF です。

この最終段のスケーリングで「つじつま」が合って、最終ゲインも 0 dB になっています。
各バンドの「通過域」付近の拡大を下に示します。

隣接バンドとは -3 dB 付近でクロスオーバーしていることが分かります。