伝達関数によるフィルタ回路の周波数解析、過渡解析

 投稿者:山中和義  投稿日:2009年 2月16日(月)11時47分59秒
  ●伝達関数による周波数解析
OPTION ARITHMETIC COMPLEX

LET j=SQR(-1) !虚数単位

LET f=60 !周波数[Hz]
DEF w=2*PI*f !角周波数ω

SUB DispS(z) !複素数をS表示する ※スタインメッツ(Steinmetz)
   PRINT ABS(z);
   IF ABS(z)<>0 THEN
      IF arg(z)<>0 THEN PRINT "∠";DEG(arg(z));"°";
   END IF
   PRINT
END SUB
!-------------------- ここまでがサブルーチン


!---------- ↓↓↓↓↓ ----------
LET xmax=6 !<----- ※要調整
LET ymin=-50
LET ymax=5


!●回路図 CRローパス・フィルタ
!vi・─R1┬─・vo
!    C1
!     │
!    ≡
! 参考サイト http://sim.okawa-denshi.jp/CRlowkeisan.htm

LET R1=1.6e3 !1.6k[Ω]
LET C1=0.1e-6 !0.1μ[F]

DEF G(s)=1/(s*C1*R1+1) !入出力システムの伝達関数 G(s)=Vo/Vi=(1/(C1*R1))/(s+1/(C1*R1))
!---------- ↑↑↑↑↑ ----------


!!!SET bitmap SIZE 600,600 !画面を大きくする
SET WINDOW -0.5,xmax+0.5, ymin,ymax !表示領域
DRAW grid(1,5) !左端の目盛り

FOR f=1 TO xmax !x軸が対数
   PLOT TEXT ,AT f-0.3,-0.15: mid$("10  100 1k  10k 100k1M  10M 100M",4*(f-1)+1,4)
NEXT f

FOR xx=0 TO xmax STEP 0.025 !周波数[Hz]
   LET f=10^xx !xx=LOG10(f)
   LET t=ABS(G(j*w))
   PLOT LINES: xx,20*LOG10(t); !利得[dB]
NEXT xx
PLOT LINES


SET TEXT COLOR 2
FOR k=ymax TO ymin STEP -5 !右端の縦軸目盛り
   PLOT TEXT ,AT xmax,k: STR$(k*2)&"°" !※利得のグラフに合わせるために2倍する
NEXT k

SET LINE COLOR 2
FOR xx=0 TO xmax STEP 0.05 !周波数[Hz]
   LET f=10^xx
   LET th=arg(G(j*w))
   IF th>0 THEN LET th=th-2*PI !0~-2πへ補正する <----- ※要調整
   PLOT LINES: xx,DEG(th)/2; !位相θ[deg] ※利得のグラフに合わせるために1/2倍する
NEXT xx
PLOT LINES


END


●伝達関数による過渡解析
OPTION ARITHMETIC COMPLEX

DECLARE EXTERNAL SUB IFFT !逆フーリエ変換

DEF C(s)=G(s)*R(s) !応答関数
DEF R(s)=1/s !指令関数 ※ステップ関数

LET Vi=1 !1∠0°[V] ※仮の電圧源


!----- ↓↓↓↓↓ -----
LET T=2e-3 !時間区間 [0,T]


!●回路図 CRローパス・フィルタ
!vi・─R1┬─・vo
!    C1
!     │
!    ≡
! 参考サイト http://sim.okawa-denshi.jp/CRlowkeisan.htm

LET R1=1.6e3 !1.6k[Ω]
LET C1=0.1e-6 !0.1μ[F]

DEF G(s)=1/(s*C1*R1+1) !入出力システムの伝達関数 G(s)=Vo/Vi=(1/(C1*R1))/(s+1/(C1*R1))
!----- ↑↑↑↑↑ -----


!逆ラプラス変換
! f(t)=lim [ω→∞] { 1/(2π*j)∫F(s)*Exp(s*t)ds [γ-j*ω,γ+j*ω] }、jは虚数単位、γ>0とωは実数。
!s=γ+j*2πωとすると、ds=j*2πdω。
!これを上式に代入して、変形すると、
! f(t)=Exp(γt)∫F(γ,ω)*Exp(j*2πω)dω [-∞,∞]
!右辺の積分部分は逆フーリエ変換。

LET N=1024*8 !データ総数 ※2のべき乗、大きいほど精度がよい
DIM d(0 TO N-1) !入出力用配列

LET Gamma=5 !※3~7
!γを大きくすれば精度は上がりそうだが、
!あとでExp(γt)をかけるので、tが大きいところで発散する。

LET rr=Gamma/T !γを決める

