LoginSignup
0
1

More than 5 years have passed since last update.

パイプライン指数平滑フィルタ (パイプラインIIR)

Posted at

指数平滑フィルタ:

$$
y_n = \alpha x_n + (1 - \alpha)y_{n-1}
$$

アナログで言えば1次のRCローパスフィルタに対応するフィルタだが、この式をそのままハードウェア化した場合、毎クロック演算することはできない。というのも単純な話、$y_n$ に $y_{n-1}$の項をフィードバックしようにも、積和演算で数クロック遅れてしまうので間に合わないのである。例えばXilinxのDSP48E1スライスの場合は、積和演算(P=A*B+C)のA入力からP出力まで3クロックかかってしまう。

ではどうするかというと、

\begin{eqnarray*}
y_n &=& \alpha x_n + (1 - \alpha)y_{n-1} \\
 &=& \alpha x_n + \alpha(1 - \alpha) x_{n-1} + (1 - \alpha)^2 y_{n-2} \\
 &=& \alpha x_n + \alpha(1 - \alpha) x_{n-1} + \alpha(1 - \alpha)^2 x_{n-2} + (1 - \alpha)^3 y_{n-3}  \\
&=& ...
\end{eqnarray*}

と、$y_{n-k}$を $y_{n-k-1}$に展開していって、積和演算のレイテンシでも間に合うようにフィードバック項を遅らせる。1

DSP48E1スライスで言えば、レイテンシが3クロックなので、 $y_{n-3}$が出るまで展開する。

なお回路は複雑になる2ので、どうしても指数平滑が必要な場合3でもなければ別のローパスフィルタを使ったほうがいい。



  1. もちろんこの手法は指数平滑フィルタだけでなく、通常のIIRフィルタにも応用可能である。 

  2. Vivado HLSで実装できないか頑張ったが、私の高位合成力が足らないのか無理だった。 

  3. 今まで使っていたアナログフィルタの代替として使いたい場合など。 

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1