210 likes | 320 Views
Chapter 5. Describing a FIR Filter 5.1 ~ 5.3 前半. 6311621 小野翔人. 導入. シンプルなデジタルフィルタリングアプリケーションの紹介 目的 基盤となるプログラムの流れの概念の導入 デスクトップシミュレーションを用いたデモ. デジタルフィルタ. デジタル信号処理: デジタル信号 ( 離散的な信号) <= 数学的な処理 デジタルフィルタ: 入力データ <= 数学的な処理 →得たい周波数成分を抽出する. デジタルフィルタの種類.
E N D
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プログラミングの側面を紹介
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フィルタリング操作を行う為の実際の計算は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コンパイラは内部コードのループやメインプロセスのループにおける パイプライン化やアンロールすることを試みない為
システム要件に関する独自の知識を持っていれば...システム要件に関する独自の知識を持っていれば... • 最適化 • コード内やプラグマ内にその様な効果を持つ命令を挿入 • 常に起こり得る結果を認識 • どの様にサイズとスピードのバランスを考慮し最適化を行うか?