「Maximaでノイズ解析(2)」の編集履歴(バックアップ)一覧はこちら
Maximaでノイズ解析(2) - (2006/03/06 (月) 14:03:57) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
<a href="../../naminami/pages/9.html" title=
"Maximaでノイズ解析(1) (4d)">Maximaでノイズ解析(1)</a>ではオペアンプの出力にどのような電圧がでているのかを計算しました。<br>
今回は、これを、物理的にきちんと意味のあるスペクトル表示にしたいと思います。<br>
<h2>パワースペクトル</h2>
ここでパワースペクトルの定義を考えます。<br>
パワースペクトルの定義は<br>
<blockquote>S(ω)=lim(T → ∞) <X<sup>*</sup> X / T><br></blockquote>
<img src="file:///C:/DOCUME%7E1/kawanami/LOCALS%7E1/Temp/moz-screenshot.jpg"
alt=""><img src=
"file:///C:/DOCUME%7E1/kawanami/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt=
""><img src=
"file:///C:/DOCUME%7E1/kawanami/LOCALS%7E1/Temp/moz-screenshot-2.jpg" alt=
"">でした。ここで、X=X(ω)は信号x(t)のフーリエ変換。Tはその測定時間。X<sup>*</sup>はXの複素共役でやんす。<・>はアンサンブル平均でしたよね?<br>
ここで、例えばX(ω)が電圧のデータだった場合にはS(ω)の単位はV<sup>2</sup>/Hzとなるのですが、データシートなどには、しばしばこれのルートを取ったV/rHz(rHzはルートヘルツと読む)という単位が使われています。<br>
<h3>無相関と仮定</h3>
ここで、Xがいくつかの成分の重ねあわせで書かれている場合を考えます。<br>
<blockquote>
X=a<sub>1</sub>X<sub>1</sub>+a<sub>2</sub>X<sub>2</sub>+a<sub>3</sub>X<sub>3</sub>+a<sub>4</sub>X<sub>4</sub>+・・・<br>
</blockquote>
のように定義されている場合を考えます。パワースペクトルを計算すると<br>
<blockquote>
ST=a<sub>1</sub><sup>*</sup>a<sub>1</sub><X<sub>1</sub><sup>*</sup>X<sub>1</sub>>+a<sub>1</sub><sup>*</sup>a<sub>2</sub><X<sub>1</sub><sup>*</sup>X<sub>2</sub>>+a<sub>1</sub><sup>*</sup>a<sub>3</sub><X<sub>1</sub><sup>*</sup>X<sub>3</sub>>+・・・ ぎゃー<br>
</blockquote>
とおそろしく複雑になるので、とりあえず違う成分は無相関であると仮定します。<br>
<blockquote>
S<sub>ij</sub>=<X<sub>i</sub><sup>*</sup>X<sub>j</sub>>=0(i≠j)<br></blockquote>
<h2>実際に計算</h2>
では、オペアンプのノイズ解析に戻りましょう。上のようなパワースペクトルを計算する方法はいろいろあると思いますが、まぁ適当にやっていきましょう。<br>
まず、<a href="../../naminami/pages/9.html" title=
"Maximaでノイズ解析(1) (4d)">Maximaでノイズ解析(1)</a>の中で出てきたi1、i2、i3、i_n、e_nに関して次のように仮定してやればよろしいということはなんとなくわかります。<br>
<blockquote>
S<sub>1</sub>=<i<sub>1</sub><sup>*</sup>i<sub>1</sub>>;S<sub>2</sub>=<i<sub>2</sub><sup>*</sup>i<sub>2</sub>>;S<sub>3</sub>=<i<sub>3</sub><sup>*</sup>i<sub>3</sub>>;S<sub>i</sub>=<i_n<sup>*</sup>i_n>;S<sub>e</sub>=<e_n<sup>*</sup>e_n>;Sホニャララ=0<br>
ST=a<sub>1</sub><sup>2</sup>S<sub>1</sub>+a<sub>2</sub><sup>2</sup>S<sub>2</sub>+a<sub>3</sub><sup>2</sup>S<sub>3</sub>+a<sub>i</sub><sup>2</sup>S<sub>i</sub>+a<sub>e</sub><sup>2</sup>S<sub>e</sub></blockquote>
ここで、a<sub>-</sub>は実数であると仮定しました(抵抗しか使ってないし)。<br>
例のsubstを駆使すれば出来そうですが、さすがにちょっと面倒くさい。そこで、次のように考えます。とりあえず、v_outの式からi1の係数を引っ張り出す。係数を2乗する。それにs1を掛ける。i2、i3、i_n、e_nに関して同様の計算し、すべてを足し合わせるとSTになる・・・はず。<br>
<h3>係数を引っ張り出す</h3>
では係数を引っ張り出して見ましょう。係数は英語でcoefficientですから、coeff~という関数がありそうです。という希望を旨に抱き、<br>
<blockquote>? coeff<br></blockquote>
とinputと書かれているところに入力します。<br>
<blockquote><span style="color: rgb(255, 0, 0);">(%i1)</span> <span style=
"color: rgb(51, 51, 255);">? coeff;</span><br>
0: COEFF :(maxima.info)Definitions for Polynomials.<br>
1: LOGCONCOEFFP :Definitions for Logarithms.<br>
2: PCOEFF :Definitions for Affine.<br>
3: TAYLOR_ORDER_COEFFICIENTS :Definitions for Series.<br>
<i><span style=
"color: rgb(255, 0, 0);">Enterspace-separatednumbers,ALLorNONE:</span></i><br></blockquote>
なにやらありましたね。番号を押せと書いているので早速0と入力してください。<br>
<blockquote><i><span style=
"color: rgb(255, 0, 0);">Enterspace-separatednumbers,ALLorNONE:</span></i><span style="color: rgb(51, 51, 255);">0;</span><br>
Info from file C:/PROGRA~1/MAXIMA~1.1/info/maxima.info:<br>
- Function: COEFF (exp, v, n)<br>
obtains the coefficient of v**n in exp. n may be omitted if it is<br>
1. v may be an atom, or complete subexpression of exp e.g., X,<br>
SIN(X), A[I+1], X+Y, etc. (In the last case the expression (X+Y)<br>
should occur in exp). Sometimes it may be necessary to expand or<br>
factor exp in order to make v^n explicit. This is not done<br>
automatically by COEFF.<br>
(%i1) COEFF(2*A*TAN(X)+TAN(X)+B=5*TAN(X)+3,TAN(X));<br>
(%o1) 2 A + 1 = 5<br>
(%i2) COEFF(Y+X*%E**X+1,X,0);<br>
(%o2) Y + 1<br>
<span style="color: rgb(153, 0, 0);">(%o1)</span> false<br></blockquote>
さてさて、目標にぴったりあった内容になってます。英語が嫌いという人は、<a href="http://www.bekkoame.ne.jp/%7Eponpoko/Math/maxima/maxima_4.html#IDX61">ponpoko氏の日本語訳を参照</a>してください。これをみると、ちゃんとした計算結果が出るためには、あらかじめ因数分解か展開をしておいてということなので、まず、あらかじめ展開をしておきます。いままでのnoise.macに次のように追加します。<br>
<blockquote>tem1:expand(RHS(eqn1*fac))$<br></blockquote>
ここでRHSというのは右辺(<b>R</b>ight<b>H</b>and<b>S</b>ide)のことです。左辺の場合はLHS。だから、これで、「tem1はeq1の右辺を展開したものである」という意味になります。行末の$は計算結果を表示しないときにつかいます。展開なんかされた結果なんか見たってわかんないですからね。eqn1などの定義も表示されるのがだんだんうるさくなってきたので、;を$に変えておきましょう。<br>
さていよいよ本題です。<br>
<blockquote>c0:ratsimp((coeff(tem1,e_n)));<br>
c1:ratsimp((coeff(tem1,i_n)));<br>
c2:ratsimp((coeff(tem1,i1)));<br>
c3:ratsimp((coeff(tem1,i2)));<br>
c4:ratsimp((coeff(tem1,i3)));<br></blockquote>
ここでratsimp(~)というのは~を一番簡単な形にするという関数で、Mathematicaで言うところのFullSimplifyに対応したようなものです。<br>
<h3>ここまでのまとめ</h3>
<ul>
<li>わからない命令があったときは、<br>
<pre>
? キーワード
</pre>
でヘルプが見られるので目的の関数があるか探す。</li>
<li>英語が面倒な人はponpoko氏のマニュアルを探す。<br></li>
<li>coeff、ratsimp、RHS、LHSのヘルプをさがしてください。</li>
</ul>
<br>
<a title="Maximaでノイズ解析(1) (4d)" href=
"http://www6.atwiki.jp/naminami/pages/9.html">Maximaでノイズ解析(1)</a>ではオペアンプの出力にどのような電圧がでているのかを計算しました。<br>
今回は、これを、物理的にきちんと意味のあるスペクトル表示にしたいと思います。<br>
<h2>パワースペクトル</h2>
ここでパワースペクトルの定義を考えます。<br>
パワースペクトルの定義は<br>
<blockquote>S(ω)=lim(T → ∞) <X<sup>*</sup> X / T><br></blockquote>
でした。ここで、X=X(ω)は信号x(t)のフーリエ変換。Tはその測定時間。X<sup>*</sup>はXの複素共役でやんす。<・>はアンサンブル平均でしたよね?<br>
ここで、例えばX(ω)が電圧のデータだった場合にはS(ω)の単位はV<sup>2</sup>/Hzとなるのですが、データシートなどには、しばしばこれのルートを取ったV/rHz(rHzはルートヘルツと読む)という単位が使われています。<br>
<h3>無相関と仮定</h3>
ここで、Xがいくつかの成分の重ねあわせで書かれている場合を考えます。<br>
<blockquote>
X=a<sub>1</sub>X<sub>1</sub>+a<sub>2</sub>X<sub>2</sub>+a<sub>3</sub>X<sub>3</sub>+a<sub>4</sub>X<sub>4</sub>+・・・<br>
</blockquote>
のように定義されている場合を考えます。パワースペクトルを計算すると<br>
<blockquote>
ST=a<sub>1</sub><sup>*</sup>a<sub>1</sub><X<sub>1</sub><sup>*</sup>X<sub>1</sub>>+a<sub>1</sub><sup>*</sup>a<sub>2</sub><X<sub>1</sub><sup>*</sup>X<sub>2</sub>>+a<sub>1</sub><sup>*</sup>a<sub>3</sub><X<sub>1</sub><sup>*</sup>X<sub>3</sub>>+・・・ ぎゃー<br>
</blockquote>
とおそろしく複雑になるので、とりあえず違う成分は無相関であると仮定します。<br>
<blockquote>
S<sub>ij</sub>=<X<sub>i</sub><sup>*</sup>X<sub>j</sub>>=0(i≠j)<br></blockquote>
<h2>実際に計算</h2>
では、オペアンプのノイズ解析に戻りましょう。上のようなパワースペクトルを計算する方法はいろいろあると思いますが、まぁ適当にやっていきましょう。<br>
まず、<a title="Maximaでノイズ解析(1) (4d)" href=
"http://www6.atwiki.jp/naminami/pages/9.html">Maximaでノイズ解析(1)</a>の中で出てきたi1、i2、i3、i_n、e_nに関して次のように仮定してやればよろしいということはなんとなくわかります。<br>
<blockquote>
S<sub>1</sub>=<i<sub>1</sub><sup>*</sup>i<sub>1</sub>>;S<sub>2</sub>=<i<sub>2</sub><sup>*</sup>i<sub>2</sub>>;S<sub>3</sub>=<i<sub>3</sub><sup>*</sup>i<sub>3</sub>>;S<sub>i</sub>=<i_n<sup>*</sup>i_n>;S<sub>e</sub>=<e_n<sup>*</sup>e_n>;Sホニャララ=0<br>
ST=a<sub>1</sub><sup>2</sup>S<sub>1</sub>+a<sub>2</sub><sup>2</sup>S<sub>2</sub>+a<sub>3</sub><sup>2</sup>S<sub>3</sub>+a<sub>i</sub><sup>2</sup>S<sub>i</sub>+a<sub>e</sub><sup>2</sup>S<sub>e</sub></blockquote>
ここで、a<sub>-</sub>は実数であると仮定しました(抵抗しか使ってないし)。<br>
例のsubstを駆使すれば出来そうですが、さすがにちょっと面倒くさい。そこで、次のように考えます。とりあえず、v_outの式からi1の係数を引っ張り出す。係数を2乗する。それにs1を掛ける。i2、i3、i_n、e_nに関して同様の計算し、すべてを足し合わせるとSTになる・・・はず。<br>
<h3>係数を引っ張り出す</h3>
では係数を引っ張り出して見ましょう。係数は英語でcoefficientですから、coeff~という関数がありそうです。という希望を旨に抱き、<br>
<blockquote>? coeff<br></blockquote>
とinputと書かれているところに入力します。<br>
<blockquote><span style="COLOR: rgb(255,0,0)">(%i1)</span> <span style=
"COLOR: rgb(51,51,255)">? coeff;</span><br>
0: COEFF :(maxima.info)Definitions for Polynomials.<br>
1: LOGCONCOEFFP :Definitions for Logarithms.<br>
2: PCOEFF :Definitions for Affine.<br>
3: TAYLOR_ORDER_COEFFICIENTS :Definitions for Series.<br>
<i><span style=
"COLOR: rgb(255,0,0)">Enterspace-separatednumbers,ALLorNONE:</span></i><br></blockquote>
なにやらありましたね。番号を押せと書いているので早速0と入力してください。<br>
<blockquote><i><span style=
"COLOR: rgb(255,0,0)">Enterspace-separatednumbers,ALLorNONE:</span></i><span style="COLOR: rgb(51,51,255)">0;</span><br>
Info from file C:/PROGRA~1/MAXIMA~1.1/info/maxima.info:<br>
- Function: COEFF (exp, v, n)<br>
obtains the coefficient of v**n in exp. n may be omitted if it is<br>
1. v may be an atom, or complete subexpression of exp e.g., X,<br>
SIN(X), A[I+1], X+Y, etc. (In the last case the expression (X+Y)<br>
should occur in exp). Sometimes it may be necessary to expand or<br>
factor exp in order to make v^n explicit. This is not done<br>
automatically by COEFF.<br>
(%i1) COEFF(2*A*TAN(X)+TAN(X)+B=5*TAN(X)+3,TAN(X));<br>
(%o1) 2 A + 1 = 5<br>
(%i2) COEFF(Y+X*%E**X+1,X,0);<br>
(%o2) Y + 1<br>
<span style="COLOR: rgb(153,0,0)">(%o1)</span> false<br></blockquote>
さてさて、目標にぴったりあった内容になってます。英語が嫌いという人は、<a href="http://www.bekkoame.ne.jp/%7Eponpoko/Math/maxima/maxima_4.html#IDX61">ponpoko氏の日本語訳を参照</a>してください。これをみると、ちゃんとした計算結果が出るためには、あらかじめ因数分解か展開をしておいてということなので、まず、あらかじめ展開をしておきます。いままでのnoise.macに次のように追加します。<br>
<blockquote>tem1:expand(RHS(eqn1*fac))$<br></blockquote>
ここでRHSというのは右辺(<b>R</b>ight<b>H</b>and<b>S</b>ide)のことです。左辺の場合はLHS。だから、これで、「tem1はeq1の右辺を展開したものである」という意味になります。行末の$は計算結果を表示しないときにつかいます。展開なんかされた結果なんか見たってわかんないですからね。eqn1などの定義も表示されるのがだんだんうるさくなってきたので、;を$に変えておきましょう。<br>
さていよいよ本題です。<br>
<blockquote>c0:ratsimp((coeff(tem1,e_n)));<br>
c1:ratsimp((coeff(tem1,i_n)));<br>
c2:ratsimp((coeff(tem1,i1)));<br>
c3:ratsimp((coeff(tem1,i2)));<br>
c4:ratsimp((coeff(tem1,i3)));<br></blockquote>
ここでratsimp(~)というのは~を一番簡単な形にするという関数で、Mathematicaで言うところのFullSimplifyに対応したようなものです。<br>
<h3>ここまでのまとめ</h3>
<ul>
<li>わからない命令があったときは、<br>
<pre>
? キーワード
</pre>
でヘルプが見られるので目的の関数があるか探す。</li>
<li>英語が面倒な人はponpoko氏のマニュアルを探す。<br></li>
<li>coeff、ratsimp、RHS、LHSのヘルプをさがしてください。</li>
</ul>
<h3>実際にやってみたら</h3>
<a href=
"http://www6.atwiki.jp/naminami/?cmd=upload&act=open&pageid=10&file=Maxima.png"><img style="WIDTH: 648px; HEIGHT: 442px"
src=
"http://www6.atwiki.jp/naminami/?cmd=upload&act=open&pageid=10&file=Maxima.png"></a><br>
<br>
ここまでの内容を<a href=
"http://www6.atwiki.jp/naminami/?cmd=upload&act=open&pageid=10&file=noise.mac.txt">noise.mac.txt</a>にアップしておきました。
表示オプション
横に並べて表示:
変化行の前後のみ表示: