帰還増幅回路 — 負帰還による安定化と特性改善

オーディオアンプのボリュームを回したとき、利得が2倍に跳ね上がったり半分に落ちたりしたら困りますよね。温度が変わるたびに音量が勝手に変わるスピーカーも使い物になりません。しかし、トランジスタの特性は温度や個体差で大きく変動します。では、どうやって安定した増幅器を作るのでしょうか?

その答えが負帰還(ネガティブフィードバック)です。出力の一部を入力に「逆向き」に戻すことで、利得を自発的に安定化させる巧妙な仕組みです。

負帰還の原理は増幅回路にとどまらず、制御工学のフィードバック制御、生物の体温調節(恒常性)、さらには経済学の市場均衡メカニズムまで、驚くほど広い分野に現れます。エレクトロニクスの分野では、オペアンプの設計から通信用増幅器、ADコンバータまで、ほぼすべてのアナログ回路設計の基盤となっています。

本記事の内容

  • 負帰還の基本概念(帰還率$\beta$、ループ利得$A\beta$)
  • 負帰還がもたらす4つの効果(利得安定化、帯域幅拡大、歪み低減、インピーダンス変化)
  • 4つの帰還形態の分類と特性
  • 安定性の条件(バルクハウゼン条件)
  • Pythonによる帰還効果の比較シミュレーション

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

帰還の基本概念

帰還とは何か — エアコンのアナロジー

帰還(フィードバック)の仕組みを最も直感的に理解できるのは、エアコンの温度制御です。

エアコンには目標温度(例えば25°C)が設定されています。室温センサが現在の温度(例えば30°C)を測定し、目標温度との差($30 – 25 = 5$°C)をエアコンのコンプレッサーに伝えます。コンプレッサーは差が大きいほど強力に冷却します。室温が下がると差が縮まり、冷却が弱まります。やがて室温は目標温度に収束します。

この仕組みの要素を整理しましょう。

  • 入力(目標値): 設定温度 25°C
  • 出力: 実際の室温
  • 帰還: 室温をセンサで測定して入力に戻す
  • 誤差信号: 目標温度と室温の差
  • 増幅器(コンプレッサー): 誤差信号に応じて出力を調整

重要なのは、帰還信号が入力信号を打ち消す方向に作用していることです(室温が上がれば冷却が強まる)。これが負帰還です。逆に、出力が入力を強める方向に帰還されるのが正帰還で、暴走(ハウリング)を引き起こしますが、発振回路ではこの性質が利用されます。

帰還増幅器のブロック図

帰還増幅器の基本構造を数式で表現しましょう。

  • 開ループ利得 $A$ : 帰還がないときの増幅器の利得(素の利得)
  • 帰還率 $\beta$ : 出力のうち入力に戻す割合を決める帰還回路の利得
  • ループ利得 $T = A\beta$ : 信号が増幅器 → 出力 → 帰還回路 → 入力と一巡したときの利得

入力信号を $x_i$、出力信号を $x_o$、帰還信号を $x_f$ とすると、次の関係が成り立ちます。

$$ x_o = A \cdot x_e $$

ここで $x_e = x_i – x_f$ は誤差信号(入力と帰還の差)です。帰還信号は次のとおりです。

$$ x_f = \beta \cdot x_o $$

$x_e$ に $x_f$ を代入して $x_o$ について解きます。

$$ x_o = A(x_i – \beta x_o) $$

$$ x_o + A\beta x_o = A x_i $$

$$ x_o(1 + A\beta) = A x_i $$

したがって、閉ループ利得 $A_f$(帰還がある場合の利得)は次の式で与えられます。

$$ A_f = \frac{x_o}{x_i} = \frac{A}{1 + A\beta} $$

この式は帰還増幅器の最も基本的かつ重要な式です。分母の $1 + A\beta$ を感度低減係数(desensitivity factor)と呼びます。

ループ利得が十分大きい場合

$A\beta \gg 1$(ループ利得が十分大きい)場合、閉ループ利得は次のように近似できます。

$$ A_f \approx \frac{A}{A\beta} = \frac{1}{\beta} $$

これは驚くべき結果です。閉ループ利得は増幅器の開ループ利得 $A$ に依存せず、帰還回路の特性 $\beta$ だけで決まります。帰還回路は通常、精密な抵抗で構成されるため、温度変動やトランジスタの個体差の影響を受けません。

例えば、開ループ利得が $A = 10{,}000$、帰還率が $\beta = 0.01$ の場合を考えます。

$$ A_f = \frac{10{,}000}{1 + 10{,}000 \times 0.01} = \frac{10{,}000}{101} \approx 99.0 $$

