# User's Guide

> Instructions for downloading the channel library, replaying a signal through a channel, adding site-specific noise, and visualizing a decompressed channel.

---

LLMS index: [llms.txt](/llms.txt)

---

The channels stored in this library can be used in two ways: (1) a channel can be applied directly to a user-generated signal, or (2) it can be decompressed for visualizing. Ready-to-use code for performing these functions is available under [GitHub](https://github.com/uwa-channels). You can also download the MATLAB package [here](https://github.com/uwa-channels/matlab/archive/refs/heads/main.zip). To install the Python package,

```bash
pip install uwa-channels
```

The library is also supported in `Julia`, hosted under the [`UnderwaterAcoustics.jl`](https://github.com/org-arl/UnderwaterAcoustics.jl) package. See that package's documentation for installation and usage instructions.

## Applying a channel to an arbitrary signal 

* To pass a signal of your choice through a channel, generate the desired signal in passband, respecting the bandwidth and the sampling rate limits of the chosen channel (see the [Channels](/channels) tab).
* Run `replay` on the signal. 
* Specify the noise power, and add the output of `noisegen` to the output of `replay` at a desired signal-to-noise ratio.





<ul class="nav nav-tabs" id="tabs-0" role="tablist">
  <li class="nav-item">
      <button class="nav-link disabled"
          id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
          aria-controls="tabs-00-00" aria-selected="false">
        Replay and generate noise
      </button>
    </li><li class="nav-item">
      <button class="nav-link active"
          id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
          data-td-tp-persist="matlab" aria-controls="tabs-00-01" aria-selected="true">
        MATLAB/Octave
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-00-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-02" role="tab"
          data-td-tp-persist="python" aria-controls="tabs-00-02" aria-selected="false">
        Python
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-0-content">
    <div class="tab-pane fade"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"></code></pre></div>
    </div>
    <div class="tab-pane fade show active"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-matlab" data-lang="matlab"><span class="line"><span class="cl"><span class="n">channel</span> <span class="p">=</span> <span class="n">load</span><span class="p">(</span><span class="s">&#39;blue_1.mat&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">noise</span> <span class="p">=</span> <span class="n">load</span><span class="p">(</span><span class="s">&#39;blue_1_noise.mat&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">array_index</span> <span class="p">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="n">y</span> <span class="p">=</span> <span class="n">replay</span><span class="p">(</span><span class="n">input</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">array_index</span><span class="p">,</span> <span class="n">channel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">w</span> <span class="p">=</span> <span class="n">noisegen</span><span class="p">(</span><span class="nb">size</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">fs</span><span class="p">,</span> <span class="n">array_index</span><span class="p">,</span> <span class="n">noise</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="p">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mf">0.05</span> <span class="o">*</span> <span class="n">w</span><span class="p">;</span></span></span></code></pre></div>
    </div>
    <div class="tab-pane fade"
        id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">h5py</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">uwa_channels</span> <span class="kn">import</span> <span class="n">replay</span><span class="p">,</span> <span class="n">noisegen</span>
</span></span><span class="line"><span class="cl"><span class="n">channel</span> <span class="o">=</span> <span class="n">h5py</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="s2">&#34;blue_1.mat&#34;</span><span class="p">,</span> <span class="s2">&#34;r&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">noise</span> <span class="o">=</span> <span class="n">h5py</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="s2">&#34;blue_1_noise.mat&#34;</span><span class="p">,</span> <span class="s2">&#34;r&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">array_index</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">y</span> <span class="o">=</span> <span class="n">replay</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">array_index</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">w</span> <span class="o">=</span> <span class="n">noisegen</span><span class="p">(</span><span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">array_index</span><span class="p">,</span> <span class="n">noise</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mf">0.05</span> <span class="o">*</span> <span class="n">w</span></span></span></code></pre></div>
    </div>
</div>


A simple example of this process is given in [`MATLAB`](https://github.com/uwa-channels/matlab/blob/main/examples/example_replay.m) and [`Python`](https://github.com/uwa-channels/python/blob/main/examples/example_replay.py). Before running the example code, please read the corresponding `README` file.

> [!WARNING] Important note
>
> The channels are specified for a certain acoustic bandwidth that was used during the experiment. When working with a channel, please understand that only that bandwidth is visible. If you are designing a signal that you will pass through a channel, the bandwidth of your signal must fit within the stated limit. Note that you do **not** need to decompress the channel first to replay the signal.

## Visualizing a channel

To visualize a channel as a collection of impulse responses evolving over time, you will need to decompress the channel impulse responses via `unpack`. This will produce a new channel matrix that is decompressed (it is larger than the stored original) and contains all the physical effects of delay drifting. The new matrix can be generated at arbitrary sampling rates in time, provided it is no greater than the sampling rate in delay.

A simple example of this process is given in [`MATLAB`](https://github.com/uwa-channels/matlab/blob/main/examples/example_unpack.m) and [`Python`](https://github.com/uwa-channels/python/blob/main/examples/example_unpack.py). Before running the example code, please read the corresponding `README` file.

---

Section pages:

- [Channel file format specifications](/docs/file_specifications/): Specification of the required and optional fields in the channel and noise .mat files, including the impulse response, phase/delay tracking, and metadata formats.
- [Code Contribution Guide](/docs/code_contrib/): A guide for contributing to the MATLAB and Python implementations of the channel replay library, covering setup, coding standards, and pull requests.
