Observed since 20 Oct, 18:22 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A Full-Stack Python based library for working with acoustic fields for holgraphy
AcousTools is an acoustic holography toolkit which enables easy development of applications from start to finish. The idea is to allow developers to use AcousTools from idea generation to simulation to visualisation to deployment on hardware. The Acoustic Full-stack explains the stages of creating an acoustic application and AcousTools can be used at each step:
AcousTools is based on PyTorch and uses tensors to represent the data. This means that CUDA based GPU acceleration is available if your computer has a CUDA GPU. The shapes of these tensors are:
This tutorial will aim to help a new developer to get started with AcousTools from which point they can explore the documentation further.
See Here for examples of code using AcousTools. The Paper for AcousTools can be seen Here The Preprint of AcousTools can be found on arXiv
Optionally create a virtual environment to install AcousTools in Optionally install the correct version of PyTorch
Run
pip install acoustools
Or visit AcousTools' on PyPi
Clone the repo and then run
pip install -r <path-to-clone>/requirements.txt
pip install -e <path-to-clone>/acoustools/ --config-settings editable_mode=strict
Use python<version> -m before the above commands to use a specific version of python.
where <path-to-clone> is the local location of the repository
Or to view the documentation for AcousTools locally, firstly install pdoc:
pip install pdoc
Then run pdoc on AcousTools to create a locally hosted server containing the documentation
python -m pdoc <path-to-clone>/acoustools/ --math
See Here for examples of code using AcousTools.
The standard interface to AcousTools is composed of a series of functions each of which can be composed to obtain the behaviour that the user defines. Here, we will step through a simple example in order to understand AcousTools fundamentals
Firstly, the points and array should be defined before anything else can be done. We will use two array, pointing at one another and a point at the mid point of these two arrays as the target. AcousTools considers this central point to be the origin of the coordinate space.
from acoustools.Utilities import create_point, transducers
board = transducers(16) #create two boards of 16x16 transducers
p = create_point(N=1, x=0, y=0, z=0)
There are built in variables for common transducer arrays - the top-bottom array, a top only array or a bottom only array. These can be defined as
from acoutsools.Utilities import TOP_BOARD #16x16 transducer array above the working area
from acoutsools.Utilities import BOTTOM_BOARD #16x16 transducer array below the working area
from acoutsools.Utilities import TRANSDUCERS #Two 16x16 transducer arrays above and below the working area
And multiple points could be defined at once by supplying multiple values to (x,y,z) parameters in create_point
In order to model the sound propagation from the array to a point, a propagator is needed. This is a matrix that models how each source contributes to each of the points and is often modelled as a piston source. This can be compued using
from acoustools.Utilities import forward_model
F = forward_model(points = p, transducers = board)
Which will model sound from board to p. This could be replaced with any other matrix such as one that consider sound scattering using BEM (see acoustools.BEM)
The next stage is to compute the signals that will focus the sound waves at the points after the waves are modelled using the propagator. There are a variety of solvers which are good for various different applications.
wgs: Good for multipoint focusing with very low variance of the pressure between points. Slower computationgspat: Good for very fast computation for multipoint focusing. Larger variance in pressure but normally not too largenaive: Very fast computation but very large variance in pressure.kd_solver: Very fast computation but only focuses at a single point.For example
from acoustools.Solvers import naive
x = naive(points=p, board=board, A=F)
But equally any other solver could be swapped in for different purposes.
Once a hologram (x) has been computed - the sound field can be validated using various different metrics
A@x where @ is matric multiplicationThere are functions for all of these metrics
from acoustools.Utilities import propagate, propagate_abs, propagate_phase
from acoustools.Gorkov import gorkov
from acoustools.Force import compute_force
p = propagate(activations=x, points=p, board=board, A=F) #p = F@x
pressure = propagate_abs(activations=x, points=p, board=board, A=F) #pressure = p.abs()
phase = propagate_phase(activations=x, points=p, board=board, A=F) #pressure = p.angle()
U = gorkov(activations=x, points=p, board=board)
fx,fy,fz = compute_force(activations=x, points=p, board=board)
These can also be used to visualise the whole sound field using AcousTools built in visualiser - the visualiser has a large scope for customisation and so the full explanation cannot be given here but it requires
ABCpropagate_abs will render the pressure field while gorkov will show the Gor’kov potential at each point. A list of functions can be passed to render multipple fieldsfrom acoustools.Visualiser import Visualise, ABC
Visualise(*ABC(0.01),
x, points=p,
colour_functions=[propagate_abs,gorkov],
colour_function_args=[{'board':board}, {'board':board}]
res=(200,200))
Finally, the signals can be sent to a hardware device. Currently AcousTools uses OpenMPD’s driver and requires Windows to run. In order to send signals, simply connect and send the hologram
with LevitatorController(ids = 1000,999)) as lev:
lev.levitate(x)
Different arrays may have different ids to connect - simply change the id to the correct value.
Most functions parameters in AcousTools are optional meaning if they are not provided a common value will be assumed. This can cause problems if the assumed value is not the correct one. See the documentation for details as to what the defauls parameters are. For example
p = propagate(activations=x, points=p, board=board, A=F)
p = propagate(x,p)
Are equivalent for a top-bottom array as the TRANSDUCERS variable is the default board that is used. The propagator A is also inferred from the board and the points - without explicit definition the piston model is used.
AcousTools contains an alternative very high-level interface which abstracts almost all the acoustics details away. This may or may not be the correct choice for any given user and depends how much control over the signals and solvers that you need. These are called Contexts and can be uses as:
from acoustools.HighLevel import TopBottomContext
with TopBottomContext() as ctx:
ctx.create_focus()
ctx.send_solution()
This sets the context up, create a focus and send it to the physical device connected over USB. In order to change the position a location parameter can be applied to the create_focus method which should be an AcousTools point or an iterable of point locations.
acoustools is distributed under the terms of the MIT license.
Please Cite AcousTools as:
@ARTICLE{11369395,
author={Mukherjee, Joshua and Christopoulos, Giorgos and Shen, Zhouyang and Subramanian, Sriram and Hirayama, Ryuji},
journal={IEEE Transactions on Ultrasonics},
title={AcousTools: A “Full-Stack,” Python-Based, Acoustic Holography Library},
year={2026},
volume={73},
number={2},
pages={99-111},
keywords={Acoustics;Transducers;Holography;Scattering;Levitation;Computational modeling;Three-dimensional printing;Software libraries;Acoustic applications;Python;Acoustic applications;acoustic field;levitation;software libraries},
doi={10.1109/TUSON.2026.3659798}}
pypistats · 75 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 25 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-19 – 2026-10-19 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-18 – 2026-10-18 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-17 – 2026-10-17 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-16 – 2026-10-16 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-15 – 2026-10-15 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-14 – 2026-10-14 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-13 – 2026-10-13 | 14 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-12 – 2026-10-12 | 10 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-11 – 2026-10-11 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-10 – 2026-10-10 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-09 – 2026-10-09 | 10 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-08 – 2026-10-08 | 16 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-07 – 2026-10-07 | 30 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-06 – 2026-10-06 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-05 – 2026-10-05 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-04 – 2026-10-04 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-02 – 2026-10-02 | 8 | 2026-10-21T10:51:23.8842538Z |
| 2026-10-01 – 2026-10-01 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-30 – 2026-09-30 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-29 – 2026-09-29 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-28 – 2026-09-28 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-27 – 2026-09-27 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-26 – 2026-09-26 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-25 – 2026-09-25 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-24 – 2026-09-24 | 22 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-23 – 2026-09-23 | 4 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-22 – 2026-09-22 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-21 – 2026-09-21 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-20 – 2026-09-20 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-19 – 2026-09-19 | 23 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-18 – 2026-09-18 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-17 – 2026-09-17 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-16 – 2026-09-16 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-15 – 2026-09-15 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-14 – 2026-09-14 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-12 – 2026-09-12 | 8 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-10 – 2026-09-10 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-09 – 2026-09-09 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-07 – 2026-09-07 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-06 – 2026-09-06 | 6 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-04 – 2026-09-04 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-09-03 – 2026-09-03 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-31 – 2026-08-31 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-30 – 2026-08-30 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-28 – 2026-08-28 | 47 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-26 – 2026-08-26 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-25 – 2026-08-25 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-24 – 2026-08-24 | 29 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-23 – 2026-08-23 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-22 – 2026-08-22 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-21 – 2026-08-21 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-20 – 2026-08-20 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-19 – 2026-08-19 | 4 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-18 – 2026-08-18 | 60 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-17 – 2026-08-17 | 23 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-16 – 2026-08-16 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-14 – 2026-08-14 | 6 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-13 – 2026-08-13 | 4 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-12 – 2026-08-12 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-11 – 2026-08-11 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-09 – 2026-08-09 | 8 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-08 – 2026-08-08 | 4 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-07 – 2026-08-07 | 5 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-06 – 2026-08-06 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-05 – 2026-08-05 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-04 – 2026-08-04 | 7 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-03 – 2026-08-03 | 18 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-02 – 2026-08-02 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-08-01 – 2026-08-01 | 3 | 2026-10-21T10:51:23.8842538Z |
| 2026-07-31 – 2026-07-31 | 75 | 2026-10-21T10:51:23.8842538Z |
| 2026-07-30 – 2026-07-30 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-07-28 – 2026-07-28 | 1 | 2026-10-21T10:51:23.8842538Z |
| 2026-07-27 – 2026-07-27 | 2 | 2026-10-21T10:51:23.8842538Z |
| 2026-07-23 – 2026-07-23 | 9 | 2026-10-21T10:51:23.8842538Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 1.2.0 | 31 Jul 2026 | 0 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 18:22 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:286c739505c9cf2a40242a0aab589390f5c10e8d4df19180bac16e2bae134bbd