$1/\beta = 100$ に対して、わずか1%の誤差です。たとえ $A$ が半分の5,000に劣化しても次のようになります。

$$ A_f = \frac{5{,}000}{1 + 5{,}000 \times 0.01} = \frac{5{,}000}{51} \approx 98.0 $$

$A$ が50%も変動しても、$A_f$ は1%しか変化しません。これが負帰還による利得安定化の威力です。

基本的な帰還の仕組みを理解したところで、次は負帰還がもたらす具体的な効果を一つずつ見ていきましょう。

負帰還の4つの効果

効果1: 利得の安定化

開ループ利得 $A$ の微小変化 $dA$ に対する閉ループ利得の変化率を求めてみましょう。$A_f = A/(1 + A\beta)$ を $A$ で微分すると次のようになります。

$$ \frac{dA_f}{dA} = \frac{(1 + A\beta) – A\beta}{(1 + A\beta)^2} = \frac{1}{(1 + A\beta)^2} $$

両辺を $A_f/A$ で割って感度を求めます。

$$ \frac{dA_f / A_f}{dA / A} = \frac{1}{1 + A\beta} $$

この式は、$A$ の相対変動が $1/(1 + A\beta)$ 倍に圧縮されて $A_f$ に現れることを示しています。$A\beta = 100$ なら、$A$ が10%変動しても $A_f$ は0.1%しか変動しません。まるで、利得変動という「ノイズ」をフィルタリングしているかのようです。

効果2: 帯域幅の拡大

増幅器が1つの支配的ポール(遮断周波数 $f_H$)を持つ場合、開ループ利得は次のように周波数依存します。

$$ A(f) = \frac{A_0}{1 + j f/f_H} $$

$A_0$ は中域利得、$f_H$ は$-3 \, \text{dB}$ 遮断周波数です。これに帰還をかけると、閉ループ利得は次のようになります。

$$ A_f(f) = \frac{A(f)}{1 + A(f)\beta} $$

$A(f)$ の式を代入して整理しましょう。

$$ A_f(f) = \frac{A_0 / (1 + jf/f_H)}{1 + A_0 \beta / (1 + jf/f_H)} $$

分子分母に $(1 + jf/f_H)$ を掛けると次のようになります。

$$ A_f(f) = \frac{A_0}{(1 + A_0 \beta) + jf/f_H} = \frac{A_0/(1 + A_0 \beta)}{1 + jf / [(1 + A_0 \beta) f_H]} $$

したがって、閉ループの中域利得と遮断周波数は次のとおりです。

$$ A_{f0} = \frac{A_0}{1 + A_0 \beta}, \quad f_{Hf} = (1 + A_0 \beta) f_H $$

中域利得は $1/(1 + A_0\beta)$ 倍に減少しますが、帯域幅は $(1 + A_0\beta)$ 倍に拡大します。つまり、利得-帯域幅積(GBW)は負帰還をかけても変わりません

$$ A_{f0} \times f_{Hf} = A_0 \times f_H = \text{GBW(一定)} $$

利得を犠牲にして帯域幅を得る、または帯域幅を犠牲にして利得を得る — このトレードオフは、増幅器の物理的限界(GBW)の中で帰還率 $\beta$ をどう設定するかという設計判断になります。

効果3: 非線形歪みの低減

増幅器が非線形であるために発生する歪みを $D$ とします。帰還をかけると、歪みも $(1 + A\beta)$ 分の1に低減されます。

$$ D_f = \frac{D}{1 + A\beta} $$

直感的には、歪みが出力に現れると、帰還回路がそれを検出して打ち消す方向に補正するためです。例えば、増幅器の出力が本来の正弦波から逸脱した場合、帰還によって誤差信号が修正され、出力が理想的な波形に近づきます。

ただし、利得も $1/(1 + A\beta)$ 倍に低下するため、「利得あたりの歪み」を改善するには、帰還前の開ループ利得 $A$ を十分大きくしておく必要があります。負帰還で利得が下がった分を、開ループ利得を上げることで補うのです。

効果4: 入出力インピーダンスの変化

負帰還は入出力インピーダンスも変化させます。この変化は帰還の「形態」によって異なりますが、基本的な規則を先に示しておきます。

入力側: 帰還が入力に直列に加わる場合、入力インピーダンスは増加します。帰還が入力に並列に加わる場合は減少します。

$$ Z_{if}(\text{直列帰還}) = Z_i (1 + A\beta), \quad Z_{if}(\text{並列帰還}) = \frac{Z_i}{1 + A\beta} $$

出力側: 出力電圧を検出する(電圧帰還)場合、出力インピーダンスは減少します。出力電流を検出する(電流帰還)場合は増加します。

