ari23の研究ノート

メーカ勤務エンジニアの技術ブログです

ディジタル信号処理|周波数応答とフィルタ設計

今回はディジタル信号処理の周波数応答をまとめます。

これを理解することで、ディジタルフィルタの設計ができるようになるはずです🐜1

周波数応答

周波数応答とは、線形・時不変システム(主にフィルタ)が入力信号に対して、どの周波数帯域の信号に影響を及ぼし、出力信号とするのかを解析することを指す。または、出力信号が周波数によって変化する様子をシステムの周波数応答という。

線形・時不変システムの評価には、制御工学と同じようにラプラス変換を利用する。

ラプラス変換|連続時間領域→(連続)s領域

ラプラス変換(Laplace transform)は、信号を連続時間領域→(連続)s領域に変換する。 もちろん、ラプラス逆変換は、信号を(連続)s領域→連続時間領域に変換する。

ラプラス変換の定義式を以下に示す。

 \displaystyle
X(s) = \int^{\infty}_{0} x(t) e^{-st} dt

この x(t)  t\in[0, \infty)  で定義された時間信号であり、 X(s) はその積分区間から片側ラプラス変換とも呼ばれる(工学上のほとんどの応用では、システムへ信号を入力した時刻以降の挙動のみを扱えばよいので、これで十分である)。

また、 s=c+j\Omega であり、 \Omega は角周波数、 c は適当な定数である。つまり、s領域は複素領域である。
時間領域での微分は、s領域のs倍に相当する。

これを線形・時不変システムで図示すると以下の通り。

LT 連続時間領域とs領域 模式図
LT 連続時間領域とs領域 模式図

s領域において、畳み込み式は次式で定義される。

 \displaystyle
Y(s) = H(s)X(s)

この伝達関数 H(s) において、 s=j\Omega と置き換えると周波数応答が得られる。

一応、ラプラス逆変換の定義式を以下に示すが、ここでは議論しない。2

 \displaystyle
x(t)u_0(t) = \frac{1}{2 \pi j} \int^{c+j\infty}_{c-j\infty} X(s) e^{st} ds

いずれにせよ、計算機(ディジタルな領域)で解析するには、離散化が必要であることがわかる。

z変換|離散時間領域→(離散)z領域

z変換は、信号を離散時間領域→(離散)z領域に変換する。 もちろん、逆z変換は、信号を(離散)z領域→離散時間領域に変換する。

z変換の定義式を以下に示す。

 \displaystyle
X(z) = \sum^{\infty}_{n=0} x[n] z^{-n}

この x[n] は離散時間 n=0, 1, 2, \cdots で定義された因果的信号であり、片側z変換とも呼ばれる。 (信号値が負の時刻ですべてゼロである信号を因果的信号といい、反対に正の時刻でゼロとなる信号を反因果的信号という。)

 z = e^{s} = z^{c+j\omega} であり、 \omega は正規化角周波数、 c は適当な定数である。ちなみに、この c を十分大きく取れば、離散時間フーリエ変換より多くの関数でz変換を収束することができる。

離散時間領域での1時刻遅延は、z領域での z^{-1} 倍に相当する。

これを線形・時不変システムで図示すると以下の通り。

ZT 離散時間領域とz領域 模式図
ZT 離散時間領域とz領域 模式図

z領域において、畳み込み式は次式で定義される。

 \displaystyle
Y(z) = H(z) X(z)

この畳み込み式に、差分方程式を導入すると、以下のように書ける。 (式の導出は、ディジタル信号処理 |FIRとIIRの違い - ari23の研究ノートを参照のこと)。

 \displaystyle
H(z) = \frac{\sum_{k=0}^{N} b_{k} z^{-k}} {\sum_{k=0}^{M} a_{k} z^{-k}}

この H(z) を伝達関数と呼び、 z=e^{j\omega} と置き換えると、周波数応答を得ることができる。

同様に、逆z変換の定義式を以下に示すが、ここでは議論しない。3

 \displaystyle
