Underwater Acoustic Channel Toolbox — Python
Python toolbox for replaying signals through measured underwater acoustic channels, generating realistic ocean noise, and unpacking stored impulse responses. To learn more about the channels, check out the documentation.
Please report bugs and suggest enhancements by creating a new issue. We welcome your feedback. See CONTRIBUTING.md for more information.
Installation
pip install uwa-channels
Functions
| Function | Description |
|---|---|
replay |
Pass a passband signal through a measured underwater acoustic channel. |
noisegen |
Generate realistic ocean noise: pink Gaussian (17 dB/decade), spatially-correlated Gaussian, or impulsive (symmetric α-stable). |
unpack |
Reconstruct the full time-varying impulse response from the compressed representation. |
load_channel, load_noise |
Open a channel or noise MAT-file saved either with or without -v7.3. |
Quick start
Download the channel MAT-files from Zenodo and place them in your working directory.
Replay and noise generation
from uwa_channels import replay, noisegen, load_channel, load_noise
channel = load_channel("blue_1.mat")
noise = load_noise("blue_noise.mat")
array_index = [0, 1, 2]
y = replay(input, fs, array_index, channel)
w = noisegen(y.shape, fs, array_index, noise)
r = y + 0.05 * w
See examples/example_replay.py for a complete example that generates a BPSK signal, replays it through the blue_1 channel, adds noise, and plots the received signal, cross-correlation, and spectrum.
Use
load_channel/load_noiserather thanh5py.Filedirectly. The file-format specification asks for-v7.3(HDF5), andh5pyreads only that; MATLAB'ssavewrites MAT v5 unless told otherwise. The loaders accept either flavour and return somethingreplay,noisegenandunpacktake unchanged — for a-v7.3file they return the same openh5py.Fileas before.
Unpack
from uwa_channels import unpack, load_channel
channel = load_channel("blue_1.mat")
unpacked = unpack(fs_time, array_index, channel)
See examples/example_unpack.py for details.
Channel format
Each channel MAT-file contains:
| Variable | Description |
|---|---|
h_hat |
Estimated impulse response, shape (K, M, T) |
theta_hat or phi_hat |
Phase or delay-phase trajectory, shape (M, N) |
params |
Group with fs_delay, fs_time, fc |
meta |
Estimation metadata (see estimate repo) |
version |
File format version |
Each noise MAT-file contains:
| Field | Description |
|---|---|
Fs |
Sampling rate at which noise statistics were measured [Hz] |
R |
Signal bandwidth [Hz] |
alpha |
Stability index (2 = Gaussian, < 2 = impulsive) |
beta |
Mixing coefficients, shape (M, M, K) |
fc |
Center frequency [Hz] |
rms_power |
Per-channel RMS power scaling, shape (M, 1) |
version |
Noise struct version |
Tests
This repository includes automated testing via GitHub Actions. The tests folder contains five test suites:
| Test | What it verifies |
|---|---|
test_replay |
Generates random mobile channels ({static, mobile} × {theta_hat, phi_hat}), transmits a signal, and checks that cross-correlation peaks match the true multipath structure; also checks that array_index isolates individual hydrophones and that the output power scaling is O(1). |
test_noisegen |
Verifies output size, spectral shape (17 dB/decade), spatial correlation (theoretical vs. sample), bandpass filtering, rms_power scaling, Gaussianity (α = 2), and heavy-tail behavior (α < 2). |
test_unpack |
Tests all tracking modes (none, theta_hat, phi_hat, f_resamp, and combinations) for correct impulse response reconstruction. |
test_io |
Writes the same channel and noise as both -v7.3 and MAT v5, and checks that load_channel and load_noise hand replay and noisegen identical data either way. |
test_zenodo |
Downloads a channel and its noise file from Zenodo and replays a probe through them, checking the arrival against h_hat and phi_hat and the generated noise against beta. See below. |
Tests run automatically on every push, ensuring continued correctness of the core functions.
Testing against the released files
The first four suites build their channels in memory, so they cannot catch a disagreement between the package and the files you actually download. test_zenodo starts from the files: it fetches black.mat and black_noise.mat (162 MB, checked against the MD5 digests Zenodo publishes), replays a BPSK probe through the channel, and checks that
- the arrival lands within two samples of
fs_delayof whereh_hatand the delay driftphi_hat / (2π f_c)say it should, - the measured power-delay profile matches the one stored in
h_hat, - the generated noise has the spatial covariance
betaprescribes, and - both
load_channelandload_noiseread the released data identically from a-v7.3and a MAT v5 copy.
Because of the download it is opt-in:
PYTHONPATH=src pytest tests/test_zenodo.py --zenodo
Files land in ~/.cache/uwa-channels, or in $UWA_CHANNELS_CACHE if you set it; point that at a directory where you already keep the library and nothing is downloaded. Once the files are there the suite runs as part of a plain pytest. UWA_CHANNELS_ZENODO=1 is equivalent to --zenodo.
Related repositories
| Repository | Description |
|---|---|
| uwa-channels/matlab | MATLAB/Octave implementation of the replay toolbox. |
| uwa-channels/estimate | Channel estimation from single-carrier signals, with visualization. |
License
The license is available in the LICENSE file within this repository.
© 2025–2026, Underwater Acoustic Channels Group.
Metadata
Release files for uwa-channels 0.7.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| uwa_channels-0.7.1.tar.gz | 39.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| uwa_channels-0.7.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.3 kB
Release files / uwa_channels-0.7.1.tar.gz
| Download URL | uwa_channels-0.7.1.tar.gz |
|---|---|
| Size | 39.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
815e721ff22469e11fc838c9748bbd92e4e96832421894e7a39859173b153790
|
|
BLAKE2b-256 checksum How to use checksums |
be16838a382601794aea592a8fbbd4dfbbb8bdef2f46719f0aac342ba9fe7ed1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / uwa_channels-0.7.1-py3-none-any.whl
| Download URL | uwa_channels-0.7.1-py3-none-any.whl |
|---|---|
| Size | 15.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1799ef898ca452ad9f19af44979d10ac0b92252267c3174750a93c90e66b279d
|
|
BLAKE2b-256 checksum How to use checksums |
e6bce7b04e126375e06c1918535322ddd6f455b4ec5796ef669d6d34a56ea670
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log