$$ Z_{of}(\text{電圧帰還}) = \frac{Z_o}{1 + A\beta}, \quad Z_{of}(\text{電流帰還}) = Z_o (1 + A\beta) $$

入力インピーダンスが高い方が信号源から見て負担が小さく、出力インピーダンスが低い方が負荷を駆動しやすいので、用途に応じて帰還形態を選択します。

負帰還の4つの効果が理解できたところで、次は帰還の「かけ方」にはどんなバリエーションがあるのかを見ていきましょう。

4つの帰還形態

帰還回路の構成は、入力の接続方法(直列/並列)出力の検出方法(電圧/電流)の組み合わせで4通りに分類されます。

分類の考え方

帰還形態の分類は、次の2つの質問に答えることで決まります。

  1. 入力側: 帰還信号は入力と直列に接続されているか(電圧の差を取る)、並列に接続されているか(電流の差を取る)?
  2. 出力側: 帰還回路は出力電圧を検出しているか、出力電流を検出しているか?

出力の検出方法を見分けるコツがあります。負荷抵抗 $R_L$ を外して出力を開放したとき、帰還がなくなるなら「電圧帰還」($R_L$ がないと電圧が変わるから)。$R_L$ を短絡したときに帰還がなくなるなら「電流帰還」($R_L$ が0だと電流が変わるから)です。

電圧-直列帰還(Series-Shunt)

これは最も一般的な帰還形態で、オペアンプの非反転増幅回路がその代表例です。

  • 入力: 帰還電圧が入力電圧と直列に加わる(電圧の差を取る)
  • 出力: 出力電圧を抵抗分圧で検出する

帰還率 $\beta$ は出力電圧の分圧比で決まります。例えば、$R_f$ と $R_1$ の分圧回路では次のとおりです。

$$ \beta = \frac{R_1}{R_1 + R_f} $$

閉ループ利得は次のようになります。

$$ A_f = \frac{A}{1 + A\beta} \approx \frac{1}{\beta} = 1 + \frac{R_f}{R_1} $$

特性変化: – 入力インピーダンス: 増加($Z_{if} = Z_i(1 + A\beta)$)— 信号源への負担が軽い – 出力インピーダンス: 減少($Z_{of} = Z_o/(1 + A\beta)$)— 負荷駆動力が向上

この形態は「安定した電圧利得を得たい」場合に最適で、センサの信号増幅やバッファ回路に広く使われます。

電圧-並列帰還(Shunt-Shunt)

オペアンプの反転増幅回路およびトランスインピーダンスアンプがこの形態です。

  • 入力: 帰還電流が入力電流と並列に加わる(電流の差を取る)
  • 出力: 出力電圧を検出する

この形態では、増幅器はトランスインピーダンス(電流入力 → 電圧出力)として動作します。帰還抵抗 $R_f$ を通じて出力電圧が入力電流に変換されて戻されます。

閉ループのトランスインピーダンスは次のとおりです。

$$ Z_f = \frac{v_o}{i_i} \approx -R_f \quad (A\beta \gg 1 \text{ の場合}) $$

特性変化: – 入力インピーダンス: 減少($Z_{if} = Z_i/(1 + A\beta)$)— 電流源からの入力に適する – 出力インピーダンス: 減少($Z_{of} = Z_o/(1 + A\beta)$)

フォトダイオードの電流を電圧に変換するトランスインピーダンスアンプが代表的な応用例です。

電流-直列帰還(Series-Series)

  • 入力: 帰還電圧が入力電圧と直列に加わる
  • 出力: 出力電流を検出する(例: エミッタ/ソース抵抗での電圧降下)

増幅器はトランスコンダクタンス(電圧入力 → 電流出力)として動作します。

閉ループのトランスコンダクタンスは次のとおりです。

$$ G_f = \frac{i_o}{v_i} \approx \frac{1}{\beta} = \frac{1}{R_E} \quad (A\beta \gg 1) $$

特性変化: – 入力インピーダンス: 増加 – 出力インピーダンス: 増加($Z_{of} = Z_o(1 + A\beta)$)— 理想電流源に近づく

前記事で解説した「エミッタ抵抗がバイパスされていないエミッタ接地増幅器」は、まさにこの電流-直列帰還の例です。$R_E$ が帰還回路として機能し、利得が $R_C/R_E$ に安定化されていました。

電流-並列帰還(Shunt-Series)

  • 入力: 帰還電流が入力電流と並列に加わる
  • 出力: 出力電流を検出する

増幅器は電流利得(電流入力 → 電流出力)として動作します。

閉ループの電流利得は次のとおりです。

