このIPについて
すべてVHDLによって記述しています。XilinxのSPARTAN XC3S200に依存するコードを含みますが、内蔵ブロックRAMの部分のみですので、他のFPGAへの移植は簡単です。
このIPにご興味のある方は、ナビゲーションメニューの「お問合せ」をご参照の上、必要事項を記入してメールにてご連絡ください。FPGA受託設計開発サービスのご利用如何にかかわらず、ソースなどは基本的に無料で開示させて頂きます。もちろんカスタマイズ等のご用命は大歓迎です。
Over Sampling Digital Filterについて
「ディジタルフィルタ」は古くて新しい重要技術かと思います。その中でオーディオ用のオーバーサンプリングタイプは、重要であることにかわりありませんが、D/Aコンバータチップ等に当然のように内蔵されて、技術自体がコモディティ化してしまった感があります。しかしながら、20年くらい前に登場したときには、ハイテクの塊のように光り輝いていた技術の1つであったと思います。
今日、ディジタルフィルタ理論を解説した書籍の発刊数や、ソフトウェア的にフィルタ係数を算出するような信号処理ソフトウェアの発展が目覚ましいですが、ディジタルフィルタ(TAP数の多い)のように非常に多数の乗算機が必要なアプリケーションを「ハードウェアではどうやって実現するのか」ということについては、なかなか開示・紹介されたものがありません。
ここでは、120TAP, 4倍オーバーサンプリング(オーディオ帯域)という仕様のディジタルフィルタを、ハードウェア的にどうやって構成するかということに焦点を当てて考えてみました(20年前の技術なので、知っている方にとってはばかばかしいかもしれませんがお付き合いください)。フィルタそのものの設計については、すでになされていて、あらかじめフィルタ係数や、TAP数が与えられているという仮定のもとに、それをどうやってハードウェアに落とし込んでいくか、というプロセスについて考えてみます(当然シリコン上で検証もします)。
もっとも単純な構成
図1に、よく出てくるディジタルフィルタの原器の(ような?)回路構成を示します。
![典型的なディジタルフィルタ回路](images/digitalfilt.gif)
図1: 典型的なディジタルフィルタ回路
これをそのまま。ハード化するのであれば、HDLで単純につないでやれば良く、ModelSim等でFunction Simをする限りにおいては何の問題もありませんが、FPGA等にフィッティングさせようとするとハタと考え込んでしまいます。集積度が昔と桁違いに上がったとはいえ、16bit×12bitの乗算器を128個インプリメントさせようとすれば、リソースに限りある中では多くの場合破綻すると思われます。
4倍オーバーサンプリング・ディジタル・フィルタの考察
4倍オーバーサンプリングをハードウェアでどうやって実現するかを説明するために、まずは図2に4倍オーバーサンプリング・ディジタルフィルタのタイミングチャートを示します。
まずは、隣り合うサンプル間に '0'
を挿入することによって周波数スペクトラムをそのままに、データ転送レートを上げます。4倍であれば、隣接データ間に3個の '0'
を挿入します。赤枠が元データ、その間の黒枠が挿入された '0' を示します。
Q(0), Q(1),...Q(127)は、図1における各16bitFFの出力ノードQ(n)を、各Q(n)の隣に記されたcoef(0),
coef(1),...coef(127)は、それらノードへ乗算される係数データcoef(n)を示します。'Audio
data'は回路へ入力される16bit元データで、もともとのサンプリング周期をTとすると、'0'挿入後の周期がT/4になります。
'Audio data'が、'0'挿入されて(回路は図示しませんが容易です)図1のフィルタ回路を通ると、各ノードは周期T/4のサンプリングクロック4fsでシフトされて図2のように変化します。つまりT/4の時間で128個の積和演算が必要ということになります。実際には、'0' が挿入された部分では乗算の解は '0' ですので、32個の積和演算をT/4の間に行えば、4倍オーバーサンプリング・ディジタルフィルタが実現できることになります。したがって左右合わせて2×32個の16bit×12bit(係数ビットを12とする)乗算器をデバイス中の貴重なリソースから割くことができれば、単純な話で終わります。
この場合、フィルタ係数を4つのバンク coef(4n), coef(4n+1), coef(4n+2), coef(4n+3) (n=0,1,2,...,31)に分解しておき、T/4周期で演算のバンクを切り替えることによって、それぞれ図中1番下のΣ1,Σ2...を計算すれば、出力は4倍オーバーサンプリングされたオーディオデータとなります。念のため、Σ1,Σ2,... は図2右側の計算式の値となります。
![4倍オーバーサンプリング・ディジタルフィルタのタイミングチャート](images/df_chart.gif)
図2: 4倍オーバーサンプリング・ディジタルフィルタのタイミングチャート
改良型4倍オーバーサンプリング・ディジタル・フィルタの構成
![リングバッファ](images/ringbuf.gif)
図3 リングバッファ
ここでは、やはり64個の乗算器は確保できないという前提で全く同じ演算を左右2個ずつの乗算器で実現する方法を考えます。幸いにも、オーディオデータのサンプリングレートは44.1kHz(CDの場合)と低いですので、その1周期である時間Tの間、ここでは4倍オーバーサンプリングなのでT/4の間に、さらにその1/32の時分割で(サンプリング周波数 4/T(=4fs)の32倍のクロックである128fsレートで)上記Σ1, Σ2,...の乗算部分を実行し、それぞれのクロックエッジにおける積をアキュムレータに合計32個分積み上げていけば、図2と同等の解を得ることができます。
ここがわかりにくいところですが、周期Tの間に32個のオーディオデータを持ってきて(しかも繰り返し4回分)演算をするためにはメモリが必要になります。つまり、「過去」32サンプル分のデータが格納されたメモリから、128fsレートで新しい順に読みだしてきて、同じレートで係数(coef)ROMから読みだしてきた係数データと乗算すればよいことになります。オーディオデータは32個のデータ読み出しを4回繰り返し、係数データは4個のバンクから32個ずつのデータを読み出します。
最後に書き込んだオーディオデータから先に読みだして演算していくということで、図3のようなリングバッファタイプのメモリにします。RAMのタイプとしては、1リード/1ライトタイプの2PORTメモリを使うことにします。書き込みクロックにはfsクロックが使えます(あるいは同一周波数のパルス)。
![改良型4倍オーバーサンプリング・ディジタルフィルタのタイミングチャート](images/addr.gif)
図4: 改良型4倍オーバーサンプリング・ディジタルフィルタのタイミングチャート
入力のオーディオデータは書き込みはアドレス(write address)によってメモリに書き込まれ、(読み出しアドレス) read address によって読みだされます。write address は入力オーディオデータのレートfsで31→0,31→0,... の順に変化し、read addressは128fsクロックレートでその直前の write address 値から始めて上り順に変化します。例えば、図4上方の楕円部で囲んだ"Label1a"では、直前の write address 'A3' からスタートして、128fsレートで A3, A4, A5,...,A31, A0, A1, A2というように上り順で変化させます。"Label1b"についても同様です。read address の黒枠1つが、128fsレートの32個分のアドレスを示しています。読み出しアドレスは4回同じパターンを繰り返します。
係数(coef)ROM用の read address は、"Label2a"から"Label2d"のように4つのバンクに分けて128fsレートで駆動され、"Labal3a"以下のように係数ROM(coef)が読みだされます。この場合、ROMには係数がcoef(0)からcoef(127)まで「順番に」格納されているものとします。ここは図2のタイミングチャートと対比して考えて頂くとわかりやすいかと思います。
RAMに格納されたオーディオデータd(n)も、read address A*に従って、直前に書き込まれたデータから128fsレートで32個分を4回繰り返して読みだされます。
次に(というか、ハードウェアなのでコンカレント進行ですが)、読みだされたRAMデータと、ROMデータを同じく128fsレートで乗算します。つまり、128fsクロック32発で1つのバンク、周期Tの間に合計4バンクの演算を行います。乗算と同時に、乗算結果σ(n)を128fsクロックに同期してアキュムレータに加算していき、32個分積んだところで out_latch パルスによってラッチして所定のビットに丸めれば4倍オーバーサンプリング・ディジタルフィルタの完成となります。同時に、アキュムレータに合計32個分の乗算結果を積むたびに、accum_clr パルスでアキュムレータの値をクリアします。
ブロック図のイメージで示せば、図5のようになります。以上のような構成とすることで、左右合わせて乗算器2個で4倍オーバーサンプリング・ディジタルフィルタを実現することができます。同様の考え方で、現在主流の8倍オーバーサンプリング・ディジタルフィルタも簡単にハードウェア化が可能です。
予め、フィルタのアルゴリズム的な設計データが存在するという仮定のもとに説明しましたので、係数データ(coef)については特にここでは示しません。設計仕様は極めてアバウトで恐縮ですが、図6のようなものです。念のためにお断りしておきますが、フィルタの設計パラメータは当然ながら多岐にわたります。ここではTAP数と係数データがあらかじめ与えられており、図6のようなf特のフィルタになりますよ、という情報も参考までに与えられた程度に思って下さい。
![改良型4倍オーバーサンプリング・ディジタルフィルタのブロック図](images/digifil_blk.gif)
図5: 改良型4倍オーバーサンプリング・ディジタルフィルタのブロック図
![(アバウトながら)設計仕様](images/f_spec.gif)
図6: (アバウトながら)設計仕様
シリコン上での動作結果
XilinxのSpartan XC3S200を対象に、ISE9.1iを用いて論理合成、フィッティングを行いました。特にスピードを必要とするアプリではないので、問題になるようなところはありませんでした。
出来上がりSpecは図7のようなものです。20kHzの正弦波を通した結果の周波数特性図です。これはシミュレーションでの結果です。少し変則的で見にくいのですが、横軸の目盛は5×(44.1/48)kHz/div
となります。縦軸も少し文字がつぶれて恐縮ですが、-20dB/divとなっています。
特性的にも20年前の特性でしょうか(TAP数、係数bit数からして高性能な出来上がりは決して想定していませんが・・・)。
![改良型4倍オーバーサンプリング・ディジタルフィルタのf特](images/f_chart.gif)
図7: 改良型4倍オーバーサンプリング・ディジタルフィルタのf特