PSoC5LP Prototyping Kit (37) --- デルタ・シグマ ADC と CIC 補償フィルタ (3)
CIC 補償フィルタを使用する場合に追加する回路を下に示します。
DFB (Digital Filter Block) のデータ入出力は DMA を使って行なわれるので、DMA コンポーネントとの接続があるだけで、他の部分との回路的な接続はありません。
フィルタは「インターリーブ・モード」での動作が必要なため、フィルタ設計機能を持つ Filter コンポーネントではなく、あらかじめ改造しておいた DFB プログラムを DFB コンポーネントにロードして使っています。 Filter コンポーネントはフィルタの設計のためだけに使い、最終的な回路には残しません。
実際には、 CIC 補償フィルタを使用しない場合にもフィルタは配置したままにしておき、ソフトウェア上の設定によりデータの流れを変えています。
もう少し具体的に言うと、フィルタを使用しない場合、I2S 出力では、
DSADC0_DEC_SAMP → DMA_buf10[] → I2S0_TX_FIFO_0
という経路で、SPDIF 出力の場合には、
DSADC0_DEC_SAMP → DMA_buf10[] → SPDIF_Tx0_TX_FIFO_0
という経路でデータを流します。
I2S コンポーネントでは、MS バイト・ファーストの順番でデータが必要なので、SRAM 中の DMA バッファである DMA_buf10[] 配列へ DMA 転送する際にバイト・スワップする設定になっています。
それ以外は、データの内容は一切変更せず、ADC から I2S あるいは SPDIF に転送します。
CIC 補償フィルタを使用する場合には、まず、
DSADC0_DEC_SAMP → DFB0_STAGEA
という、ペリフェラルからペリフェラルへの DMA 転送で、デルタ・シグマ ADC の出力サンプル・レジスタから DFB の入力ステージング・レジスタ A にデータを流し込みます。
DFB でのフィルタ計算が終了すると、出力 DMA 要求が出て、
DFB0_HOLDA → DMA_buf10[] → I2S0_TX_FIFO_0
あるいは、
DFB0_HOLDA → DMA_buf10[] → SPDIF_Tx0_TX_FIFO_0
という経路でデータが転送されます。 (I2S の場合には DMA_buf10[] への転送時にバイト・スワップ)
DFB の左チャネルのフィルタは sinc() 関数の 4 乗の特性の逆数の特性、右チャネルのフィルタは sinc() 関数の 5 乗の特性の逆数の特性とし、SPDIF とノン・オーバーサンプリング DAC との場合に、それぞれ最適な特性となるようにしました。
一時的に Filter コンポーネントを配置し、カスタマイザのフィルタ設計プログラムでチャネル A をタップ数 63 の sinc^4 補償フィルタとして設計しています。
設計パラメタ指定部分を下に示します。
カットオフ周波数は通過帯域端ではなく、ゲインが -6 dB となる点の指定なので、20 kHz までを通過域とするために、カットオフ周波数は 21 kHz に選んであります。
周波数特性は下のようになります。
また、チャネル B は「カスタム係数モード」として、外部プログラムで設計した sinc^5 補償フィルタの係数を読み込み、「dfb.v2」ファイルを生成しました。
そして、インターリーブ・モード改造ずみの DFB プログラムのフィルタ係数部分を、「dfb.v2」ファイルからフィルタ係数部分のみを抜き出したものに差し替えます。
その後、Filter コンポーネントは削除し、本来の DFB コンポーネントを配置して、フィルタ係数差し替えずみの DFB プログラムのファイルを読み込んでおきます。
sinc^5 補償フィルタの設計に使った外部プログラムは、
L.R.Rabiner & B.Gold: "Theory and application of digital signal processing", pp.194-204, Prentice-Hall, 1975
に掲載されている Remez 交換アルゴリズムを使った Parks–McClellan 法による等リプル FIR フィルタ設計プログラム (Fortran で書かれている) を以前 Borland Pascal に移植したものベースに、今回、改造を加えたものです。
通過域のリプルは約 0.05 dB、減衰域のリプルは約 -52 dB です。
フィルタ係数を下に示します。 これを Filter コンポーネント・カスタマイザのカスタム係数モードの係数ペインにペーストします。
5.253749E-0004 7.098471E-0004 -1.686229E-0003 2.325318E-0003 -2.619854E-0003 2.445333E-0003 -1.663694E-0003 2.190472E-0004 1.801156E-0003 -4.140799E-0003 6.385574E-0003 -8.014730E-0003 8.488107E-0003 -7.356630E-0003 4.382379E-0003 3.581834E-0004 -6.407432E-0003 1.292046E-0002 -1.872810E-0002 2.247227E-0002 -2.279997E-0002 1.859595E-0002 -9.225339E-0003 -5.243352E-0003 2.384776E-0002 -4.456811E-0002 6.408858E-0002 -7.723801E-0002 7.529893E-0002 -4.076164E-0002 -6.948148E-0002 3.613192E-0001 -6.948148E-0002 -4.076164E-0002 7.529893E-0002 -7.723801E-0002 6.408858E-0002 -4.456811E-0002 2.384776E-0002 -5.243352E-0003 -9.225339E-0003 1.859595E-0002 -2.279997E-0002 2.247227E-0002 -1.872810E-0002 1.292046E-0002 -6.407432E-0003 3.581834E-0004 4.382379E-0003 -7.356630E-0003 8.488107E-0003 -8.014730E-0003 6.385574E-0003 -4.140799E-0003 1.801156E-0003 2.190472E-0004 -1.663694E-0003 2.445333E-0003 -2.619854E-0003 2.325318E-0003 -1.686229E-0003 7.098471E-0004 5.253749E-0004