$$ A_{if} = \frac{i_o}{i_i} \approx \frac{1}{\beta} $$

特性変化: – 入力インピーダンス: 減少 – 出力インピーダンス: 増加

4形態のまとめ

形態 入力 出力検出 利得の種類 $Z_{if}$ $Z_{of}$ 代表例
電圧-直列 直列 電圧 電圧利得 増加 減少 非反転アンプ
電圧-並列 並列 電圧 トランスインピーダンス 減少 減少 反転アンプ、TIA
電流-直列 直列 電流 トランスコンダクタンス 増加 増加 CE+$R_E$
電流-並列 並列 電流 電流利得 減少 増加 CB段

4つの帰還形態のどれを選ぶかは、「信号源がどんな性質か(電圧源 or 電流源)」と「負荷が何を必要としているか(電圧 or 電流)」によって決まります。

帰還形態の選び方がわかったところで、次に注意すべき重要な問題があります。負帰還は強力ですが、やりすぎると不安定になることがあります。帰還増幅器の安定性について見ていきましょう。

安定性とバルクハウゼン条件

なぜ負帰還が不安定になるのか

負帰還の基本式 $A_f = A/(1 + A\beta)$ は、$A\beta > 0$(すなわち帰還が「負」)である限りうまく機能します。しかし、実際の増幅器の利得 $A$ は周波数依存性を持ち、高い周波数では位相が回転します。

もし、ある周波数で $A$ の位相が $-180°$ 回転したとしましょう。このとき、$A\beta$ は実質的に負の実数になります。$A\beta = -1$(つまり $|A\beta| = 1$ かつ位相が $-180°$)のとき、分母 $1 + A\beta = 0$ となり、閉ループ利得は無限大になります。これは出力が有限の入力なしに自己維持的に振動する — すなわち発振を意味します。

これがバルクハウゼンの発振条件です。

$$ A\beta = -1 \quad \Leftrightarrow \quad |A\beta| = 1, \quad \angle A\beta = -180° $$

安定性の判定 — 利得余裕と位相余裕

実用的な安定性の判定には、利得余裕(Gain Margin)位相余裕(Phase Margin)の2つの指標が使われます。

位相余裕(PM): $|A\beta| = 1$(0 dB)となる周波数(利得交差周波数)での、位相の $-180°$ からの余裕です。

$$ \text{PM} = 180° + \angle A\beta \big|_{|A\beta|=1} $$

位相余裕が正であれば安定、負であれば不安定です。一般的な設計指針として、PM > 45°(理想的には60°)を確保します。

利得余裕(GM): $\angle A\beta = -180°$ となる周波数での、$|A\beta|$ の0 dBからの余裕(dB単位)です。

$$ \text{GM} = -20 \log_{10} |A\beta| \big|_{\angle A\beta = -180°} $$

利得余裕が正であれば安定です。一般にGM > 10 dBを確保します。

位相補償

増幅器が不安定な場合、位相補償によって安定化します。最も一般的な手法は支配的ポール補償(ミラー補償)です。

増幅器の最低周波数のポールをさらに低い周波数に移動させることで、利得交差周波数が下がり、その周波数での位相回転が小さくなります。これにより位相余裕が確保されます。

具体的には、増幅器の高利得段にミラー容量 $C_c$ を追加します。ミラー効果により実効容量が $(1 + |A_v|)C_c$ と大きくなり、支配的ポールが低周波側に移動します。

$$ f_{p1,comp} = \frac{1}{2\pi R_{eq} (1 + |A_v|) C_c} $$

この補償はGBWを低下させるため、「安定性のために帯域幅を犠牲にする」トレードオフです。

安定性の理論的基盤が整いました。次は、Pythonシミュレーションでこれまでの理論を具体的に確認しましょう。

Pythonによる帰還効果の比較シミュレーション

利得安定化の確認

まず、開ループ利得 $A$ が変動したときの閉ループ利得 $A_f$ の安定性を確認します。

import numpy as np
import matplotlib.pyplot as plt

# 開ループ利得の範囲
A_values = np.logspace(1, 5, 500)  # 10 ~ 100,000

# 異なる帰還率β
beta_values = [0.001, 0.01, 0.05, 0.1]
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

for beta, color in zip(beta_values, colors):
    Af = A_values / (1 + A_values * beta)
    ideal = 1 / beta
    error_percent = (Af - ideal) / ideal * 100

    ax1.semilogx(A_values, Af, color=color, linewidth=2,
                 label=f'$\\beta$ = {beta} ($1/\\beta$ = {1/beta:.0f})')
    ax1.axhline(y=ideal, color=color, linestyle=':', alpha=0.4)

    ax2.semilogx(A_values, np.abs(error_percent), color=color, linewidth=2,
                 label=f'$\\beta$ = {beta}')

ax1.set_xlabel('Open-Loop Gain $A$', fontsize=12)
ax1.set_ylabel('Closed-Loop Gain $A_f$', fontsize=12)
ax1.set_title('Closed-Loop Gain vs Open-Loop Gain', fontsize=13)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_ylim([0, 1200])

ax2.set_xlabel('Open-Loop Gain $A$', fontsize=12)
ax2.set_ylabel('Error from Ideal $1/\\beta$ [%]', fontsize=12)
ax2.set_title('Gain Error vs Open-Loop Gain', fontsize=13)
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
ax2.set_ylim([0.001, 100])
ax2.set_yscale('log')

plt.tight_layout()
plt.savefig('feedback_gain_stability.png', dpi=150, bbox_inches='tight')
plt.show()

左のグラフから、帰還の利得安定化効果が明確に読み取れます。開ループ利得 $A$ が低い領域では閉ループ利得 $A_f$ は $A$ に依存しますが、$A$ が十分大きくなると $A_f$ は $1/\beta$ に収束し、$A$ の変動にほとんど影響されなくなります。$\beta$ が大きい(帰還が強い)ほど、より低い $A$ から安定化が始まっています。

右のグラフは誤差率を対数スケールで示しています。$A\beta = 100$(例えば $A = 10{,}000$, $\beta = 0.01$)のとき、理想値 $1/\beta$ からの誤差はわずか約1%です。$A\beta = 1{,}000$ では0.1%に改善されます。この誤差の逆数がまさにループ利得 $A\beta$ であり、ループ利得が大きいほど閉ループ利得が理想値に近づくことがわかります。

帯域幅拡大の効果

次に、負帰還による帯域幅の拡大を確認します。

import numpy as np
import matplotlib.pyplot as plt

# 開ループ特性
A0 = 10000          # 中域利得
fH = 10e3           # 高域遮断周波数 [Hz]
GBW = A0 * fH       # 利得-帯域幅積 [Hz]

# 周波数
freq = np.logspace(1, 9, 1000)

# 開ループ利得(1ポールモデル)
A_open = A0 / (1 + 1j * freq / fH)

# 異なるβでの閉ループ利得
beta_list = [0, 0.001, 0.01, 0.1]
labels = ['Open loop', '$\\beta$=0.001', '$\\beta$=0.01', '$\\beta$=0.1']
colors = ['black', '#1f77b4', '#ff7f0e', '#2ca02c']
styles = ['--', '-', '-', '-']

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 9), sharex=True)

for beta, label, color, style in zip(beta_list, labels, colors, styles):
    if beta == 0:
        Af = A_open
    else:
        Af = A_open / (1 + A_open * beta)

    gain_dB = 20 * np.log10(np.abs(Af))
    phase = np.angle(Af, deg=True)

    ax1.semilogx(freq, gain_dB, color=color, linewidth=2,
                 linestyle=style, label=label)
    ax2.semilogx(freq, phase, color=color, linewidth=2,
                 linestyle=style, label=label)

    # -3dB帯域幅を計算
    if beta > 0:
        Af0 = A0 / (1 + A0 * beta)
        fHf = (1 + A0 * beta) * fH
        print(f"β={beta}: Af0={Af0:.1f} ({20*np.log10(Af0):.1f} dB), "
              f"fHf={fHf/1e3:.0f} kHz, GBW={Af0*fHf/1e6:.0f} MHz")
    else:
        print(f"Open loop: A0={A0}, fH={fH/1e3:.0f} kHz, GBW={GBW/1e6:.0f} MHz")

# GBW一定の線を描画
gbw_freq = np.logspace(np.log10(fH), 9, 100)
gbw_gain = GBW / gbw_freq
ax1.semilogx(gbw_freq, 20*np.log10(gbw_gain), 'r:', linewidth=1.5,
             alpha=0.5, label=f'GBW = {GBW/1e6:.0f} MHz')

ax1.set_ylabel('Gain [dB]', fontsize=12)
ax1.set_title('Bandwidth Extension by Negative Feedback', fontsize=14)
ax1.legend(fontsize=10, loc='lower left')
ax1.grid(True, which='both', alpha=0.3)
ax1.set_ylim([-20, 90])

ax2.set_xlabel('Frequency [Hz]', fontsize=12)
ax2.set_ylabel('Phase [deg]', fontsize=12)
ax2.legend(fontsize=10)
ax2.grid(True, which='both', alpha=0.3)

