chapter 5. describing a fir filter 5.1 ~ 5.3 前半
DESCRIPTION
Chapter 5. Describing a FIR Filter 5.1 ~ 5.3 前半. 6311621 小野翔人. 導入. シンプルなデジタルフィルタリングアプリケーションの紹介 目的 基盤となるプログラムの流れの概念の導入 デスクトップシミュレーションを用いたデモ. デジタルフィルタ. デジタル信号処理: デジタル信号 ( 離散的な信号)TRANSCRIPT
Chapter 5. Describing a FIR Filter5.1 ~ 5.3 前半
6311621 小野翔人
導入シンプルなデジタルフィルタリングアプリケーションの紹介目的 基盤となるプログラムの流れの概念の導入 デスクトップシミュレーションを用いたデモ
デジタルフィルタ デジタル信号処理:
デジタル信号 ( 離散的な信号) <= 数学的な処理 デジタルフィルタ:
入力データ <= 数学的な処理→ 得たい周波数成分を抽出する
デジタルフィルタの種類 FIR フィルタ (Finite Impulse Response Filter)=有限インパルス応答フィルタ IIR フィルタ (Infinite Impulse Response Filter)=無限インパルス応答フィルタ アダプティブ・フィルタ(応用型フィルタ)
FIR フィルタ 「有限」入力データは決められた有限な期間のみシステムで使用• フィルタの位相応答が重要• 正確な線形位相応答の設計• 安定で予測可能という性質を必要とするシステムで利用
5.1 DESIGN OVERVIEW FIR フィルタの出力 = 過去と現在の入力値の加重和 全ての型は主に与えられたフィルタ計算の実行に用いる
ウィンドウのサイズ ( 離散的なサンプル数 ) によって定義 このウィンドウサイズ => "filter taps "
C 言語や Impulse C ライブラリを用いるフィルタ:51-tap FIR フィルタ
→ ハードウェアのプロセス信号を例示ハードウェアの為の C プログラミングの側面を紹介
FIR フィルタの数式
p
k
kmfkhmg0
][][][
5.2 THE FIR FILTER HARDWARE PROCESS Figure 5-1
51-tap FIR フィルタと表わすハードウェアプロセス前章の HelloFPGA 同様• 入力ストリーム上のデータを受け取る (filter_in)• 反復的に計算を実行する (filter_out)
(ストリーム上でフィルタリング済の出力に対応するものを得る為)
• 入出力プロセスの唯一のインタフェースはfilter_in と filter_out の二つのストリームを介する
操作実行の為の係数が必要( 本例のフィルタは 32bit 整数値 )→ フィルタリング済データとして同様の入力ストリームを介して送信
(恐らくシステム初期化の一部分)後期の改良設計では共有されたメモリー資源からその係数を得られたり、入力信号に反応して新しい係数を動的にロードする様なプロセス変更があるかも
• ローカル配列 "coef","firbuffer"プロセスの初期に変数 "nSample","nFiltered","accum","tap" に沿って定義
TAPS(51) の定義とデータ幅 (32bits) よりこれらの配列はそれぞれ 204bytes(1632bits) のストレージと同一視可
• 入出力ストリームが開かれた後( それぞれ O_RDONLY 、 O_WRONLY モードを使う )係数 (51) は "co_stream_read" を用いて入力ストリームから読まれる (filter_in)
• 上流プロセスが適切に書かれている場合係数の数を数えるこの方法は安定性が高い=> 自己同期性質より、上流下流プロセスが大きく異なるレートで動作している(=ソフトウェア内で生産プロセスが実行されている時や ハードウェア内でプロセス消費があるときなど)かどうかに関わらず、データが失われることを防げる
• 一番目のループが終了し、係数の読込が済んだ後、二番目の初期化ループ ( メインループの外側のループ ) で計算を開始する為の値をプライマリバッファに充填 することによって後続のメインプロセスループにおけるフィルタの設定を行う
• メインループは前章の HelloFPGA の例と同様のパターン "co_stream_read" の返り値はループ条件=>Impulse C 内部コードのループをコーディングする上 => で最も効率の良い方法 → 可能な限り使用する必要がある
• FIR フィルタリング操作を行う為の実際の計算は二つの内部コードのループに含まれる1 番目:現在値 ( 入力バッファ "firbuffer" や対応する係数から
得られた値 ) におけるフィルタ計算2 番目: ( 出力ストリームに結果値が書き込まれた後 )
次のメインループを反復させる為の準備の一つとして 配列をシフト
• フィルタプロセスがストリームの終了条件を検知( プロセスへのフィルタ入力がこれ以上存在しない )するとコントロールはループの外に移り、“filter_in”,“filter_out” は閉じる
=> 実際のハードウェア実装では決して起こらないことを前提とすることができるプロセスはシステムの電源が切られるまで値の処理を継続
一連のテスト後にその様なクリーンアップを行うデストップシミュレーションはプロセスに反応して動作し続けるストリームが閉じないまま=> プロセスは永久に自身を処理しない他のプロセス群も結果として閉じない シミュレーションが期待通りに完了しない
5.3 THE SOFTWARE TEST BENCH FIR フィルタの適切な関数を確認する為の標準的な C 言語の fopen及び関連する関数を使用した簡単なソフトウェアテストベンチ
• ファイルから係数 , ソースデータを読み取り、デスクトップシミュレーション中にこれらの値をFIR フィルタプロセスに示す
How fast will it run? 汎用的な 51-tap FIR filter を定義する必要がある FPGA ハードウェアが生成されたとき、プロセスはどの様に実行されるか?• 待ち時間及びスループット• ロジックの大きさ→C 言語からハードウェアへのコンパイラやオプティマイザを駆使して初期コンパイルを行うことで回答が得られる
ループの遅れに関する情報(ステージ毎に測定) パイプラインの遅延と割合 サイクル数 生成されたロジックの大まかなサイズ
パフォーマンスに関するより正確な情報• 出力に対してハードウェアシミュレーションを実行
(HDL シミュレータを用いる )• FPGA のネットリストを取得するために生成されたロジックを組み合わせる
ネットリスト … 素子間を接続する配線(ネット)の一覧を記述した 設計データの表現形式
• 内部コードのループを手動でアンロールor
• 自動でその様なアンロールをする為コンパイラプラグマ (Impulse C に付属)を使用したり必要に応じてパイプライン化をする
これらの設計はいくつかの明確なトレードオフがある 大きさと速さのバランス
About this FIR filter かなり遅い FIR フィルタの実装をするためにコンパイルを行う=> 生成されたハードウェアの観点で合理的かつコンパクト 一つのフィルタ処理を終えるクロックサイクルの観点で
このフィルタは遅い=> デフォルトでは Impulse Cコンパイラは内部コードのループやメインプロセスのループにおける
パイプライン化やアンロールすることを試みない為
システム要件に関する独自の知識を持っていれば ...• 最適化• コード内やプラグマ内にその様な効果を持つ命令を挿入
常に起こり得る結果を認識 どの様にサイズとスピードのバランスを考慮し最適化を行うか?