
伝達関数から周波数応答(周波数振幅特性と周波数位相特性)
はじめに 前回の記事では、RCローパスフィルタの伝達関数を計算し、ステップ応答を調べるところまでを行なった。今回はその続きとして、RCローパスフィルタの伝達関数を使って周波数応答(周波数振幅特性と周波数位相特性)を調べてみよう。 Pythonで伝達関数などを扱うにあたっては、こちらの書籍を大いに参考させてもらった。計算が複雑になりがちな制御工学の伝達関数なども、Pythonでらくらくシミュレーションできるようになるのでおすすめだ。 ステップ応答やインパルス応答などの過渡応答特性は時間関数f(t)の形であるが、周波数特性の場合は、$s$の代わりに$jω$となる。jは虚数($j^2 = -1$)であり、ωは角周波数である$ω=2πf$。 実は伝達関数$G(s)$の代わりに$G(jω)$とすることで周波数振幅特性を調べることができる。また、$arg(G(jω))$とすることで周波数位相特性を調べることができる。 周波数振幅特性とは、さまざまな周波数の正弦波をシステムへ入力にした時、どの程度の振幅で出力されるか調べたもの である。たとえばシステムが単純なローパスフィルタなら、高周波になるほど出力は小さくるだろう。 また、 周波数位相特性とは、さまざまな周波数の正弦波をシステムへ入力にした時、どの程度の入力の位相とずれているかを調べたもの である。 これらのことが$G(jω)$や$arg(G(jω))$で調べられるわけだが、なぜ$s=jω$とするのかの理由はフーリエ変換やオイラーの公式を使って説明されるため非常に難しので本記事では省略する。しかし、 理屈を知らなくても伝達関数さえ分かっていれば簡単に周波数特性を調べられるので、本記事ではとにかく実践を大事に周波数応答の実験をしてみたいと思う。 具体的にはPythonでプログラミングして周波数特性をグラフ化していく。 周波数応答 さて、RCローパスフィルタの伝達関数は次の通りであった。 $$G(s)=\frac{1}{1+RCs}$$ よって、周波数振幅特性を調べるためには $$G(jω)=\frac{1}{1+jωRC}$$ とすれば良いことになる。 また、周波数位相特性を調べるためには$arg(G(jω))$であった。argとは複素数平面上での偏角のことである。 さて、$ω=2πf$であるので調べたい周波数$f$を変えて計算すれば良いわけだが、周波数は膨大にあるため手動で計算するのはほぼ不可能だ。そこでPythonを使って周波数応答をグラフ化していく。 次のプログラムは抵抗R=1kΩ、コンデンサの容量を1μF、入力のサイン波の電圧を1としたときの周波数応答をグラフ化させるプログラムである。 from control.matlab import * import matplotlib.pyplot as plt if __name__ == '__main__': R = 1 * pow(10, 3) # 1kΩ C = 1 * pow(10, -6) # 1μF K = 1 # ゲイン T = R * C # 時定数 G = tf([0, K], [T, 1]) # 伝達関数 W = logspace(1, 5) # 対数スケールの配列 gain, phase, w = bode(G, W, Hz=True) plt.show() このプログラムを実行すると、図のように周波数振幅特性(上)と周波数位相特性(下)が表示される。システムはローパスフィルタなので、周波数が高くなるにつれてゲインが下っていく。また、周波数が高くなるにつれて入力との位相ズレが出力にあらわれていく。 プログラムの説明 ここで、先ほどのプログラムをもう少し詳しく解説する。 ...