plt.tight_layout()
plt.savefig('feedback_bandwidth.png', dpi=150, bbox_inches='tight')
plt.show()

ボード線図から、負帰還の帯域幅拡大効果が鮮明に確認できます。開ループ(黒破線)では利得80 dB、帯域幅10 kHzです。$\beta = 0.01$ の帰還をかけると(橙)、利得は40 dBに低下しますが、帯域幅は約1 MHzまで拡大しています。$\beta = 0.1$ ではさらに利得20 dB、帯域幅10 MHzとなります。

注目すべきは、全てのカーブが高周波側で同じ線(赤点線のGBW一定線)に沿って $-20 \, \text{dB/dec}$ で降下していることです。これはGBW(利得-帯域幅積)が帰還の有無にかかわらず一定であることを示しており、理論の予測 $A_{f0} \times f_{Hf} = A_0 \times f_H$ が正しいことが確認できます。

位相特性を見ると、帰還をかけた場合は $-180°$ への接近が緩やかになっています。これは、閉ループのポールが高い周波数に移動したため、その周波数帯で位相回転が小さくなっていることを意味します。

歪み低減効果のシミュレーション

非線形な増幅器に対する負帰還の歪み低減効果を確認します。

import numpy as np
import matplotlib.pyplot as plt

# 非線形増幅器のモデル(3次歪み付き)
def nonlinear_amp(vin, A0, alpha3):
    """3次歪みを持つ増幅器"""
    return A0 * vin + alpha3 * vin**3

def feedback_amp(vin, A0, alpha3, beta, n_iter=50):
    """帰還増幅器(反復法で解を求める)"""
    vout = np.zeros_like(vin)
    for i in range(len(vin)):
        vo = 0.0
        for _ in range(n_iter):
            ve = vin[i] - beta * vo
            vo = A0 * ve + alpha3 * ve**3
        vout[i] = vo
    return vout

# パラメータ
A0 = 100.0       # 線形利得
alpha3 = -500.0   # 3次歪み係数(圧縮型)
beta = 0.05       # 帰還率

# 入力信号
t = np.linspace(0, 2*np.pi, 1000)
vin = 0.1 * np.sin(t)  # 振幅100mV

# 開ループ出力
vout_open = nonlinear_amp(vin, A0, alpha3)

# 閉ループ出力
vout_closed = feedback_amp(vin, A0, alpha3, beta)

# 理想出力(線形)
Af_ideal = A0 / (1 + A0 * beta)
vout_ideal = Af_ideal * vin

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 入出力特性
vin_sweep = np.linspace(-0.2, 0.2, 500)
vout_open_sweep = nonlinear_amp(vin_sweep, A0, alpha3)
vout_closed_sweep = feedback_amp(vin_sweep, A0, alpha3, beta)

axes[0, 0].plot(vin_sweep * 1e3, vout_open_sweep, 'b-', linewidth=2, label='Open loop')
axes[0, 0].plot(vin_sweep * 1e3, vout_closed_sweep, 'r-', linewidth=2, label='Closed loop')
axes[0, 0].plot(vin_sweep * 1e3, Af_ideal * vin_sweep, 'g--', linewidth=1.5, label='Ideal linear')
axes[0, 0].set_xlabel('Input Voltage [mV]', fontsize=12)
axes[0, 0].set_ylabel('Output Voltage [V]', fontsize=12)
axes[0, 0].set_title('Transfer Characteristic', fontsize=13)
axes[0, 0].legend(fontsize=10)
axes[0, 0].grid(True, alpha=0.3)

# 時間波形
axes[0, 1].plot(t / (2*np.pi), vout_open, 'b-', linewidth=2, label='Open loop')
axes[0, 1].plot(t / (2*np.pi), vout_closed, 'r-', linewidth=2, label='Closed loop')
axes[0, 1].plot(t / (2*np.pi), vout_ideal, 'g--', linewidth=1.5, label='Ideal')
axes[0, 1].set_xlabel('Time [periods]', fontsize=12)
axes[0, 1].set_ylabel('Output Voltage [V]', fontsize=12)
axes[0, 1].set_title('Time Domain Waveform', fontsize=13)
axes[0, 1].legend(fontsize=10)
axes[0, 1].grid(True, alpha=0.3)

