Capacitor with Quality Factor

This example demonstrates the CapacitorQ component, which models a capacitor with frequency-dependent losses characterized by a quality factor Q.

using CircuitSim
using GLMakie

# Create circuit for S-parameter analysis
circ = Circuit()

# Two-port configuration: Port1 -> CapacitorQ -> Port2
port1 = ACPowerSource("P1", port_num=1, impedance=50.0)
port2 = ACPowerSource("P2", port_num=2, impedance=50.0)
add_component!(circ, port1)
add_component!(circ, port2)

cap_q = CapacitorQ("C1", capacitance=100e-12, q=100.0, frequency=100e6)
add_component!(circ, cap_q)

# Ground
gnd = Ground("GND")
add_component!(circ, gnd)
Ground("GND", 0)

Connect the capacitor in series between the two ports.

# Series connection: Port1 -> Capacitor -> Port2
@connect circ port1.nplus cap_q.n1
@connect circ cap_q.n2 port2.nplus

# Ground connections
@connect circ port1.nminus gnd
@connect circ port2.nminus gnd

S-Parameter Analysis

Run S-parameter analysis from 1 MHz to 1000 MHz to characterize the capacitor's frequency response.

# S-parameter analysis
sparam = SParameterAnalysis(start=1e6, stop=1000e6, points=1001,
    sweep_type="linear",
    z0=50.0
)

# Run simulation
sp_result = simulate_qucsator(circ, sparam)

println("S-parameter simulation completed:")
println("  Frequency range: $(sp_result.frequencies_Hz[1]/1e6) - $(sp_result.frequencies_Hz[end]/1e6) MHz")
S-parameter simulation completed:
  Frequency range: 1.0 - 1000.0 MHz

Plotting Results

Extract S-parameters and convert to impedance for visualization.

# Get frequency vector in MHz
freq_MHz = sp_result.frequencies_Hz ./ 1e6

# Extract S-parameters and build S-matrix for each frequency
s11 = sp_result.s_matrix[(1,1)]
s21 = sp_result.s_matrix[(2,1)]
s12 = sp_result.s_matrix[(1,2)]
s22 = sp_result.s_matrix[(2,2)]

# Convert S-parameters to impedance using utility function
z_cap = [s2z_series([s11[i] s12[i]; s21[i] s22[i]], sp_result.z0_Ohm) for i in 1:length(s11)]

# Convert to dB for S-parameters
s11_db = 20 .* log10.(abs.(s11))
s21_db = 20 .* log10.(abs.(s21))

Impedance Magnitude and Phase

fig1 = Figure(size=(900, 800), fontsize=14)

# Impedance magnitude
ax1 = Axis(fig1[1, 1],
    xlabel = "Frequency [MHz]",
    ylabel = "Impedance Magnitude [Ω]",
    title = "Capacitor Impedance: 100 pF, Q=100 @ 100 MHz",
    xscale = log10,
    yscale = log10
)

lines!(ax1, freq_MHz, abs.(z_cap), linewidth=2, color=:blue)

fig1
Example block output

S-Parameter Magnitude

fig2 = Figure(size=(900, 600), fontsize=14)

ax2 = Axis(fig2[1, 1],
    xlabel = "Frequency [MHz]",
    ylabel = "Magnitude [dB]",
    title = "S-Parameters: 100 pF CapacitorQ (Q=100 @ 100 MHz)",
    xscale = log10
)

lines!(ax2, freq_MHz, s21_db, label="S₂₁ (Transmission)", linewidth=2, color=:blue)
lines!(ax2, freq_MHz, s11_db, label="S₁₁ (Reflection)", linewidth=2, color=:red)

ylims!(ax2, -30, 5)
axislegend(ax2, position=:rb)

fig2
Example block output