x[n]u_0[n] = \frac{1}{2 \pi j} \int_{\tau} X[z] z^{n-1} dz

上式の周回積分路 \tau は、z平面における X(z) の収束領域(Region Of Convergence; ROC)内の閉曲線である。

計算機で利用できるこのz変換を使って、ディジタルフィルタの設計を行う。

ディジタルフィルタ設計の実際

周波数特性(=周波数応答)のうち、以下の振幅特性と群遅延を評価しながら、所望のディジタルフィルタを設計していく。

振幅特性

ディジタルフィルタの周波数選択特性(どの周波数を通すか、それとも遮断するか)は、振幅特性を調べることで把握できる。 周波数 \omega の単振動は、振幅が |H(\omega)| 倍されて出力される。つまり、周波数を少しずつ増減させながら振幅を見れば、そのフィルタの性能がわかる。

群遅延(位相特性)

位相特性(=位相応答)を調べることで、入力信号がどのくらい遅れて出てくるかを把握できる。  -\angle H(\omega) / \omega を位相遅延といい、周波数 \omega の単振動がどのくらい遅れて出力されるかを表す。しかし、実用上次の群遅延がよく利用される。 詳細は未確認飛行C 周波数特性を参考のこと。

 -d \angle H(\omega) / d \omega  を群遅延といい、周波数 \omega の搬送波を振幅変調した際の包絡線波形がどのくらい遅れて出力されるかを表す。

ところで、位相特性=群遅延=一定であるような特性を線形位相特性と呼ぶ。

なお、偏角は次式で定義される。

 \displaystyle
\angle H(\omega) = \tan^{-1} \frac{{\rm Im}\ H(\omega)}{{\rm Re}\ H(\omega)}

BIBO安定性

特にIIRフィルタを設計する際は、フィルタの安定性も評価しなければならない4
フィルタが安定である必要十分条件は、伝達関数のすべての極が単位円の内側であることであり、これをBIBO安定性を有するという。 BIBO安定性とは、有界入力有界出力(Bounded-Input Bounded-Output)安定性の略である。 これは、任意の有界な入力、つまり |x[n]| \lt \infty に対して、出力も有界であるならば、つまり |y[n]| \lt \infty であるならば、そのシステムは安定であると定義される。

実装時のポイント

Pythonの信号処理ライブラリで有名なSciPyやNumPyを使う場合、主に以下の3つの関数を使います。

scipy.signal.freqz

線形差分方程式で表現した伝達関数の、分母と分子の係数を入力すると、z変換された H(\omega) と、それに対応する周波数 \omega が出力されます。  H(\omega) は複素数、 \omegaは正規化角周波数なので、適宜デシベル変換や目的の周波数に変換します。

scipy.signal.group_delay

こちらも線形差分方程式で表現した伝達関数の、分母と分子の係数を入力すると、遅延するサンプル数と、それに対応する正規化角周波数が出力されます。

numpy.roots

BIBO安定性を評価したい場合は、こちらの関数を使います。伝達関数の分母の係数を入力すると、極配置(複素数)が出力されるので、それが単位円の内側にあるかどうかでBIBO安定性を評価できるはずです5

おわりに

やる夫で学ぶディジタル信号処理から重要な点を抜粋し、適宜定義式を入れて補足しました。

内容がかなり重複するので、以前書いたブログもぜひご覧ください。

ディジタル信号処理 |FIRとIIRの違い - ari23の研究ノート

MATLABならfvtool関数を使って簡単に周波数応答を求めることができますが、概要だけでも知っておいて損はないと思います6

参考になれば幸いです(^^)

参考文献

参考文献は以下の通りです。

リンク

技術書






  1. タブンネ
  2. ディジタル信号処理ではラプラス逆変換する機会が少ないので。
  3. ディジタル信号処理では逆z変換する機会が少ないので。
  4. FIRフィルタは常に安定
  5. IIRフィルタを設計したことがないため、こういった書き方になってしまいました。すみません。
  6. でも最近はPython Controlなるものがあるんですね。