# 歪み率 vs β
beta_range = np.logspace(-3, 0, 50)
thd_list = []
for b in beta_range:
    vo = feedback_amp(vin, A0, alpha3, b)
    # FFTで高調波を計算
    fft_result = np.fft.fft(vo)
    magnitude = np.abs(fft_result[:len(fft_result)//2])
    # 基本波と3次高調波の比
    fundamental = magnitude[1]
    harmonic3 = magnitude[3] if len(magnitude) > 3 else 0
    thd = harmonic3 / fundamental * 100 if fundamental > 0 else 0
    thd_list.append(thd)

axes[1, 0].loglog(beta_range, thd_list, 'b-', linewidth=2)
axes[1, 0].set_xlabel(r'Feedback factor $\beta$', fontsize=12)
axes[1, 0].set_ylabel('THD [%]', fontsize=12)
axes[1, 0].set_title('Total Harmonic Distortion vs Feedback', fontsize=13)
axes[1, 0].grid(True, which='both', alpha=0.3)

# 利得 vs β
gain_range = [A0 / (1 + A0 * b) for b in beta_range]
axes[1, 1].loglog(beta_range, gain_range, 'r-', linewidth=2, label='Gain')
ax_twin = axes[1, 1].twinx()
ax_twin.loglog(beta_range, [1 + A0 * b for b in beta_range], 'b--', linewidth=2, label='$1 + A\\beta$')
axes[1, 1].set_xlabel(r'Feedback factor $\beta$', fontsize=12)
axes[1, 1].set_ylabel('Closed-Loop Gain', fontsize=12, color='r')
ax_twin.set_ylabel('Desensitivity $1 + A\\beta$', fontsize=12, color='b')
axes[1, 1].set_title('Gain and Desensitivity vs Feedback', fontsize=13)
axes[1, 1].grid(True, which='both', alpha=0.3)

plt.tight_layout()
plt.savefig('feedback_distortion.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"開ループ利得: A0 = {A0}")
print(f"閉ループ利得: Af = {Af_ideal:.1f}")
print(f"感度低減係数: 1+Aβ = {1+A0*beta:.1f}")

4つのグラフから、負帰還の歪み低減効果が総合的に確認できます。

左上の入出力特性を見ると、開ループ(青)は入力が大きくなると特性がカーブし(3次歪みによる飽和)、非線形になっています。一方、閉ループ(赤)は理想的な直線(緑破線)にほぼ一致しており、帰還によって線形性が大幅に改善されています。

右上の時間波形では、開ループの出力波形がピーク付近で潰れている(クリッピングの前兆)のに対し、閉ループの出力は理想的な正弦波に近い形を保っています。ただし、振幅は閉ループのほうが小さくなっており、利得が低下していることが確認できます。

左下のTHD(全高調波歪み)対$\beta$のグラフは、帰還を強くするほど歪みが単調に減少することを示しています。$\beta$ が10倍になるとTHDは約10分の1に低減しており、歪みが $1/(1 + A\beta)$ に比例するという理論的予測と一致しています。

右下のグラフは、利得と感度低減係数のトレードオフを示しています。$\beta$ を大きくすると感度低減係数 $1 + A\beta$ は増加(歪み・雑音の低減が向上)しますが、利得は低下します。設計者は、求める利得と歪み特性のバランスを見てβを決定します。

安定性の解析 — 位相余裕の可視化

最後に、多ポール系での安定性を確認します。

import numpy as np
import matplotlib.pyplot as plt

# 3ポールの開ループ増幅器
A0 = 10000
f1 = 100       # 1番目のポール [Hz]
f2 = 1e6       # 2番目のポール [Hz]
f3 = 10e6      # 3番目のポール [Hz]

freq = np.logspace(0, 9, 2000)

# 開ループ利得
A_open = A0 / ((1 + 1j*freq/f1) * (1 + 1j*freq/f2) * (1 + 1j*freq/f3))

beta = 0.01
loop_gain = A_open * beta

gain_dB = 20 * np.log10(np.abs(loop_gain))
phase_deg = np.angle(loop_gain, deg=True)

# 利得交差周波数(|Aβ| = 1 = 0 dB)
idx_gc = np.argmin(np.abs(gain_dB))
f_gc = freq[idx_gc]
phase_at_gc = phase_deg[idx_gc]
PM = 180 + phase_at_gc

# 位相交差周波数(位相 = -180°)
idx_pc = np.argmin(np.abs(phase_deg + 180))
f_pc = freq[idx_pc]
gain_at_pc = gain_dB[idx_pc]
GM = -gain_at_pc

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 9), sharex=True)

# ゲイン
ax1.semilogx(freq, gain_dB, 'b-', linewidth=2)
ax1.axhline(y=0, color='r', linestyle='--', alpha=0.7)
ax1.axvline(x=f_gc, color='g', linestyle=':', alpha=0.7)
ax1.axvline(x=f_pc, color='m', linestyle=':', alpha=0.7)

# GM表示
ax1.annotate('', xy=(f_pc, 0), xytext=(f_pc, gain_at_pc),
            arrowprops=dict(arrowstyle='<->', color='m', lw=2))
ax1.text(f_pc*1.5, gain_at_pc/2, f'GM = {GM:.1f} dB',
         fontsize=11, color='m')

ax1.set_ylabel('Loop Gain $|A\\beta|$ [dB]', fontsize=12)
ax1.set_title('Loop Gain Bode Plot (Stability Analysis)', fontsize=14)
ax1.grid(True, which='both', alpha=0.3)
ax1.set_ylim([-60, 50])

# 位相
ax2.semilogx(freq, phase_deg, 'b-', linewidth=2)
ax2.axhline(y=-180, color='r', linestyle='--', alpha=0.7)
ax2.axvline(x=f_gc, color='g', linestyle=':', alpha=0.7)
ax2.axvline(x=f_pc, color='m', linestyle=':', alpha=0.7)

# PM表示
ax2.annotate('', xy=(f_gc, -180), xytext=(f_gc, phase_at_gc),
            arrowprops=dict(arrowstyle='<->', color='g', lw=2))
ax2.text(f_gc*1.5, (phase_at_gc - 180)/2, f'PM = {PM:.1f}°',
         fontsize=11, color='g')

ax2.set_xlabel('Frequency [Hz]', fontsize=12)
ax2.set_ylabel('Loop Phase [deg]', fontsize=12)
ax2.grid(True, which='both', alpha=0.3)
ax2.set_ylim([-300, 0])

plt.tight_layout()
plt.savefig('feedback_stability.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"利得交差周波数: f_gc = {f_gc/1e3:.0f} kHz")
print(f"位相余裕: PM = {PM:.1f}°")
print(f"位相交差周波数: f_pc = {f_pc/1e6:.1f} MHz")
print(f"利得余裕: GM = {GM:.1f} dB")
print(f"\n安定性判定: {'安定' if PM > 0 and GM > 0 else '不安定'}")
print(f"設計指針: PM > 45° → {'OK' if PM > 45 else 'NG — 位相補償が必要'}")

ボード線図から、3ポール系の安定性解析結果が読み取れます。

上段のゲインプロットでは、ループ利得 $|A\beta|$ が低周波で約40 dB($A\beta = 100$)から始まり、各ポールで $-20 \, \text{dB/dec}$ ずつ傾きが急になっています。利得交差周波数($|A\beta| = 0 \, \text{dB}$)は緑の点線で示されています。

下段の位相プロットでは、各ポールが $-90°$ の位相遅れを追加しています。位相余裕(PM)は、利得交差周波数での位相と $-180°$ との差(緑の矢印)で表されています。利得余裕(GM)は、位相が $-180°$ に達する周波数でのループ利得(紫の矢印)です。

3つのポールが互いに十分離れている場合、最初のポール後の $-20 \, \text{dB/dec}$ 領域で利得が0 dBを通過するため、位相余裕は大きくなります。しかし、ポールが近接していたり、$\beta$ を大きくして利得交差周波数が高くなったりすると、位相余裕が不足して発振のリスクが高まります。

まとめ

本記事では、負帰還増幅回路の理論と効果を体系的に解説しました。

  • 帰還の基本: 閉ループ利得 $A_f = A/(1 + A\beta)$ であり、$A\beta \gg 1$ のとき $A_f \approx 1/\beta$ と帰還率だけで利得が決まる
  • 利得安定化: 開ループ利得の変動は $(1 + A\beta)$ 分の1に圧縮される。トランジスタの温度変動や個体差の影響を大幅に低減できる
  • 帯域幅拡大: 帯域幅は $(1 + A\beta)$ 倍に拡大するが、利得は同じ分だけ低下する。GBW(利得-帯域幅積)は保存される
  • 歪み低減: 非線形歪みも $(1 + A\beta)$ 分の1に低減される。高忠実度の増幅が可能になる
  • 4つの帰還形態: 入力(直列/並列)×出力検出(電圧/電流)の4通りがあり、用途に応じた入出力インピーダンスの最適化が可能
  • 安定性: ループ利得の位相が $-180°$ に近づくと発振のリスクがある。位相余裕45°以上、利得余裕10 dB以上が設計指針

負帰還は「意図的に利得を下げる」ことで、安定性・線形性・帯域幅のすべてを改善する強力な設計手法です。この考え方は、オペアンプ回路、フィードバック制御系、さらにはPLL(位相同期ループ)にも通じる普遍的な原理です。

一方、帰還を「正」の方向にかけると、増幅器は発振器に変わります。次の記事では、正帰還を利用した発振回路の設計について解説します。

次のステップとして、以下の記事も参考にしてください。