import sympy as sp
# Define symbols
K, V_GS, V_T, lambda_, V_DS, dV_GS, dV_DS, v_gs, v_ds = sp.symbols('K V_GS V_T lambda_ V_DS dV_GS dV_DS v_gs v_ds')
# Define the main equation
I_Ds_star = K * (V_GS - V_T)**2 * (1 + lambda_ * V_DS)
# Compute the derivatives
dI_Ds_dV_GS = sp.diff(I_Ds_star, V_GS)
dI_Ds_dV_DS = sp.diff(I_Ds_star, V_DS)
# Define the small-signal parameters
g_m = dI_Ds_dV_GS
r_o_inv = dI_Ds_dV_DS
# Express the differential form
dI_Ds = dI_Ds_dV_GS * dV_GS + dI_Ds_dV_DS * dV_DS
i_d = g_m * v_gs + (1 / (1/r_o_inv)) * v_ds
# Substitute numerical values
substitutions = {
K: 1e-3, # Example value for K (A/V^2)
V_GS: 2, # Example value for V_GS (V)
V_T: 1, # Example value for V_T (V)
lambda_: 0.02, # Example value for lambda (1/V)
V_DS: 5, # Example value for V_DS (V)
dV_GS: 0.01, # Small change in V_GS (V)
dV_DS: 0.01, # Small change in V_DS (V)
v_gs: 0.01, # Small signal voltage v_gs (V)
v_ds: 0.01 # Small signal voltage v_ds (V)
}
# Calculate the numerical values
I_Ds_star_val = I_Ds_star.subs(substitutions)
g_m_val = g_m.subs(substitutions)
r_o_inv_val = r_o_inv.subs(substitutions)
dI_Ds_val = dI_Ds.subs(substitutions)
i_d_val = i_d.subs(substitutions)
I_Ds_star_val, g_m_val, r_o_inv_val, dI_Ds_val, i_d_val
import sympy as sp
import matplotlib.pyplot as plt
import numpy as np
# Define symbols for resistances and transconductances
r2, r4, r6, r7, gm2, gm6 = sp.symbols('r2 r4 r6 r7 gm2 gm6')
# Calculate parallel resistances
rp1 = r2 * r4 / (r2 + r4)
rp2 = r6 * r7 / (r6 + r7)
# Initial stage gain (Differential Amplifier)
A1 = gm2 * rp1
# Output stage gain (Source Follower)
A2 = gm6 * rp2 / (1 + gm6 * rp2)
# Voltage gain
Av = A1 * A2
# Substitute numerical values
substitutions = {
r2: 1e3, # Example value for r2 in ohms
r4: 2e3, # Example value for r4 in ohms
r6: 1e3, # Example value for r6 in ohms
r7: 2e3, # Example value for r7 in ohms
gm2: 1e-3, # Example value for gm2 in siemens
gm6: 1e-3 # Example value for gm6 in siemens
}
# Calculate numerical values
rp1_val = float(rp1.subs(substitutions))
rp2_val = float(rp2.subs(substitutions))
A1_val = float(A1.subs(substitutions))
A2_val = float(A2.subs(substitutions))
Av_val = float(Av.subs(substitutions))
# Convert gains to dB
A1_dB = 20 * np.log10(A1_val)
A2_dB = 20 * np.log10(A2_val)
Av_dB = 20 * np.log10(Av_val)
# Display the results
print(f"rp1: {rp1_val} Ohms")
print(f"rp2: {rp2_val} Ohms")
print(f"A1: {A1_val} ({A1_dB:.2f} dB)")
print(f"A2: {A2_val} ({A2_dB:.2f} dB)")
print(f"Av: {Av_val} ({Av_dB:.2f} dB)")
# Plotting
fig, axs = plt.subplots(2, 1, figsize=(10, 10))
# Plot in linear scale (倍)
values = [A1_val, A2_val, Av_val]
labels = ['A1', 'A2', 'Av']
colors = ['red', 'orange', 'purple']
axs[0].bar(labels, values, color=colors)
axs[0].set_title('Circuit Gains (倍)')
axs[0].set_ylabel('Gain')
# Plot in dB scale (デシベル)
values_dB = [A1_dB, A2_dB, Av_dB]
labels_dB = ['A1 (dB)', 'A2 (dB)', 'Av (dB)']
axs[1].bar(labels_dB, values_dB, color=colors)
axs[1].set_title('Circuit Gains (dB)')
axs[1].set_ylabel('Gain (dB)')
# Show the plots
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Given parameters
gm1 = 2e-3 # 2 mS
gm6 = 10e-3 # 10 mS
r1 = r3 = 40e3 # 40 kΩ
r6 = r7 = 2.1e3 # 2.1 kΩ
rp1 = 20e3 # 20 kΩ
rp2 = 1e3 # 1 kΩ
Cp1 = 0.5e-12 # 0.5 pF
Cp2 = 3e-12 # 3 pF
Cf = 5e-12 # 5 pF
A1 = gm1 * rp1
A2 = gm6 * rp2
# DC Gain (直流ゲイン)
A0 = A1 * A2 # 直流ゲイン
# Pole frequencies before and after compensation
f_p1_before = 1 / (2 * np.pi * Cp1 * rp1)
f_p1_after = 1 / (2 * np.pi * (Cp1 + 50e-12) * rp1) # 50 pF is the Miller capacitance
f_p2_before = 1 / (2 * np.pi * Cp2 * rp2)
f_p2_after = gm6 / (2 * np.pi * Cf)
# Transfer function Av(jf)
s1 = signal.TransferFunction([A0], [1/(2*np.pi*f_p1_after), 1])
s2 = signal.TransferFunction([1], [1/(2*np.pi*f_p2_after), 1])
Av = signal.TransferFunction([A0], np.convolve(s1.den, s2.den))
# Bode plot
w, mag, phase = signal.bode(Av)
plt.figure(figsize=(10, 8))
# Magnitude plot
plt.subplot(2, 1, 1)
plt.semilogx(w/(2*np.pi), mag) # Frequency in Hz
plt.title('Bode Plot of the Compensated Amplifier')
plt.ylabel('Magnitude (dB)')
plt.grid(which='both', axis='both')
# Phase plot
plt.subplot(2, 1, 2)
plt.semilogx(w/(2*np.pi), phase) # Frequency in Hz
plt.xlabel('Frequency (Hz)')
plt.ylabel('Phase (degrees)')
plt.grid(which='both', axis='both')
plt.tight_layout()
plt.show()
あ
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Given parameters
A0 = 400 # DC gain
f1 = 160e3 # First pole frequency in Hz (P1)
f2 = 530e6 # Second pole frequency in Hz (P2)
# Define the transfer function
# s = jω where ω = 2 * π * f
s1 = 2 * np.pi * f1
s2 = 2 * np.pi * f2
# Transfer function: A0 / ((1 + s/s1) * (1 + s/s2))
num = [A0] # Numerator (A0)
den = [1/(s1 * s2), 1/s1 + 1/s2, 1] # Denominator coefficients
# Create transfer function system
system = signal.TransferFunction(num, den)
# Frequency range for the Bode plot (logarithmic scale)
frequencies = np.logspace(3, 9, 500) # From 1 kHz to 1 GHz
# Compute Bode plot (magnitude and phase)
w, mag, phase = signal.bode(system, 2 * np.pi * frequencies)
# Plot Bode magnitude plot
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, mag) # Bode magnitude plot
plt.title('Bode Plot of Transfer Function')
plt.ylabel('Magnitude (dB)')
plt.grid(True, which='both')
# Plot Bode phase plot
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase) # Bode phase plot
plt.xlabel('Frequency (Hz)')
plt.ylabel('Phase (degrees)')
plt.grid(True, which='both')
# Show plots
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Given parameters
gm = 10e-3 # Transconductance (S)
Rd = 1e3 # Drain resistance (ohms)
Ci = 10e-12 # Input capacitance (F)
Co = 5e-12 # Output capacitance (F)
Rs = 50 # Source resistance (ohms)
# Define the angular frequency s = jω where ω = 2πf
# Numerator: -gm * Rd
num = [-gm * Rd]
# Denominator: (1 + jωCiRs) * (1 + jωCoRd)
# Transfer function in terms of s = jω
den = [Ci * Co * Rs * Rd, Ci * Rs + Co * Rd, 1]
# Create transfer function system
system = signal.TransferFunction(num, den)
# Frequency range for the Bode plot (logarithmic scale)
frequencies = np.logspace(3, 9, 500) # From 1 kHz to 1 GHz
# Compute Bode plot (magnitude and phase)
w, mag, phase = signal.bode(system, 2 * np.pi * frequencies)
# Plot Bode magnitude plot
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, mag) # Bode magnitude plot
plt.title('Bode Plot of Transfer Function G')
plt.ylabel('Magnitude (dB)')
plt.grid(True, which='both')
# Plot Bode phase plot
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase) # Bode phase plot
plt.xlabel('Frequency (Hz)')
plt.ylabel('Phase (degrees)')
plt.grid(True, which='both')
# Show plots
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Given parameters
gm = 10e-3 # Transconductance (S)
Rd = 1e3 # Drain resistance (ohms)
CM = 10e-12 # Capacitance C_M (F)
Co = 5e-12 # Output capacitance C_o (F)
Rs = 50 # Source resistance (ohms)
rL = 1e3 # Load resistance (ohms)
# Calculate pole frequencies (angular)
omega_A = 1 / (CM * Rs) # First pole angular frequency
omega_B = 1 / (Co * rL) # Second pole angular frequency
# Define the transfer function
# Numerator: -gm * Rd
num = [-gm * Rd]
# Denominator: (1 + jω/ω_A) * (1 + jω/ω_B)
# Transfer function in terms of s = jω
den = [1/(omega_A * omega_B), 1/omega_A + 1/omega_B, 1]
# Create transfer function system
system = signal.TransferFunction(num, den)
# Frequency range for the Bode plot (logarithmic scale)
frequencies = np.logspace(3, 9, 500) # From 1 kHz to 1 GHz
# Compute Bode plot (magnitude and phase)
w, mag, phase = signal.bode(system, 2 * np.pi * frequencies)
# Plot Bode magnitude plot
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, mag) # Bode magnitude plot
plt.title('Bode Plot of Transfer Function G(ω)')
plt.ylabel('Magnitude (dB)')
plt.grid(True, which='both')
# Plot Bode phase plot
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase) # Bode phase plot
plt.xlabel('Frequency (Hz)')
plt.ylabel('Phase (degrees)')
plt.grid(True, which='both')
# Show plots
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# Given parameters
A0 = 400 # DC gain
f1_comp = 160e3 # compensated first pole frequency in Hz (160 kHz)
f2_comp = 530e6 # compensated second pole frequency in Hz (530 MHz)
# Frequency range for the Bode plot (logarithmic scale)
frequencies = np.logspace(3, 9, 1000) # from 1 kHz to 1 GHz
# Angular frequencies
omega = 2 * np.pi * frequencies
# Calculate the complex gain Av(jf) with compensated poles
Av_jw_comp = A0 / ((1 + 1j * frequencies / f1_comp) * (1 + 1j * frequencies / f2_comp))
# Magnitude and Phase of the gain with compensation
magnitude_comp = 20 * np.log10(np.abs(Av_jw_comp))
phase_comp = np.angle(Av_jw_comp, deg=True)
# Plotting the Bode plot with compensation
plt.figure(figsize=(10, 8))
# Magnitude plot
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, magnitude_comp)
plt.title('Compensated Bode Plot of the Amplifier')
plt.ylabel('Magnitude (dB)')
plt.grid(True)
# Phase plot
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase_comp)
plt.ylabel('Phase (degrees)')
plt.xlabel('Frequency (Hz)')
plt.grid(True)
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 定数の定義
gm1 = 2e-3 # S
gm6 = 10e-3 # S
r1_r3 = 40e3 # Ω
r6_r7 = 2e3 # Ω
rp1 = 20e3 # Ω
rp2 = 1e3 # Ω
Cp1 = 0.5e-12 # F
Cp2 = 3e-12 # F
Cf = 5e-12 # F
# 直流ゲイン
A0 = gm1 * rp1 * gm6 * rp2
A0_db = 20 * np.log10(A0)
# ミラー容量
CM = gm6 * Cf
# 極の計算
fp1 = 1 / (2 * np.pi * Cp1 * rp1)
f1 = 1 / (2 * np.pi * CM * rp1)
fp2 = 1 / (2 * np.pi * Cp2 * rp2)
f2 = gm6 / (2 * np.pi * Cp2)
# 周波数範囲の設定
frequencies = np.logspace(3, 9, 1000) # 1kHz to 1GHz
# 利得計算
def gain(f):
omega = 2 * np.pi * f
return A0 / np.sqrt((1 + (omega / (2 * np.pi * f1))**2) * (1 + (omega / (2 * np.pi * f2))**2))
# 位相計算
def phase(f):
omega = 2 * np.pi * f
return -np.arctan(omega / (2 * np.pi * f1)) - np.arctan(omega / (2 * np.pi * f2))
gain_db = 20 * np.log10(gain(frequencies))
phase_deg = np.degrees(phase(frequencies))
# プロット
plt.figure(figsize=(10, 6))
# ゲインプロット
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, gain_db)
plt.title('Bode Plot')
plt.ylabel('Gain (dB)')
plt.axhline(y=0, color='k', linestyle='--', linewidth=0.5)
plt.axvline(x=f1, color='r', linestyle='--', label=f'f1 = {f1/1e6:.2f} MHz')
plt.axvline(x=f2, color='g', linestyle='--', label=f'f2 = {f2/1e6:.2f} MHz')
plt.legend()
# 位相プロット
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase_deg)
plt.ylabel('Phase (degrees)')
plt.xlabel('Frequency (Hz)')
plt.axhline(y=-180, color='k', linestyle='--', linewidth=0.5)
plt.axvline(x=f1, color='r', linestyle='--')
plt.axvline(x=f2, color='g', linestyle='--')
plt.tight_layout()
plt.show()