Chapter 5. Describing a FIR Filter

Chapter 5. Describing a FIR Filter
5.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
g[m]  h[k ] f [m  k ]
k 0
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コンパイラは内部コードのループや
メインプロセスのループにおける
パイプライン化やアンロールすることを試みない為


システム要件に関する独自の知識を持っていれば...
•
•


最適化
コード内やプラグマ内にその様な効果を持つ命令を挿入
常に起こり得る結果を認識
どの様にサイズとスピードのバランスを考慮し最適化を行うか?