Igorで複素数の計算をする方法について書く。

Igorでのコマンドは以下のリンクに詳しい。

http://www.hulinks.co.jp/support/igor/reference/functions/index_complex.html

 

例題として,図のようなローパスフィルタの特性について計算した。

R=100Ω,C=1μFである。

RとCによるローパスフィルタの回路図

RとCによるローパスフィルタの回路図

入力と出力の電圧比は,次式となる。

入出力の電圧比

入出力の電圧比

 

この絶対値が電圧利得の周波数特性になり,極座標表示における,虚部が位相のずれの周波数特性を表す。

Igorでのプログラム例を示す。

用いた関数は,cmplxr2polarである。

cmplx(実部,虚部)

という書式で,複素数を定義する。

wave1=r2polar(wave2)

という書式で,wave2を極座標変換し,wave1を作成する。wave1の実部がwave2の大きさ,wave1の虚部がwave2の位相である。

また,複素数の大きさについては,

wave3=magsqr(wave4)

というようにすればwave4(複素数)の大きさの二乗がwave3(実数)に代入される。

複素数のwave作成時には,Makeコマンドに/cというフラグを付ければよい。

 

プロシージャ画面で,関数(Lowpass)を作成。

ローパスフィルタ特性を計算する関数の定義

ローパスフィルタ特性を計算する関数の定義

実行すると,

関数実行後の特性グラフ化

関数実行後の特性グラフ化

となる。

電圧利得と位相ずれの周波数特性が計算できた。

コマンドを以下に示す。

Function Lowpass()
    Variable R=100
    Variable C=1e-6
    Make /o /N=100 wave_freq = 0.05*x    //0から0.05刻みでwaveの初期値を作成
    wave_freq = 10^(wave_freq)            //logスケールで周波数を定義
    Make /o /N=100 wave_omega = 2*pi*wave_freq
    Make /o /N=100 /c wave_BoardDiag    //入出力の電圧比(複素数)
    Make /o /N=100 mag_BoardDiag        //電圧利得の周波数特性
    Make /o /N=100 phase_BoardDiag        //位相ずれの周波数特性
    wave_BoardDiag = cmplx(1,wave_omega*C*R)    //1+jωC
    wave_BoardDiag = 1/wave_BoardDiag            //1/(1+jωC)
    mag_BoardDiag = real(r2polar(wave_BoardDiag))    //極座標の実部が電圧利得を表す。
    //mag_BoardDiag = sqrt(magsqr(wave_BoardDiag))としても電圧利得が計算できる
    phase_BoardDiag = 180/pi*imag(r2polar(wave_BoardDiag))    //極座標の虚部が位相ずれを表す。
    AppendToTable wave_freq, wave_BoardDiag, mag_BoardDiag,phase_BoardDiag    //各waveの値をテーブルに表示
    Display mag_BoardDiag vs wave_freq                    //グラフ作成
    ModifyGraph grid=1,log=1,tick=2,mirror=1   
    ModifyGraph width={Aspect,1.2}                       
    Label left “V\\Bout\\M/V\\Bin”
    Label bottom “Frequency [Hz]”
    Display phase_BoardDiag vs wave_freq     //グラフ作成
    ModifyGraph grid=1,log(bottom)=1,tick=2,mirror=1
    ModifyGraph width={Aspect,1.2}
    Label left “Phase [deg]”
    Label bottom “Frequency [Hz]”
End