Maximaでノイズ解析(1)ではオペアンプの出力にどのような電圧がでているのかを計算しました。
今回は、これを、物理的にきちんと意味のあるスペクトル表示にしたいと思います。
パワースペクトルの定義は
ここで、例えばX(ω)が電圧のデータだった場合にはS(ω)の単位はV2/Hzとなるのですが、データシートなどには、しばしばこれのルートを取ったV/rHz(rHzはルートヘルツと読む)という単位が使われています。
まず、Maximaでノイズ解析(1)の中で出てきたi1、i2、i3、i_n、e_nに関して次のように仮定してやればよろしいということはなんとなくわかります。
例のsubstを駆使すれば出来そうですが、さすがにちょっと面倒くさい。そこで、次のように考えます。とりあえず、v_outの式からi1の係数を引っ張り出す。係数を2乗する。それにs1を掛ける。i2、i3、i_n、e_nに関して同様の計算し、すべてを足し合わせるとSTになる・・・はず。
さていよいよ本題です。
ここまでの内容をnoise.mac.txtにアップしておきました。
今回は、これを、物理的にきちんと意味のあるスペクトル表示にしたいと思います。
パワースペクトル
ここでパワースペクトルの定義を考えます。パワースペクトルの定義は
S(ω)=lim(T → ∞) <X* X / T>でした。ここで、X=X(ω)は信号x(t)のフーリエ変換。Tはその測定時間。X*はXの複素共役でやんす。<・>はアンサンブル平均でしたよね?
ここで、例えばX(ω)が電圧のデータだった場合にはS(ω)の単位はV2/Hzとなるのですが、データシートなどには、しばしばこれのルートを取ったV/rHz(rHzはルートヘルツと読む)という単位が使われています。
無相関と仮定
ここで、Xがいくつかの成分の重ねあわせで書かれている場合を考えます。X=a1X1+a2X2+a3X3+a4X4+・・・のように定義されている場合を考えます。パワースペクトルを計算すると
ST=a1*a1<X1*X1>+a1*a2<X1*X2>+a1*a3<X1*X3>+・・・ ぎゃーとおそろしく複雑になるので、とりあえず違う成分は無相関であると仮定します。
Sij=<Xi*Xj>=0(i≠j)
実際に計算
では、オペアンプのノイズ解析に戻りましょう。上のようなパワースペクトルを計算する方法はいろいろあると思いますが、まぁ適当にやっていきましょう。まず、Maximaでノイズ解析(1)の中で出てきたi1、i2、i3、i_n、e_nに関して次のように仮定してやればよろしいということはなんとなくわかります。
S1=<i1*i1>;S2=<i2*i2>;S3=<i3*i3>;Si=<i_n*i_n>;Se=<e_n*e_n>;Sホニャララ=0ここで、a-は実数であると仮定しました(抵抗しか使ってないし)。
ST=a12S1+a22S2+a32S3+ai2Si+ae2Se
例のsubstを駆使すれば出来そうですが、さすがにちょっと面倒くさい。そこで、次のように考えます。とりあえず、v_outの式からi1の係数を引っ張り出す。係数を2乗する。それにs1を掛ける。i2、i3、i_n、e_nに関して同様の計算し、すべてを足し合わせるとSTになる・・・はず。
係数を引っ張り出す
では係数を引っ張り出して見ましょう。係数は英語でcoefficientですから、coeff~という関数がありそうです。という希望を旨に抱き、? coeffとinputと書かれているところに入力します。
(%i1) ? coeff;なにやらありましたね。番号を押せと書いているので早速0と入力してください。
0: COEFF :(maxima.info)Definitions for Polynomials.
1: LOGCONCOEFFP :Definitions for Logarithms.
2: PCOEFF :Definitions for Affine.
3: TAYLOR_ORDER_COEFFICIENTS :Definitions for Series.
Enterspace-separatednumbers,ALLorNONE:
Enterspace-separatednumbers,ALLorNONE:0;さてさて、目標にぴったりあった内容になってます。英語が嫌いという人は、ponpoko氏の日本語訳を参照してください。これをみると、ちゃんとした計算結果が出るためには、あらかじめ因数分解か展開をしておいてということなので、まず、あらかじめ展開をしておきます。いままでのnoise.macに次のように追加します。
Info from file C:/PROGRA~1/MAXIMA~1.1/info/maxima.info:
- Function: COEFF (exp, v, n)
obtains the coefficient of v**n in exp. n may be omitted if it is
1. v may be an atom, or complete subexpression of exp e.g., X,
SIN(X), A[I+1], X+Y, etc. (In the last case the expression (X+Y)
should occur in exp). Sometimes it may be necessary to expand or
factor exp in order to make v^n explicit. This is not done
automatically by COEFF.
(%i1) COEFF(2*A*TAN(X)+TAN(X)+B=5*TAN(X)+3,TAN(X));
(%o1) 2 A + 1 = 5
(%i2) COEFF(Y+X*%E**X+1,X,0);
(%o2) Y + 1
(%o1) false
tem1:expand(RHS(eqn1*fac))$ここでRHSというのは右辺(RightHandSide)のことです。左辺の場合はLHS。だから、これで、「tem1はeq1の右辺を展開したものである」という意味になります。行末の$は計算結果を表示しないときにつかいます。展開なんかされた結果なんか見たってわかんないですからね。eqn1などの定義も表示されるのがだんだんうるさくなってきたので、;を$に変えておきましょう。
さていよいよ本題です。
c0:ratsimp((coeff(tem1,e_n)));ここでratsimp(~)というのは~を一番簡単な形にするという関数で、Mathematicaで言うところのFullSimplifyに対応したようなものです。
c1:ratsimp((coeff(tem1,i_n)));
c2:ratsimp((coeff(tem1,i1)));
c3:ratsimp((coeff(tem1,i2)));
c4:ratsimp((coeff(tem1,i3)));
ここまでのまとめ
- わからない命令があったときは、
? キーワード
でヘルプが見られるので目的の関数があるか探す。 - 英語が面倒な人はponpoko氏のマニュアルを探す。
- coeff、ratsimp、RHS、LHSのヘルプをさがしてください。
実際にやってみたら
ここまでの内容をnoise.mac.txtにアップしておきました。
添付ファイル