FOR k=0 TO N/2 !変換データの作成
   LET Cs=C( COMPLEX(rr, 2*PI*k/T) ) !sk=γ+j*2π*k/T、k=0~n-1
   LET Hw=(COS(2*PI*k/N)+1)/2 !データは離散なため、ハニング関数をかけて平滑化する ※精度の向上
   LET d(k)=N/T*Cs*Hw !n/T*Y(k) * Hw 0~N/2

   IF NOT(k=0 OR k=N/2) THEN LET d(N-k)=COMPLEX(Re(d(k)),-Im(d(k))) !N-1~N/2+1は、共役複素数
NEXT k


CALL IFFT(d) !高速逆フーリエ変換


SET WINDOW -T/8,T,-Vi*1.2,Vi*1.2 !表示領域
DRAW grid(T/4,Vi/5)

PLOT TEXT ,AT T*7/8,0: "[秒]"

LET dt=T/N !時間刻み幅 ⊿t

FOR k=0 TO N-1 STEP 8 !結果の表示 [0,T]
   LET tt=k*dt !経過時間
   PLOT LINES: tt, Re(d(k))*EXP(rr*tt); !Exp(γt)をかける ※Exp(γ*k*T/n)、k=0~n-1
   PRINT Re(d(k))*EXP(rr*tt) !debug
NEXT k


END



EXTERNAL SUB IFFT(x()) !高速逆フーリエ変換 x() : 入力/出力データ
OPTION ARITHMETIC COMPLEX
DECLARE EXTERNAL SUB FFTMAIN
LET nx=SIZE(x)
LET theta=2*PI/nx ! W = Exp(-j * 2π/N * -1) = Exp(j * theta)とする
CALL FFTMAIN(x, theta)
MAT x=(1/nx)*x
END SUB

EXTERNAL SUB FFTMAIN(x(), theta)
OPTION ARITHMETIC COMPLEX
LET nx=SIZE(x)
IF MOD(nx, 2)<>0 THEN !DFTの計算
   DIM w(0 TO nx-1), xtmp(0 TO nx-1)
   MAT xtmp=x
   FOR k=0 TO nx-1
      LET tmp=theta*k
      FOR n=0 TO nx-1
         LET w(n)=EXP( COMPLEX(0, tmp*n) )
      NEXT n
      LET x(k)=DOT(w, xtmp)
   NEXT k
ELSE !2分して再帰呼出し
   LET hnx=nx/2
   DIM x0(0 TO hnx-1), x1(0 TO hnx-1)
   FOR k=0 TO hnx-1
      LET x0(k)=x(k)+x(k+hnx)
      LET wk=EXP( COMPLEX(0, theta*k) )
      LET x1(k)=wk*(x(k)-x(k+hnx))
   NEXT k
   CALL FFTMAIN(x0, 2*theta)
   CALL FFTMAIN(x1, 2*theta)
   FOR k=0 TO hnx-1
      LET x(2*k)=x0(k)
      LET x(2*k+1)=x1(k)
   NEXT k
END IF
END SUB
 

Re: 伝達関数によるフィルタ回路の周波数解析、過渡解析

 投稿者:山中和義  投稿日:2009年 2月16日(月)14時51分17秒
  > No.278[元記事へ]

伝達関数は、閉路方程式や節点方程式などで記述された連立方程式から導かれる。

差し替え
!●回路図 CRローパス・フィルタ
!vi・─R1┬─・vo
!    C1
!     │
!    ≡
! 参考サイト http://sim.okawa-denshi.jp/CRlowkeisan.htm

LET R1=1.6e3 !1.6k[Ω]
LET C1=0.1e-6 !0.1μ[F]

DEF G(s)=1/(s*C1*R1+1) !入出力システムの伝達関数 G(s)=Vo/Vi=(1/(C1*R1))/(s+1/(C1*R1))
!---------- ↑↑↑↑↑ ----------


この箇所を下記のプログラムに置き換える。

LET Vi=1 !1∠0°[V] ※仮の電圧源

FUNCTION Laplace(e$,Z,s) !ラプラス変換
   SELECT CASE UCASE$(e$)
   CASE "R"
      LET Laplace=Z !R*i(t)
   CASE "L"
      LET Laplace=s*Z !L*d{i(t)}/dt
   CASE "C"
      LET Laplace=1/(s*Z) !1/C*∫{i(t)}dt
   CASE ELSE
      PRINT "未サポートの素子です。"
      STOP
   END SELECT
END FUNCTION


!●回路図 CRローパス・フィルタ
!    a
!vi・─R1┬─・vo
!    C2
!     │
!    ≡
! 参考サイト http://sim.okawa-denshi.jp/CRlowkeisan.htm

!----- ↓↓↓↓↓ -----
LET M=2 !素子の数
!----- ↑↑↑↑↑ -----

DIM A(M,M),x(M),b(M) !A*x=b ※Z(s)*I(s)=E(s)
DIM iA(M,M)

FUNCTION G(s) !伝達関数
   MAT A=ZER !A(式の番号,素子の番号) ※下記の設定で0は省略するため、あらかじめ0を入れておく
   MAT b=ZER !b(式の番号) ※電流または電圧の和

   !---------- ↓↓↓↓↓ ----------
   LET R1=Laplace("R",1.6e3,s) !1.6k[Ω]
   LET C2=Laplace("C",0.1e-6,s) !0.1μ[F]


   !キルヒホッフの電流則
   LET A(1,1)=1 !節点a i1(t)-i2(t)=0 ⇒ I1(s)-I2(s)=0
   LET A(1,2)=-1

   !キルヒホッフの電圧則
   LET A(2,1)=R1 !網目 R1*i1(t) +1/C2*∫i2(t)dt =Vi(t) ⇒ R1*I1(s)+1/(s*C2)*I2(s)=Vi(s)
   LET A(2,2)=C2
   LET b(2)=Vi
   !---------- ↑↑↑↑↑ ----------

   MAT iA=INV(A)
   MAT x=iA*b !各素子の電流I(s)を求める
   !!!mat print x


   !---------- ↓↓↓↓↓ ----------
   LET Vo=C2*x(2) ! Vo(t)=1/C2*∫i2(t)dt ⇒ Vo(s)=1/(s*C2)*I2(s)
   !---------- ↑↑↑↑↑ ----------

   LET G=Vo/Vi
END FUNCTION
!---------- ↑↑↑↑↑ ----------
 

Re: 伝達関数によるフィルタ回路の周波数解析、過渡解析

 投稿者:大熊 正メール  投稿日:2009年 2月17日(火)12時23分48秒
  > No.279[元記事へ]

山中和義さんへのお返事です。

> 伝達関数は、閉路方程式や節点方程式などで記述された連立方程式から導かれる。
>
> 差し替え
>
> <PRE>
>
> !●回路図 CRローパス・フィルタ
> !vi・─R1┬─・vo
> !    C1
> !     │
> !    ≡
>
> LET R1=1.6e3 !1.6k[Ω]
> LET C1=0.1e-6 !0.1μ[F]
>
> DEF G(s)=1/(s*C1*R1+1) !入出力システムの伝達関数 G(s)=Vo/Vi=(1/(C1*R1))/(s+1/(C1*R1))
> !---------- ↑↑↑↑↑ ----------
> </PRE>
>
>
> この箇所を下記のプログラムに置き換える。
>
>
> <PRE>
>
> LET Vi=1 !1∠0°[V] ※仮の電圧源
>
> FUNCTION Laplace(e$,Z,s) !ラプラス変換
>    SELECT CASE UCASE$(e$)
>    CASE "R"
>       LET Laplace=Z !R*i(t)
>    CASE "L"
>
> !●回路図 CRローパス・フィルタ
> !    a
> !vi・─R1┬─・vo
> !    C2
> !     │
> !    ≡
>
> !----- ↓↓↓↓↓ -----
> LET M=2 !素子の数
> !----- ↑↑↑↑↑ -----
>
> DIM A(M,M),x(M),b(M) !A*x=b ※Z(s)*I(s)=E(s)
> DIM iA(M,M)
>
>    !---------- ↓↓↓↓↓ ----------
>    LET Vo=C2*x(2) ! Vo(t)=1/C2*∫i2(t)dt ⇒ Vo(s)=1/(s*C2)*I2(s)
>    !---------- ↑↑↑↑↑ ----------
>
>    LET G=Vo/Vi
> END FUNCTION
> !---------- ↑↑↑↑↑ ----------

*****************************

大熊です。
コピーして差し替えましたが最後の下記の部分
    LET G=Vo/Vi
END FUNCTION
!---------- ↑↑↑↑↑ ----------


LET G=Vo/Vi で「Gは関数名 文法上の誤り」と出て動きません。

敬具
 

Re: 伝達関数によるフィルタ回路の周波数解析、過渡解析

 投稿者:山中和義  投稿日:2009年 2月17日(火)13時09分15秒
  > No.281[元記事へ]

大熊 正さんへのお返事です。

> LET G=Vo/Vi で「Gは関数名 文法上の誤り」と出て動きません。

うまく切り貼りができていないようなので、最初のプログラムに差し替えたものを掲載します。
OPTION ARITHMETIC COMPLEX

LET j=SQR(-1) !虚数単位

LET f=60 !周波数[Hz]
DEF w=2*PI*f !角周波数ω

SUB DispS(z) !複素数をS表示する ※スタインメッツ(Steinmetz)
   PRINT ABS(z);
   IF ABS(z)<>0 THEN
      IF arg(z)<>0 THEN PRINT "∠";DEG(arg(z));"°";
   END IF
   PRINT
END SUB
!-------------------- ここまでがサブルーチン


