ディジタルフィルタ1
ディジタルフィルタの基礎概念と FIR フィルタについて理解しよう.
教科書の該当範囲:第6章
基礎知識
フィルタ "filter" の入出力特性をどのように表現するか?
- 周波数応答 "spectral response":
周波数スペクトル的な入出力の関係で表現.
- 時間応答 "temporal response":
時間波形的な入出力の関係で表現.
- 応答関数 "response function":
\[ h(x(t)) = \cdots \quad \tt orz \]
ブロック図:入力波形 \( x(t) \) → フィルタ \( h(x) \)
→ 出力波形 \( y(t) = h(x(t)) \)
- 波形の瞬時値の直接操作なので,
レイテンシは無問題
.?
そうとも限りません.
区間処理の分の待ち時間はありませんが,
その他の処理の待ち時間はあります.
- ディジタルフィルタに好都合.
- 応答関数をどのように定義すれば?
波形(関数,数値列)を引数とする特殊な関数(汎関数と云われるもの)ですよ...
インパルス応答
インパルス "impulse"(一瞬だけのパルス)入力に対するフィルタ出力.
- 複数のインパルスの遅延・定数倍・総和で任意の波形を表現可能.
インパルスをズラしながら大きさを調整して重ね合わせるってことね.
- インパルス応答と入力波形を畳み込めば,フィルタの時間応答になる.
両者をズラしながら乗算し,合計するのが畳み込み "convolution".
なお,フィルタの周波数応答は,伝達関数と入力スペクトルの積でした.
畳み込みとフーリエ変換の積とは表裏一体.
- インパルスのフーリエ変換は一定値.
スペクトル分布に,あらゆる周波数が含まれる.
- インパルス応答のフーリエ変換は伝達関数そのもの.
てことは,伝達関数の逆フーリエ変換はインパルス応答ですね.
- バリエーション:
今回は FIR だけ,IIR は次回.
FIR フィルタの時間応答
具体例を元にして,FIR の時間応答を導出してみる.
- インパルス応答の例:(残響時間 \( J = 3 \) の場合)
\[
\V{x} = \Mat{x_0 \\ 0 \\ 0 \\ 0 \\ \vdots}
\quad \rightarrow \quad
\V{y} = \Mat{b_0 x_0 \\ b_1 x_0 \\ b_2 x_0 \\ 0 \\ \vdots}
\]
時間 \( n = 0 〜 (J-1) \) に対して,
出力は \( y_n = b_n x_0 \) ですね.
- 遅延インパルス応答の例:(同上かつ遅延時間 \( m = 2 \) の場合)
\[
\V{x} = \Mat{0 \\ 0 \\ x_2 \\ 0 \\ 0 \\ 0 \\ \vdots}
\quad \rightarrow \quad
\V{y} = \Mat{0 \\ 0 \\ b_0 x_2 \\ b_1 x_2 \\ b_2 x_2 \\ 0 \\ \vdots}
\]
時間 \( n = m 〜 (m+J-1) \) に対して,
出力は \( y_n = b_{n-m} x_m \) ということ.
- あるパルス波形の時間応答の例:(残響時間 \( J = 3 \) の場合)
\[
\V{x} = \Mat{x_0 \\ x_1 \\ x_2 \\ x_3 \\ 0 \\ 0 \\ 0 \\ \vdots}
\quad \rightarrow \quad
\V{y} = \Mat{b_0 x_0 \\
b_1 x_0 + b_0 x_1 \\
b_2 x_0 + b_1 x_1 + b_0 x_2 \\
b_2 x_1 + b_1 x_2 + b_0 x_3 \\
b_2 x_2 + b_1 x_3 \\
b_2 x_3 \\ 0 \\ \vdots}
\]
インパルス応答の重ね合わせの単純な例でした.
- 任意波形に対する時間応答:
\[ y_n = \sum_m b_m x_{n - m} \]
現在の出力 \( y_n \) に対して,
過去の入力 \( x_{n-m} \) が比率 \( b_m \) だけ配分されている.
これが,入力の波形 \( \V{x} \) と
フィルタのインパルス応答 \( \V{b} \) との畳み込みです.
残響の標本数 \( J \) の場合,
総和の遅延番号 \( m \) の範囲は \( 0 〜 (J-1) \) です.
プログラミング的には,
\( x_n \) とかの添字付き変数は配列要素 x[n] とかですよ.
Z 変換
Z 変換(ZT)"Z transform" はDFT の変種.
ディジタルフィルタでは,DFT そのままより,ZT の利用が便利.
周波数応答にも時間応答にも適用し易い.
- DFT:
\[ X_k = \sum_n x_n W_N^{kn} = \sum_n x_n \exp\P({-j\F{2 \pi k n}{N}}) \]
これでも充分に簡単ですが...
- 複素変数 \( z \) の導入:\[ z = W_N^{-k} = \exp\P({j\F{2πk}{N}}) \]
この \( z \) は,本来は任意の複素数なんですが...
とりあえず,回転子 \( W_N \) の更なる短縮記法と思えばヨシ.
- ZT:
\[ X(z) = \sum_n x_n z^{-n} \]
本来は,関数の多項式展開(テイラー展開とか)の複素数版なんですが...
とりあえず,シンプルな数式だなーと思えばヨシ.
謎の変数 \( z \) を使ってはいますが,
周波数 \( \omega \) とか \( f \) とか \( k \) の関数と思えば,
この \( X(z) \) もスペクトルですよ.
総和の標本番号 \( n \) の範囲は \( 0 〜 (N-1) \) です.
また,\( N \) は標本数でした.
FIR フィルタの周波数応答
時間応答を元にして,FIR の周波数応答を導出してみる.
- 時間応答:
\[ y_n = \sum_m b_m x_{n - m} \]
- Z 変換:
\[ \begin{array}{rcl}
Y(z) & = & \DS \sum_n \P({\sum_m b_m x_{n - m}}) z^{-n} \\
& = & \DS \sum_n \sum_m \P({b_m x_{n - m} z^{-(n-m)} z^{-m}}) \\
& = & \DS \sum_m \P({b_m z^{-m} \sum_n x_{n - m} z^{-(n-m)}}) \\
\end{array} \]
ここで,\( \sum_n \) は全標本値に対する総和だよね?
そして,\( x_{n-m} \) と \( z^{-(n-m)} \) は周期的なので,
添字 \( n-m \) をズラし,\( n \) にしても,
総和の値は不変なので無問題.
\[ \begin{array}{rcl}
Y(z) & = & \DS \P({\sum_m b_m z^{-m}}) \P({\sum_n x_n z^{-n}}) \\
& = & H(z) X(z)
\end{array} \]
- 伝達関数(\( z \) 領域):
\[ H(z) = \sum_m b_m z^{-m} \]
- 伝達関数の図式表現:ブロック図 "block diagram"
授業時に図を描きます.
ブロック図では,Z 変換のフィルタと時間領域の信号とが混在...
- 伝達関数(周波数領域):
\[ H_k = \sum_m b_m \exp \P({-j \F{2 \pi k m}{N}}) \]
FIR の場合,伝達関数の変数変換(Z → 周波数領域)は単純に,
\( z \) を \( \exp \cdots \) へ置き換えるだけで OK.
次回の IIR の場合,単純ではない.
- 単純な平均化フィルタの例:
\[ y_n = (x_n + x_{n-1})/2 \]
\[ H(z) = (1 + z^{-1})/2 \]
\[ \begin{array}{rcl}
\N{H(z)} & = & \Sqrt{H(z) \CC{H(z)}} \\
& = & \DS \Sqrt{\F{(1 + z^{-1}) (1 + z^1)}{4}} \\
& = & \DS \Sqrt{\F{2 + z^1 + z^{-1}}{4}}
\end{array} \]
\[ \N{H_k} = \Sqrt{\F{1 + \cos(2 \pi k/N)}{2}} \]
図示してみれば,まあ,低域通過フィルタ(LPF)と云えるでしょう.
なお,グラフは周波数番号 \( k = N/2 \) を中心として対称形で,
右半分(高域側)も極大となっているので,
BEF のようにも見えますね.
しかし,右半分は高域ではなく,
負の周波数の折返しなので無視するんですよ.
遮断周波数は?
伝達関数の最大値の \( 1/\Sqrt{2} \) となる
周波数番号が \( k = N/4 \) なので,
\( f_0 = f_\mathrm{s}/4 \) ということです.
(c) 2024, yanagawa@kushiro-ct.ac.jp