t-z amp theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/t-z amp_theory.pdft-z amp(trans-impedance...

19
- 1 - T-Z AMP のノイズと帯域幅(改訂版 Ver.2.0) 2012 年 3 月 細田 2005 年に作成した T-Z AMP の帯域幅とノイズについて、改訂版を示す。 改定点: 些細な間違いを訂正。 情報が不足していた部分を補強。 一部の数式を見やすくした。 定数を計算する C プログラムのソースを添付。 はじめに T-Z AMP の帯域幅とノイズについて調べたのでレポートしておく。T-Z AMP は微小電流ア ンプやフォトダイオードアンプ、および THz 検出アンテナ素子のプリアンプとして使用さ れるため、その理論を熟知しておくことが望ましく、そのため、このレポートを残しておく。 (1)T-Z AMP の基本 図1に基本回路を示す [ 例えば Ref 1]。T-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMP である。 内部抵抗=無限大の定電流源から内部抵抗 = 無限小の定電圧源にインピーダンス変換を行っ ていることからこの名前が付いている。なお、内部抵抗無限小の定電圧源というのは理想的 な OP-AMP の内部抵抗のことである。簡単な OP-AMP の理論(virtual short の考察)を使うと、 Vout は Vout = - (Iin * R) となる。 実際の回路において大きな影響を及ぼすのが入力容量 Cin である。この Cin のため、T-Z AMP には補償コンデンサー Cf が必要となり、そのため、帯域幅の制限やノイズの増加が起 こる(後述)。Cin は以下の容量の合成である。入力につないだ素子の容量+配線におけるケー ブル容量や浮遊容量+ OP-AMP 内部の入力容量。後述するように Cin はできるだけ小さい方 が望ましく、そのため高性能 T-Z AMP を作る際には、以下の対応が必要となる。1. 素子の 容量をできるだけ小さいものにする。2. 配線を長くしない。素子のすぐそばに T-Z AMP を + Cf R Iin Vout Cin + Cf R Iin Vout C2 R Cin T-Z AMP T-Z AMP

Upload: others

Post on 15-Mar-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 1 -

T-ZAMPのノイズと帯域幅(改訂版 Ver.2.0)  2012 年 3 月 細田

 2005 年に作成した T-ZAMP の帯域幅とノイズについて、改訂版を示す。

 改定点:些細な間違いを訂正。情報が不足していた部分を補強。一部の数式を見やすくした。定数を計算する C プログラムのソースを添付。

はじめに T-ZAMP の帯域幅とノイズについて調べたのでレポートしておく。T-ZAMP は微小電流アンプやフォトダイオードアンプ、および THz検出アンテナ素子のプリアンプとして使用されるため、その理論を熟知しておくことが望ましく、そのため、このレポートを残しておく。

(1)T-ZAMP の基本

 図1に基本回路を示す [ 例えば Ref1]。T-ZAMP(Trans-impedanceAMP、トランスインピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力する AMP である。内部抵抗=無限大の定電流源から内部抵抗 = 無限小の定電圧源にインピーダンス変換を行っていることからこの名前が付いている。なお、内部抵抗無限小の定電圧源というのは理想的なOP-AMPの内部抵抗のことである。簡単なOP-AMPの理論(virtualshortの考察)を使うと、Vout は Vout=-(Iin*R) となる。 実際の回路において大きな影響を及ぼすのが入力容量 Cin である。この Cin のため、T-ZAMP には補償コンデンサー Cf が必要となり、そのため、帯域幅の制限やノイズの増加が起こる(後述)。Cinは以下の容量の合成である。入力につないだ素子の容量+配線におけるケーブル容量や浮遊容量+ OP-AMP 内部の入力容量。後述するように Cin はできるだけ小さい方が望ましく、そのため高性能 T-ZAMP を作る際には、以下の対応が必要となる。1. 素子の容量をできるだけ小さいものにする。2. 配線を長くしない。素子のすぐそばに T-ZAMP を

+

Cf

RIinVout

Cin+

Cf

RIin Vout

C2 R

Cin

図1 T-Z AMP 基本回路 図2 ドリフト補償付き T-Z AMP

Page 2: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 2 -

置く。3. 素子から T-ZAMP まで信号を持ってくるシールドケーブルを短くする。なお、一般的な同軸ケーブルは 50pF/m の容量を持つ。4.OP-AMP になるべく入力容量の小さいものを使用する。 OP-AMP にはドリフトがあり、温度や経時変化で OP-AMP 入力から流れ出すオフセット電流値が変化する。そのようになると図1の回路では Vout の DC オフセットが変化する。それを防ぐためには図2のようにして、+, -入力のドリフトを相殺する。R は二つとも同じ値。C2=Cf+Cin とする。なお、この構成にすると図1よりもノイズは増えるので注意(R からの熱雑音による寄与が 2R 分となる)。図2は主に DC からの電流を測定することが重要である場合に使用する。交流成分のみが重要である場合には図1の方が周波数帯域やノイズの面で有利である。

(2)補償コンデンサー Cf

 Cf を入れる理由は OP-AMP を発振させないためである。OP-AMP 回路においては入力や出力にコンデンサー容量が接続されると不安定となり、発振する [1-3]。入力容量の接続に関しては、発振の理由は容量の接続によって新たなポールができるために、負帰還の位相が180 度以上に回って発振に至るものである。このポールをうち消すための一番簡単な補償法は、図1に示すように負帰還抵抗 R に並列に補償コンデンサーを入れ、ゼロを作ることである。 ポールとは応答関数において分母に複素関数論における極を作ることである。負帰還回路における全体の伝達関数G(s)において、G(s)=A/(ω1-s)である場合、s=ω1でポールができ、そこで位相が 45 度回った後、ω=10ω1で位相は約 90 度まで回る。通常、OP-AMP 自身、既に1つのポールを持っており、そのために、入力容量によって新たに追加されたポールのために、総計 180 度の位相回転となるため、そこ(ω=10ω1)で OP-AMP の open-loopgain>1であれば発振する。その場合、OP-AMP の最初のポールを ω0として、伝達関数は2次の式となり、G(s)=A/[(ω0-s)(ω1-s)] のように書ける。 ゼロとは、伝達関数 G(s) の分子に、ある周波数でゼロになる項を付け加えることである。すなわち、G(s)=A(ω2-s)であれば、G(s) はω=ω2でゼロとなる。もし、ω1=ω2とするなら、2次であった伝達関数の分母はうち消され、1次になるため、位相は 90 度までしか回らず、回路は安定化する。すなわち、G(s)=A(ω1-s)/[(ω0-s)(ω1-s)]=A/(ω0-s)。補償コンデンサーCfは抵抗Rと並列になった時にはゼロを作る。別の見方をすれば、Cfによって、入力容量で遅れる位相を Cf で進めて補正してやることになる。 以上より、Cf の最適値は以下の式で表される [2,3]。 GBP とは Gainbandwidthproduct であり、使用する OP-AMP のゲイン帯域幅である。OP-AMP のカタログに open-loopgain の図があった場合は、gain =0dB(ゲイン= 1)である点の周波数である。もし、gain=0dB の記述がない場合は、例えば gain=a で f という帯域までの増幅が可能と書いてあれば、GBP=a*fである。 以上の補償コンデンサーをいちいち計算するのが面倒なので、C でプログラムを作っておいた。そのプログラムのソースをこのレポート末尾の APPENDIX に添付しておく。

Page 3: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 3 -

(3)実際の T-ZAMP の帯域幅

 (2)で示された Cf を入れたために、T-ZAMP の帯域幅は以下の周波数まで落ちる。f2=1/(2πRCf)もし、Cf を入れないでよいのであれば T-ZAMP の帯域幅は GBP であるのだが、Cf によってf2 まで落ちてしまう。したがって、高速な T-ZAMP の実装や設計においては、なるべく小さな Cf で済むように入力容量 Cin を出来る限り小さく抑さえることが重要となる。実際の高速光通信用のフォトダイオードアンプにおいては、ダイオードとアンプは同一パッケージ内にあり、ボンディングワイヤーによってミリメートル以下の配線で結ばれている。また、フォトダイオードの直径もミリメートル以下であり、ダイオードの静電容量を極力減らすようになっている。

(4)Cf が無い場合の T-ZAMP のノイズ。

 Cf が無ければ T-ZAMP のノイズは単純であり。以下の寄与がある。

1. 電流電圧変換を行う抵抗 R の発生するノイズ VnR。熱ノイズの物理より、VnR はVnR=root[4kBTΔf]となる。(kB=Boltzmannconst.,T=temperature[K],Δf=bandwidth[Hz])。VnR は root[Hz] あたりでは VnR=root[4kBT]となる。詳細は(5)章を参照。

2. OP-AMP の入力の雑音電圧Vni(単位= volt/root[Hz])。T-ZAMP で使用する際は負帰還によって gain1のように使い、+-入力の間は virtualshort となるため、低周波数領域では出力への影響は同じ電圧量である Vni となる。なお、高周波領域では異なるが、それについては後述する。

3. OP-AMP の入力の雑音電流Ini(単位= ampere/root[Hz])。出力への反映は V=Ini*Rとなる。

 上記の3つの寄与があるが、低周波域用の T-ZAMP においては通常、OP-AMP を低ノイズのものを使用し、R として非常に高い抵抗のものを使用するため、一番効くのは1項の Rから出る熱ノイズである [2,3,5]。例えば、FET 入力型の高性能 OP-AMP では入力ノイズ電流が fA 以下のものも多く、この値が抵抗の熱ノイズ VnRを電流換算したもの(InR=VnR/R)を越えなければ R のノイズが主項であり、R が 1Gohm 程度でも成り立つことが多い。Vniに関しても低周波域では入力電流 I が抵抗 R で出力電圧Vに変わる V=IRを凌駕しなければ問題はない。したがって、高抵抗の R を用いる限りは無視できる。ちなみに、最近の高性能 OP-AMP の Vniは nV/root[Hz]のオーダーであるので、測りたい電流が出力で μV 以上の電圧に変わる場合はほとんど無視できる。 なお、使用する OP-AMP の Input bias current の最小値が測りたい電流値よりも小さくないと被測定電流を正しく測れないことは言うまでもない。したがって、OP-AMP の選択に関してはこの点も注意する必要がある。

(5)Cf が無い場合の T-ZAMP における帰還抵抗 R の S/N に対する寄与

Page 4: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 4 -

 ノイズの理論より、ノイズのスペクトルをホワイトノイズ(ガウス過程)とするなら、以下のことが成り立つ。Randomwalkと同様に考えられるので、試行回数Nに対して root[N]で増大する。また、ノイズの発生する電力は電圧と電流の積をそのまま時間積算したのでは+−がうち消してゼロとなってしまう。すなわち、実効値を取って積算するのでEI*を求める。一定の抵抗に流れるノイズ電流であれば Power=Sigmat[R I2 ]。このノイズ電流の実効値を取ると、root[Power/R] に相当する電流が抵抗に流れていることになる。 関連する事項として、フーリエー空間におけるパーセバルの定理がある。その定理によると、実空間におけるパワーを時間積算したもの、すなわち全パワーは、フーリエー空間(周波数空間)において、全ての周波数におけるパワーを積算したものに等しい。したがって、ノイズのパワーは観測している周波数帯域に比例する。前記に述べたようにノイズの実効的な電流や電圧はパワーの平方根(root)であるため、それらを周波数あたりに換算すると、/root[Hz]という単位になる。 ノイズ源が複数在った場合のノイズ計算は上記のことを考えれば以下のようになる。ノイズ源1と2のノイズ電圧を n1,n2とする。root[Hz] あたりの全ノイズnはn=root[n1*n1+n2*n2] となる。また、これはホワイトノイズの分布を表す Gaussian 分布において、二つのノイズ源の Gaussian(分散 σ1,σ2)が重畳した場合に、その分散がroot[σ1

2+σ22] となることからも明らかである。すなわち、exp[x2/σ12]*exp[x2/σ2

2]=exp[x2/(σ1

2+σ22)]。ゆえに新しい Gaussianの分散 σ = root[σ1

2+σ22]。以上はノイズの物理数学からの完全な帰結である。 周波数帯域がf である場合は、観測されるノイズは root[(n1*n1+n2*n2)*f] となる。 以上より、ノイズの寄与は積算時間や周波数帯域および観測回数の平方根(root)に関係していることが分かる。ここで、T-ZAMP の帰還抵抗 R によって発生する出力電圧を考えてみる。アンプの帯域幅または観測する帯域幅を f とすると、OP-AMP や入力素子のノイズによって発生するノイズは root[R*f] に比例する。これに対し、信号によって発生した電圧は+−が打ち消し合うことがないので、(常に正または負の値で、+−うち消すことがない)、R*fに比例する。したがって、S/N 比は root[R] に比例して増大する。これは、試行回数や積算時間の root に比例して S/N が改善されるのと同様な原理である。 以上より、T-ZAMP の S/N は root[R] に比例して良くなるので、後述する T-ZAMP の周波数応答を考慮しない限りできるだけ高抵抗の R を使用するのが良い。実際、高い周波数に対する応答を必要としない微少電流計における T-ZAMP では 1Gohm などという高抵抗が Rとして使用される。その場合、最大応答周波数は数 Hz からせいぜい 10Hz程度であるが DC的な微少電流を高感度、高 S/N で測りたい場合はこれでかまわない。このような DC 付近のT-ZAMP では、むしろ 1/fノイズの少ない OPAMP を選んだり、絶縁性を重視した実装や微少電流信号を AMP 部まで伝達するシールド法などに重点が移ってくる。 応答周波数を上げて、かつ S/N 良く信号を検出するには次章で述べる種々の考察によって最適な抵抗値を選ぶ必要が出てくる。

(6)Cf の在る場合の T-ZAMP のノイズ Cf を入れることは実際の T-ZAMP を安定に動作させる上でかかせない。なお、前章で述べた低周波数用の高抵抗を使用した T-ZAMP では Cf の値がそうとう小さくて済み、測りたい低周波の領域に対してはあまり大きな影響を与えないので以下の議論はあまり考えなくてもよい。

Page 5: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 5 -

 Cf を入れると(2)章に述べたように、まず、周波数帯域が制限を受ける。それ以上にT-ZAMP における高周波域において、ノイズが増大する。このノイズの増大は Cf を挿入した T-ZAMP における原理的なものであり、逃れることはできない。したがって、用途や測定条件によってどのように最適化を図るかが設計上重要となる。 図3は Cf を入れた場合のノイズの周波数分布を示す。縦軸は dB 表示の電圧を、横軸は対数を取った周波数軸を示す。なお、縦軸はノイズに対してはlog(volt/root[Hz])を示している。位相を示していない点を除き、Bode 線図と同様の記法である。図において OP-AMPopenloopgainで OP-AMPの開ループゲインを示す。ftは OP-AMPの帯域幅周波数(=GBP)である。周波数 f2から伸びる一点鎖線で示した線は Cf を挿入しなかったときの T-ZAMPの周波数特性(noisegain)であり、open-loopgain と 45 度以上の角度で交わるため、ここで負帰還の位相が 180 度近辺まで到達し、10 fOSC 近辺において発振に至る。これを防ぐために Cf でゼロを作った場合の noise gain 特性が f2 から水平に伸びる実線である。その後 noise gain はOP-AMP の open-loopgain の減少とともに f3 から減少する。 図において太い線で示したのがノイズの周波数特性である。点線で示したのが帰還抵抗 Rによって出力に発生する熱雑音である。十分に大きな抵抗値の R であれば、f2 よりも低周波域においてはこのノイズが支配的になるが、R が大きいほど S/N は上がる。ただし、R が大きいと f2 が下がり(2章参照)、帯域が取れないことになる。 ややこしいのは図に n(amp) および n(C) と示されたノイズである。n(amp) は OP-AMP から発生する入力の電圧ノイズ Vni が、Cinによって f1 に発生したポールによって OP-AMPの noise gain が増したせいで増幅されたものである。したがって、OP-AMP の電圧ノイズが

図3 T-Z AMP とノイズの周波数特性

Page 6: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 6 -

重要性を増すことが分かる。また、Cin が小さい方が良い方が分かる。n(amp) は以下の式で表される。f1 から f2 までの n(amp) の総量= [RMS]。単位は RMS である。ここで、f1=1/[2πR(Cin+Cf)]、 f2=1/[2πRCf]。 次に n(C) は十分に高周波になったために Cin と Cf のみがインピーダンス分として R よりも支配的になり、OP-AMP 回路のゲインが Cin と Cf のインピーダンス比によって決まる増幅器として作用するという周波数帯域での noisegain である。すなわち、gain=1+Z1/Z2。この帯域においては Cin と Cf によって分割された帰還抵抗によって決まる OP-AMP ゲインによって Vni が増幅されている。n(C) の総量は以下のように求まる。

[RMS]。ただし、f3=GBP/[(Cin+Cf)/Cf]。 以上より、高周波の T-ZAMP では、S/N を上げるには以下のことが重要。1. Cin をできるだけ小さくする。そうすると、Cf も小さくできるので、S/N も良くなるし、帯域も伸びる。また、必要な帯域の要求に対する R を大きくできるので S/N が良くなる。2. OP-AMP に Vni の小さいものを使う。なお、この第2項は測りたい最小電流値がどれぐらいかで以下の二つの分岐が生じる。まず、最小電流値が μA 以上であれば bipola 型の OP-AMP を使うことができる。bipola 型は tran-sistor で作られており、入力のバイアス電流値が大きいが Vni は小さいものが多い。最小検出電流はバイアス電流以下にすることは困難なので、最小電流で制限を受ける。第2の選択としては FET 入力型の OP-AMP を使う。FET 入力型は非常にバイアス電流値が小さいため、最小検出電流が pA 以下まで可能。なお、FET 入力型には Vni が大きかったり、GBP が小さいものが多いので OP-AMP の選択が難しいが、最近の最新型ではある程度使えそうなのが出てきている(例:AD8067,AD8065)。

(7)f2 以上の帯域で出るノイズの扱い T-ZAMPの帯域幅はf2までしか無く、(厳密にはf2は-3dB点。その後、-6dBで落ちていく。)それよりも高い周波数におけるノイズの発生はある種の計測には邪魔なだけである。特に高速な波形を測りたいオシロによる計測では重畳ノイズとなって波形を見えにくくする。これを逃げるには以下の二つの方法がある。なお、ある特定の周波数成分をロックイン検出する際には、その周波数が T-ZAMP の帯域内にある限りは問題は生じない。 第1の方法は信号が来るタイミングでオシロのトリガーをかけ、かつ、多数回の積算平均を取る方法である。ノイズはランダムなので、積算回数 N のルートに比例して S/N は改善されていく。 第2の方法は f2 以上の周波数帯をフィルターによって強制的に落とす方法である。この方法は参考文献3に詳しい。帯域を少々犠牲にしても良いなら、Cf の値を大きくすればよい。n(C) の減少が見込める。また、f2 以上の帯域をカットするローパスフィルターを入れる方法もある。この方法については筆者の別レポートに記した。注)もちろん、図3のノイズ線よりも十分上に信号電流 I *抵抗 R の積があれば、以上の考察は必要ない。

その他、実装法等については参考文献 1-3、5-8 を参照。     以上。

Page 7: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 7 -

参考文献

[1] OP アンプ回路の設計、岡村著、CQ 出版社 国内では有名な本。丁寧に書いてあり、初心者によい。また、実際の使用法にも詳しい。ただし、詳細に関する理論はあまり載っていないので、[2] を参考にするのがよい。

[2] OpAmpApplicationsHandbook,Ed.WaltJung,NewnesElsevier AnalogDevices の技術者達が書いているだけあって、載っていないことはないと思えるほど OP-AMP に関することは全て載っている。また、理論的なことも載っており、この本を読むだけで OP-AMP のことは全て分かる。 Sec.1-4 に OP-AMP のノイズ等に関する一般理論が、Sec.4-4 に T-ZAMP に関する理論やノイズの話がある。[4] と併読するとよい。

[3] PhotodiodeAmplifiers,JeraldGraeme,McGrawHill フォトダイオードを使用する際に使われるアンプについて非常に詳しい。T-ZAMP のノイズに関して詳しく解説してある。また、ローパスフィルターの必要性についても詳しい。[2]をある程度理解したなら、[3] で実際の対応を知るのがよい。なお、筆者はバーブラウンの技術者だった。

[4] NoiseandOperationalAmplifierCirvuits,ApplicationNoteAN-358,AnologDevices.(インターネットより PDF が取れる。) OP-AMP 回路のノイズに関して理論的に詳しく書かれている。

[5] Low-NoiseElectronicSystemsDesign,C.D.MotchenbacherandJ.A.Connelly,WileyInterscience 低雑音アンプについて、T-ZAMP 以外にいろいろ解説されている。なお、T-ZAMP に関してはあまり多くのページはさかれていない。

[6] センサ活用 141 の実践ノウハウ、松井著、CQ 出版社 実際に OP-AMP やその回路を使う上で参考になる記述も多い。T-ZAMP や光検出に関係する部分も多い。なお、筆者の思いこみによる理論的には間違っている記述や式もあるので注意。

[7] OP アンプ活用 100 の実践ノウハウ、松井著、CQ 出版社 OP-AMP やその応用回路について、実際面でいろいろ参考になるところも多い。T-ZAMPの記述も幾つかある。なお、筆者の思いこみによる理論的には間違っている解釈や式もあるので注意。

[8] トランジスタ技術 SPECIAL:OP アンプによる実用回路設計、CQ 出版社 フィルター設計について詳しい。主にアクティブフィルターを扱っているが、パッシブ型についても記述有り。

Page 8: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 8 -

APPENDIX

(1)T-ZAMP を設計する際に回路定数を求めるためのプログラム

以下にその C プログラムを示す。使い方:最初にアンプ等の定数を入力すると計算値が出る。定数を変えたければ、最初の計算後に Y をキー入力してパラメーターを振ることができる。パラメーターを変更後、0キー、改行で再計算を起動できる。注:ソース中の ¥ 文字は、コンパイラーによっては \ 文字(マックだと option キーを押したままで ¥ キーを押す)に置き換えないとエラーが出る場合があります。プログラムの停止は Unix だと Control-C で行う。

/* T-ZAMPnoisecalc.Totalnoiseevaluationversion.*/

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#include<ctype.h>

/*constants*/#define pai 3.1415927#define kb 1.38e-23/*Boltzmanconst.*/#define T 300.0/*Temperature[K]*/

#define N 50/*legendarraysize.Ntimeshistorycanbestored.*/

int flag[N];double aft[N],af[N],ar[10],acin[N],acf[N],aopvn[N],anoise[N];double ain[N];

intmain(void){

int nn,i,j,flg,flgc;char YorN[30];

double f,ft,r,cin,cf;double vn,vr,vir,opvn,in;double f1,f2,f3;double vn1,vn2,vn3,vnr,vnir;double noise;

double p2,hpai;

Page 9: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 9 -

p2 = pai*2.0; hpai = pai/2.0;

for(i=0;i<10;i++) flag[i]=0; j=0; flg=0; flgc=0; printf( “T-ZAMPparametercalc.¥n” ); printf( “Iftheinputft<=0,thenstop.¥n” ); printf( “¥n” );

printf( “¥n” ); printf( “OP-AMPft[MHz]=?“); scanf( “%le” ,&ft); if(ft<=0.0){printf( “End¥n” ); return-1;} ft*=1.0e6; printf( “OP-AMPinputVnoise[nV/root(Hz)]=?“); scanf( “%le” ,&opvn); opvn*=1.0e-9;

printf( “OP-AMPinputInoise[fA/root(Hz)]=?“); scanf( “%le” ,&in); in*=1.0e-15;

printf( “R[k-ohm]=?“); scanf( “%le” ,&r); if(r<=0.0){printf( “End¥n” ); return-1;} r*=1.0e3; printf( “TotalinputC[pF]=?“); scanf( “%le” ,&cin); cin*=1.0e-12;

do{ if(flgc==0) { f=0.5*sqrt(ft/(p2*r*cin)); cf=2.0*sqrt(cin/(p2*r*ft)); } else { f=1.0/(p2*r*cf); flgc=0; flag[j]=1; } printf( “¥nT-ZAMPbandwidth=%g[MHz]¥n” ,f/1.0e6); printf( “compensationC(Cf)=%g[pF]¥n” ,cf*1.0e12);

Page 10: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 10 -

vn=4.0*kb*T*r; vr=sqrt(vn); printf( “V-noisefromR=%g[nV/root(Hz)]¥n” ,vr*1.0e9); vir=in*r; printf( “I-noisebyR=%g[nV/root(Hz)]¥n” ,vir*1.0e9);

f1=1.0/(p2*r*(cin+cf)); printf( “¥nAMPCnoiseup-frequency=%6.2f[MHz]¥n” ,f1/1.0e6); f2=1.0/(p2*r*cf); printf( “AMPCnoiseholdfrequency=%6.2f[MHz]¥n” ,f2/1.0e6); f3=ft/((cin+cf)/cf); printf( “AMPCnoisedownfrequency=%6.2f[MHz]¥n” ,f3/1.0e6); vnr=sqrt(vn*f2*hpai); vnir=vir*sqrt(f2*hpai); vn1=opvn*sqrt(f1); vn2=opvn*sqrt((cin+cf)/cf)*sqrt(f2-f1); vn3=opvn*(cin+cf)/cf*sqrt(f3*hpai); printf( “¥nNoise¥nfromR,AMPVonly,AMPIbyR,Cnoise2,Cniose3=¥n” ); printf( “%5.1f,%5.1f,%5.1f,%5.1f,%5.1f[uV/RMS]¥n” , vnr*1.0e6,vn1*1.0e6,vnir*1.0e6,vn2*1.0e6,vn3*1.0e6); noise=sqrt(vnr*vnr+vn1*vn1+vnir*vnir+vn2*vn2+vn3*vn3); printf( “totalnoise=%7.2f[uV/RMS]¥n” ,noise*1.0e6); printf( “¥n¥n” ); if(flg==0) {/*storeresultsintolegendarrays*/ aft[j]=ft; af[j]=f; ar[j]=r; acin[j]=cin; acf[j]=cf; aopvn[j]=opvn; ain[j]=in; anoise[j]=noise; if(j<N)j++; if(j>=N) { flg=1;/*legendstop*/ j--; printf( “Legendstoreisfull!¥n” ); } }

/*changeparameters?*/ if(j<=1) { printf( “Changeparameters?Y/N?“);

Page 11: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 11 -

scanf( “%s” ,YorN);

if(strcmp(YorN,“N” )==0||strcmp(YorN,“n” )==0) {printf( “¥nEnd¥n¥n” );return0;}

printf( “¥nParamterchangeisON.¥n” ); } else { printf( “¥nResulthistry.¥n” ); printf( “BW=T-ZAMPbandwidth[MHz],ANV=AMPVnoise[nV/rootHz],¥n” ); printf( “ANI=AMPInoise[fA/rootHz],TN=totalnoise[uVRMS].¥n” ); printf( “*markindicatesforcedCfspecification.¥n¥n” ); for(i=0;i<j;i++) { printf( “ft=%g,“,aft[i]/1.0e6); printf( “ANV=%g,“,aopvn[i]*1.0e9); printf( “ANI=%g,“,ain[i]*1.0e15); printf( “R=%g,“,ar[i]/1.0e3); printf( “Cin=%g,“,acin[i]*1.0e12); printf( “BW=%g,“,af[i]/1.0e6); if(flag[i]!=0) printf( “*” ); printf( “Cf=%6.2f,“,acf[i]*1.0e12); printf( “TN=%7.2f¥n” ,anoise[i]*1.0e6); } if(flg!=0) { printf( “Legendstoreisfull!¥n” ); } printf( “¥n” ); } nn=1; while(nn!=0) { printf( “Whatofparametersdoyouchange?¥n” ); printf( “(0)Calculateresult.¥n” ); printf( “(1)OP-AMPft=%g[MHz]¥n” ,ft/1.0e6); printf( “(2)OP-AMPinputVnoise=%g[nV/root(Hz)]¥n” ,opvn*1.0e9); printf( “(3)OP-AMPinputInoise=%g[fA/root(Hz)]¥n” ,in*1.0e15); printf( “(4)R=%g[k-ohm]¥n” ,r/1.0e3); printf( “(5)TotalinputC=%g[pF]¥n” ,cin*1.0e12); printf( “(6)Specify(notauto-calc.)Cf=%g[pF]¥n” ,cf*1.0e12); printf( “¥nInputnumber?“); scanf( “%d” ,&nn); if(nn==0)break; if(nn>6&&nn<0)continue;

switch(nn) {

Page 12: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 12 -

case1: printf( “OP-AMPft[MHz]=?“); scanf( “%le” ,&ft); if(ft<=0.0) continue; ft*=1.0e6; break; case2: printf( “OP-AMPinputVnoise[nV/root(Hz)]=?“); scanf( “%le” ,&opvn); opvn*=1.0e-9; break; case3: printf( “OP-AMPinputInoise[fA/root(Hz)]=?“); scanf( “%le” ,&in); in*=1.0e-15; break; case4: printf( “R[k-ohm]=?“); scanf( “%le” ,&r); if(r<=0.0) continue; r*=1.0e3; break; case5: printf( “TotalinputC[pF]=?“); scanf( “%le” ,&cin); cin*=1.0e-12; break; case6: printf( “CompensationcapacitorCf[pF]=?“); scanf( “%le” ,&cf); cf*=1.0e-12; flgc=1; break; }/*ENDofswitch()*/ }/*endofwhile*/

}while(1);/*endofdo*/ printf( “¥nEnd.¥n” ); return0;}

(2)ある周波数におけるノイズ密度を計算するプログラム ロックイン検出を行う場合など、そのロックイン周波数でどの程度ノイズが出ているか知りたいことがある。また、その周波数でノイズを減らす設計を行う場合などにこのプログラ

Page 13: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 13 -

ムで設計を行う。使い方はプログラムを読み取ってください。

/* T-ZAMPnoisecalc.Noiseatspecificfrequencyevaluationversion.*/

/*Developmenthistry.ver.1Initialversion.ver.2DisplayS/Nratio.Somebugsarefixed.*/

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#include<ctype.h>

/*constants*/#define pai 3.1415927#define kb 1.38e-23/*Boltzmanconst.*/#define T 300.0/*Temperature[K]*/

#define N 50/*legendarraysize.Ntimeshistorycanbestored.*/

int flag[N];double aft[N],af[N],ar[10],acin[N],acf[N],aopvn[N],anoise[N];double ain[N],ai_noise[N],anr[N],af0[N],aib[N],asn[N],ati[N];

intmain(void){

int nn,i,j,flg,flgc;

char YorN[30];

double f,ft,r,cin,cf;double f0;double vn,vr,vir,opvn,in,ib;double f1,f2,f3;double vn1,vn2,vn3,vnr,vnir;double noise,i_noise;/*i_noise=translatedinputnoisecurrentfromthevoltagenoise*/double imin;double nsr,nsv,nsi,z1,z2,z3;double sn,ti;

Page 14: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 14 -

double p2,hpai;

p2 = pai*2.0; hpai = pai/2.0;

for(i=0;i<10;i++) flag[i]=0; j=0; flg=0; flgc=0; printf( “T-ZAMPatspecificfrequencycalc.Ver.2¥n” ); printf( “Iftheinputft<=0,thenstop.¥n” ); printf( “¥n” );

printf( “¥n” ); printf( “IndicateLock-Infrequency[kHz]=?“); scanf( “%le” ,&f0); f0*=1.0e3;

printf( “¥n” ); printf( “OP-AMPft[MHz]=?“); scanf( “%le” ,&ft); if(ft<=0.0){printf( “End¥n” ); return-1;} ft*=1.0e6; printf( “OP-AMPinputbiascurrent[pA]=?“); scanf( “%le” ,&ib); ib*=1.0e-12;

printf( “OP-AMPinputVnoise[nV/root(Hz)]=?“); scanf( “%le” ,&opvn); opvn*=1.0e-9;

printf( “OP-AMPinputInoise[fA/root(Hz)]=?“); scanf( “%le” ,&in); in*=1.0e-15;

printf( “R[k-ohm]=?“); scanf( “%le” ,&r); if(r<=0.0){printf( “End¥n” ); return-1;} r*=1.0e3; printf( “TotalinputC[pF]=?“); scanf( “%le” ,&cin); cin*=1.0e-12; printf( “Targetcurrent(ex.10pA)[pA}=?“); scanf( “%le” ,&ti); ti*=1.0e-12;

do{

Page 15: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 15 -

if(flgc==0) { f=0.5*sqrt(ft/(p2*r*cin)); cf=2.0*sqrt(cin/(p2*r*ft)); } else { f=1.0/(p2*r*cf); flag[j]=1; } printf( “¥nT-ZAMPbandwidth=%g[kHz]¥n” ,f/1.0e3); printf( “compensationC(Cf)=%g[pF]¥n” ,cf*1.0e12); vn=4.0*kb*T*r; vr=sqrt(vn); printf( “V-noisefromR=%g[nV/root(Hz)]¥n” ,vr*1.0e9); vir=in*r; printf( “I-noisebyR=%g[nV/root(Hz)]¥n” ,vir*1.0e9);

f1=1.0/(p2*r*(cin+cf)); printf( “¥nAMPCnoiseup-frequency=%6.2f[kHz]¥n” ,f1/1.0e3); f2=1.0/(p2*r*cf); printf( “AMPCnoiseholdfrequency=%6.2f[kHz]¥n” ,f2/1.0e3); f3=ft/((cin+cf)/cf); printf( “AMPCnoisedownfrequency=%6.2f[kHz]¥n” ,f3/1.0e3); if(f0<=f1) { nsr=vr; nsv=opvn; nsi=vir; } elseif((f0>f1)&&(f0<=f2)) { nsr=vr; nsv=opvn*((cin+cf)/cf)*((f0-f1)/(f2-f1))+opvn; nsi=vir; } else { nsr=vr; nsv=opvn*((cin+cf)/cf)+opvn; nsi=vir; } printf( “¥nNoiseat%g[kHz]¥n” ,f0/1.0e3); printf( “fromR,fromAMPVnoise,AMPIbyR=¥n” ); printf( “%5.1f,¥t%5.1f,¥t¥t%5.1f[nV/rootHz]¥n” , nsr*1.0e9,nsv*1.0e9,nsi*1.0e9); noise=sqrt(nsr*nsr+nsv*nsv+nsi*nsi); printf( “totalnoise=%7.2f[nV/rootHz]¥n” ,noise*1.0e9); i_noise=noise/r;

Page 16: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 16 -

printf( “Biascurrentandeffectivenoisecurrent=%g,%g[pA].¥n” , ib*1.0e12,i_noise*1.0e12); if(ib>i_noise) { imin=ib; } else imin=i_noise; sn=(ti*r)/noise; printf( “Detectablemimimumcurrentis%g[pA]?¥n” ,imin*1.0e12); printf( “Outputvoltagebytheminimumcurrent=%g[nV].¥n” ,imin*r*1.0e9); printf( “OutputvoltagebyI_noise=%g[nV/rootHz].¥n” ,i_noise*r*1.0e9); printf( “Outputvoltageat%gpAinput=%g[nV]=%8.4f[mV].¥n” , ti*1.0e12,ti*r*1.0e9,ti*r*1.0e6); printf( “S/Nratioatoutputvoltagefor%gpAinput=%g.¥n” ,ti*1.0e12,sn); printf( “¥n¥n” ); if(flg==0) {/*storeresultsintolegendarrays*/ aft[j]=ft; af[j]=f; ar[j]=r; acin[j]=cin; acf[j]=cf; aopvn[j]=opvn; ain[j]=in; anoise[j]=noise; ai_noise[j]=i_noise; anr[j]=nsr; aib[j]=ib; af0[j]=f0; ati[j]=ti; asn[j]=sn; if(j<N)j++; if(j>=N) { flg=1;/*legendstop*/ j--; printf( “Legendstoreisfull!¥n” ); } }

/*changeparameters?*/ if(j<=1) { printf( “Changeparameters?Y/N?“); scanf( “%s” ,YorN);

Page 17: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 17 -

if(strcmp(YorN,“N” )==0||strcmp(YorN,“n” )==0) {printf( “¥nEnd¥n¥n” );return0;}

printf( “¥nParameterchangeisON.¥n” ); } else { printf( “¥nResulthistry.¥n” ); printf( “BW=T-ZAMPbandwidth[MHz],ANV=AMPVnoise[nV/rootHz],Ib=biasI[fA]¥n” ); printf( “ANI=AMPInoise[fA/rootHz],TN=totalnoise[nVRMS]¥n” ); printf( “IN= translated inputnoise I [pA/rootHz], RN=noise fromR [nV/rootHz].¥n” ); printf( “TI=targetcurrent,S/N=S/NatTI.¥n” ); printf( “*markindicatesforcedCfspecification.#indicateBW<f0.¥n¥n” ); for(i=0;i<j;i++) { printf( “ft=%g,“,aft[i]/1.0e6); printf( “ANV=%g,“,aopvn[i]*1.0e9); printf( “Ib=%g,“,aib[i]*1.0e12); printf( “ANI=%g,“,ain[i]*1.0e15); printf( “R=%g,“,ar[i]/1.0e3); printf( “Cin=%g,“,acin[i]*1.0e12); if(af[i]<af0[i])printf( “#” ); printf( “BW=%g,“,af[i]/1.0e3); if(flag[i]!=0) printf( “*” ); printf( “Cf=%6.2f,¥n” ,acf[i]*1.0e12); printf( “Lockf=%7.2f,“,af0[i]/1.0e3); printf( “TN=%7.2f,“,anoise[i]*1.0e9); printf( “IN=%7.2f,“,ai_noise[i]*1.0e12); printf( “RN=%7.2f,“,anr[i]*1.0e9); printf( “TI=%g,“,ati[i]*1.0e12); printf( “S/N=%g¥n” ,asn[i]); } if(flg!=0) { printf( “Legendstoreisfull!¥n” ); } printf( “¥n” ); } nn=1; while(nn!=0) { printf( “Whatofparametersdoyouchange?¥n” ); printf( “(0)Calculateresult.¥n” ); printf( “(1)OP-AMPft=%g[MHz]¥n” ,ft/1.0e6); printf( “(2)OP-AMPinputVnoise=%g[nV/root(Hz)]¥n” ,opvn*1.0e9); printf( “(3)OP-AMPinputInoise=%g[fA/root(Hz)]¥n” ,in*1.0e15); printf( “(4)R=%g[k-ohm]¥n” ,r/1.0e3); printf( “(5)TotalinputC=%g[pF]¥n” ,cin*1.0e12);

Page 18: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 18 -

printf( “(6)Cf=%g[pF]“,cf*1.0e12); if(flgc==0)printf( “:AUTO¥n” ); else printf( “:FIXED¥n” ); printf( “(7)OP-AMPinputbiascurrent=%g[pA]¥n” ,ib*1.0e12); printf( “(8)Lock-Infrequency=%g[kHz]¥n” ,f0/1.0e3); printf( “(9)Targetinputcurrent=%g[pA]¥n” ,ti*1.0e12); printf( “¥nInputnumber?“); scanf( “%d” ,&nn); if(nn==0)break; if(nn>10&&nn<0)continue;

switch(nn) { case1: printf( “OP-AMPft[MHz]=?“); scanf( “%le” ,&ft); if(ft<=0.0) continue; ft*=1.0e6; break; case2: printf( “OP-AMPinputVnoise[nV/root(Hz)]=?“); scanf( “%le” ,&opvn); opvn*=1.0e-9; break; case3: printf( “OP-AMPinputInoise[fA/root(Hz)]=?“); scanf( “%le” ,&in); in*=1.0e-15; break; case4: printf( “R[k-ohm]=?“); scanf( “%le” ,&r); if(r<=0.0) continue; r*=1.0e3; break; case5: printf( “TotalinputC[pF]=?“); scanf( “%le” ,&cin); cin*=1.0e-12; break; case6: printf( “Iftype0,thenCfcalculationmode=AUTO,elseFIXED¥n” ); printf( “CompensationcapacitorCf[pF]=?“); scanf( “%le” ,&cf); if(cf==0.0) { flgc=0; } else { flgc=1;

Page 19: T-Z AMP theory2a-phys.eng.osaka-cu.ac.jp/hosoda-g/site1/T-Z AMP_Theory.pdfT-Z AMP(Trans-impedance AMP、トランスイン ピーダンス・アンプ、電流電圧変換アンプ)は電流入力を電圧に変えて出力するAMPである。

- 19 -

cf*=1.0e-12; } break; case7: printf( “OP-AMPinputbiascurrent[pA]=?“); scanf( “%le” ,&ib); if(r<=0.0) continue; ib*=1.0e-12; break; case8: printf( “Lock-Infrequency[kHz]=?“); scanf( “%le” ,&f0); f0*=1.0e3; break; case9: printf( “Targetinputcurrent[pA]=?“); scanf( “%le” ,&ti); ti*=1.0e-12; break; }/*ENDofswitch()*/ }/*endofwhile*/

}while(1);/*endofdo*/ printf( “¥nEnd.¥n” ); return0;}