!---------- ↓↓↓↓↓ ----------
LET xmax=6 !<----- ※要調整
LET ymin=-50
LET ymax=5


LET Vi=1 !1∠0°[V] ※仮の電圧源

FUNCTION Laplace(e$,Z,s) !ラプラス変換
   SELECT CASE UCASE$(e$)
   CASE "R"
      LET Laplace=Z !R*i(t)
   CASE "L"
      LET Laplace=s*Z !L*d{i(t)}/dt
   CASE "C"
      LET Laplace=1/(s*Z) !1/C*∫{i(t)}dt
   CASE ELSE
      PRINT "未サポートの素子です。"
      STOP
   END SELECT
END FUNCTION


!●回路図 CRローパス・フィルタ
!    a
!vi・─R1┬─・vo
!    C2
!     │
!    ≡
! 参考サイト http://sim.okawa-denshi.jp/CRlowkeisan.htm

!----- ↓↓↓↓↓ -----
LET M=2 !素子の数
!----- ↑↑↑↑↑ -----

DIM A(M,M),x(M),b(M) !A*x=b ※Z(s)*I(s)=E(s)
DIM iA(M,M)

FUNCTION G(s) !伝達関数
   MAT A=ZER !A(式の番号,素子の番号) ※下記の設定で0は省略するため、あらかじめ0を入れておく
   MAT b=ZER !b(式の番号) ※電流または電圧の和

   !---------- ↓↓↓↓↓ ----------
   LET R1=Laplace("R",1.6e3,s) !1.6k[Ω]
   LET C2=Laplace("C",0.1e-6,s) !0.1μ[F]


   !キルヒホッフの電流則
   LET A(1,1)=1 !節点a i1(t)-i2(t)=0 ⇒ I1(s)-I2(s)=0
   LET A(1,2)=-1

   !キルヒホッフの電圧則
   LET A(2,1)=R1 !網目 R1*i1(t) +1/C2*∫i2(t)dt =Vi(t) ⇒ R1*I1(s)+1/(s*C2)*I2(s)=Vi(s)
   LET A(2,2)=C2
   LET b(2)=Vi
   !---------- ↑↑↑↑↑ ----------

   MAT iA=INV(A)
   MAT x=iA*b !各素子の電流I(s)を求める
   !!!mat print x


   !---------- ↓↓↓↓↓ ----------
   LET Vo=C2*x(2) ! Vo(t)=1/C2*∫i2(t)dt ⇒ Vo(s)=1/(s*C2)*I2(s)
   !---------- ↑↑↑↑↑ ----------

   LET G=Vo/Vi
END FUNCTION
!---------- ↑↑↑↑↑ ----------


!!!SET bitmap SIZE 600,600 !画面を大きくする
SET WINDOW -0.5,xmax+0.5, ymin,ymax !表示領域
DRAW grid(1,5) !左端の目盛り

FOR f=1 TO xmax !x軸が対数
   PLOT TEXT ,AT f-0.3,-0.15: mid$("10  100 1k  10k 100k1M  10M 100M",4*(f-1)+1,4)
NEXT f

FOR xx=0 TO xmax STEP 0.025 !周波数[Hz]
   LET f=10^xx !xx=LOG10(f)
   LET t=ABS(G(j*w))
   PLOT LINES: xx,20*LOG10(t); !利得[dB]
NEXT xx
PLOT LINES


SET TEXT COLOR 2
FOR k=ymax TO ymin STEP -5 !右端の縦軸目盛り
   PLOT TEXT ,AT xmax,k: STR$(k*2)&"°" !※利得のグラフに合わせるために2倍する
NEXT k

SET LINE COLOR 2
FOR xx=0 TO xmax STEP 0.05 !周波数[Hz]
   LET f=10^xx
   LET th=arg(G(j*w))
   IF th>0 THEN LET th=th-2*PI !0~-2πへ補正する <----- ※要調整
   PLOT LINES: xx,DEG(th)/2; !位相θ[deg] ※利得のグラフに合わせるために1/2倍する
NEXT xx
PLOT LINES


END
 

Re: 伝達関数によるフィルタ回路の周波数解析、過渡解析

 投稿者:大熊 正メール  投稿日:2009年 2月18日(水)10時54分41秒
  > No.282[元記事へ]

山中和義さんへのお返事です。

> 大熊 正さんへのお返事です。
>
> > LET G=Vo/Vi で「Gは関数名 文法上の誤り」と出て動きません。
>
> うまく切り貼りができていないようなので、最初のプログラムに差し替えたものを掲載します。
>
>

大熊です。
今度はすぐ上手く動きました。お忙しい中、有難うございました。

過渡特性のプログラムも、こういうのが在ったらいいな・・・
と思っていた矢先でした。今後も大事に使わせていただきます。

敬具
 

戻る