Analytic models for surface-acoustic-wave (SAW) devices: an interdigital transducer (IDT) frequency response and a 1D acoustic transfer-matrix solver for layered stacks and superlattices. Pure NumPy, no solver licence, milliseconds per spectrum.
The point of these models is that they are fast and transparent enough to sweep a design space or drop inside an optimiser, and they are checked against a real measured device rather than only against themselves.
idt— synchronous frequencyf0 = v / (2 * pitch), thesinc^2band shape of ann-pair IDT, and an electrode mass-loading correction.tmm— the[v, p]transfer matrix of a layered stack, matched-port reflection and transmission, and a superlattice builder. The transmission formula is the corrected one (an earliert = 2 Zs / denomform underflowed to ~1e-12 everywhere); this version conserves energy for a lossless stack.materials— 128-YX lithium niobate and amorphous / crystalline Ge2Sb2Te5, the phase-change pair whose stiffness change retunes a device.
pip install -e .Python 3.9+, NumPy. Matplotlib only for the examples.
Najmi et al. (2025) report a reference-arm peak near 196 MHz for a 5 um finger / 5 um gap IDT on 128-YX LiNbO3. The model:
free-surface peak : 199.6 MHz (1.8% high, ignores electrode loading)
with 2.1% loading : 195.4 MHz (0.30% from the measured 196 MHz)
The free-surface value is deliberately shown alongside the loaded one: it is a couple of percent high because it ignores the metal electrodes, and applying the standard 2.1% mass-loading slowdown, stated as an explicit parameter rather than a hidden fit, brings it onto the measurement. Run it:
python examples/najmi_validation.pyEach layer of impedance Z, speed v, thickness d maps the acoustic state
[v, p] through
M = [[cos(kd), j sin(kd)/Z],
[j Z sin(kd), cos(kd) ]], k = 2 pi f / v.
Stack the layers by matrix product; a Bragg stopband opens where each layer is a quarter wavelength. Because amorphous and crystalline GST have different sound speeds, the phase change moves the stopband, which is the tunable-filter idea.
python -m pytest tests -q- IDT peaks exactly at
v / (2 pitch); first nulls scale as1/n - the Najmi reference device lands within 1% with the documented loading
- every layer matrix is unimodular; a half-wave layer is transparent for any
Z - a lossless stack conserves energy,
|r|^2 + |t|^2 = 1, across the band - a quarter-wave superlattice opens a real stopband and passes outside it
- the crystalline stopband sits above the amorphous one, tuning range > 10%
- 1D longitudinal model. It tracks propagation along the stack. It does not resolve the true Rayleigh-wave depth profile, piezoelectric coupling, or the full anisotropy of LiNbO3; the SAW velocity is supplied as a scalar.
- Delta-function IDT. Centre frequency, bandwidth and sidelobes are captured; second-order effects (reflections between fingers, resistive and triple-transit loss) are not.
- Electrode loading is a single scalar, not a computed metallisation ratio.
- No electrical matching network, no temperature dependence.
For the full picture you still want an FEM or coupling-of-modes model; this is the fast first pass that gets the geometry roughly right before you spend the solver time.
MIT.