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

PSoC5LP の Filter コンポーネントを利用して生成される DFB プログラムでは、IIR バイクアッド・フィルタの計算に、前処理 6 サイクル、2 次セクション 1 段分の計算に 10 サイクル、後処理に 4 サイクル必要になります。
6 次 BPF の実現には 2 次セクション 3 段が必要ですから、この純粋にフィルタ計算に必要なサイクル数は、
6 + 3 × 10 + 4 = 40 [サイクル]
となります。
バスクロック 73.728 MHz、サンプリング周波数 48 kHz とすると、1 サンプリング周期 = 1536 クロック・サイクルとなるので、フィルタ計算以外のオーバーヘッドを含まない理論値として、
1536 / 40 = 38.4 [バンド]
の 1/12 オクターブバンド・フィルタが実現できることになります。
3 オクターブ 37 鍵キーボードに相当する値となりますが、実際には他のオーバーヘッドを含むので、実現できる値はこれよりも小さくなります。
中心周波数が低いバンドに対しては、必ずしも 48 kHz という高いサンプリング周波数で処理する必要はなく、必要に応じてデシメートして下げた低いサンプリング周波数で処理することもできます。
あるサンプリング周波数に対して 12 バンド分の計算を行い、そのちょうど 1 オクターブ下の 12 バンドに対しては信号のサンプリング周波数を 1/2 にデシメーションしてから計算するような構造にすれば、各バンドのフィルタ係数は毎回同じ 12 組を使用することができます。
サンプリング周波数を下げて減らせる計算量が、デシメーションで増える計算量を上回ればメリットが生ずることになります。
それとは別に、DFB のハードウェア規模の制約からくる限界値もあります。
後で述べる「ストリーミング・モード」では、DFB を初期化して実行を開始した後は外部からのアクセスは入力ステージング・レジスタおよび出力ホールディング・レジスタに限られます。
データ RAM A/B は 128 ワード構成であり、IIR バイクアッド・フィルタでは 2 次セクション 1 段あたりフィルタ係数を 5 個使用するので、2 次セクション 25 段で係数用として 5 × 25 = 125 ワードのデータ RAM を消費するのが上限となります。
1 バンド当たり 2 次セクション 3 段使うので、8 バンドで係数用として 8 × 3 × 5 = 120 ワードが限界となります。
つまり、「ストリーミング・モード」で使う場合は、(計算時間には余裕があっても) 実現可能なバンド数は 8 ということになります。
「PSoC5LP Architecture TRM (Technical Reference Manual)」では、「ストリーミング・モード」(Streaming Mode) と、「ブロック・トランスファ・モード」(Block Transfer Mode) の 2 種の動作モードについて記述されています。
これは、ハードウェアにそのような動作モードがあるわけではなく、「使い方」の違いによるものです。
ストリーミング・モードでは、最初に DFB プログラム、フィルタ係数、遅延要素内のデータなどの初期化を行なった後にプログラムを動作させると、それ以降はプログラムは連続して動作し続け、CPU や DMA などの外部から DFB 内部のメモリへのアクセスはせず、入力ステージング・レジスタおよび出力ホールディング・レジスタを介したデータのやり取りのみを行なう方式です。
入出力レジスタは 2 組あるので、ステレオ 2 ch まではそのまま素直にインプリメントできます。
2 チャネル以上のチャネル数が必要な場合には、1 組の入出力レジスタを複数のチャネルで共有し、「時分割多重」で代わる代わる利用するなどの方法を取る必要があります。
実行させる DFB プログラムの機能としては、入力ステージング・レジスタをポーリングして入力データの到着を待ち、入力データが到着したら必要なフィルタリングを行い、結果を出力ホールディング・レジスタに書き込むことの繰り返しとなります。
出力ホールディング・レジスタへの書き込みをトリガとして、ハードウェアにより割り込み信号あるいは DMA リクエスト信号が生成されるので、それにより起動される CPU 割り込み / DMA で (遅滞なく) フィルタ結果のデータを引き取ることになります。
動作としては、「リアルタイム・モード」とでも呼ぶべきものになります。
それに対して、「ブロック・トランスファ・モード」では、CPU / DMA と DFB との間のデータのやり取りは、いったん DFB プログラムを停止させ、CPU / DMA で DFB 内部のデータ RAM あるいはプログラム・メモリを直接アクセスして内容の保存/書き換えを行うものです。
データ RAM アクセスは DFB 側と CPU / DMA 側とで排他的なので、外部からアクセスする際には DFB の実行を停止させ、DFB_RAM_DIR ビットを外部アクセス用に設定する必要があります。
入力データは書き込むべき RAM データの中に埋め込み、また、出力データは読み出した RAM データの中から拾う形になります。
その際、データ・チャネル数は必要なだけ任意に選ぶことができます。
また、フィルタ係数のメモリと信号データのメモリをセットで書き替えれば、別の 8 バンド分のフィルタに対する計算を行なうことができ、それを繰り返せば、実行時間の制約が許す限り、処理バンド数を増やすことができます。
ストリーミング・モードがリアルタイム的であるのに対し、ブロック・モードは「バッチ」的であると言えます。
ブロック・モードの欠点として DFB プログラムの実行を停止してからバスを介して DFB 内部の RAM とのデータ転送を行なう必要があるため、データ転送が時間を消費するのに加え、DFB を停止させることによる時間のロスがあります。
PSoC5LP の Filter コンポーネントのフィルタ設計ツールでは、ストリーミング・モードで 2 ch まで対応の DFB プログラムを生成するようになっています。 システム側で用意されているのはそれだけで、ブロック・モードのプログラムが必要なら自分でプログラミングしなければなりません。