Skip to content

Update Acoustics Module - #447

Merged
jmcvey3 merged 22 commits into
MHKiT-Software:developfrom
jmcvey3:millidecades
Jun 29, 2026
Merged

jmcvey3 merged 22 commits into
MHKiT-Software:developfrom
jmcvey3:millidecades

Conversation

@jmcvey3

@jmcvey3 jmcvey3 commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Enhancements:

  • Adds ability to convert sound spectral densities to millidecade format (https://doi.org/10.1121/10.0003324)
  • Adds reader for WISPR (Wideband Intelligent Signal Processing and Recording) system for hydrophones
  • Updates the export_audio function to input voltage timeseries and allow resampling to speed up recordings

Bugfixes

  • Refactors band-averaging for spectral density levels and sound pressure levels. This refactor avoids losing information at frequencies located at band boundaries, and conducts all of the band-averaging immediately after the PSD calculation.

The jupyter notebook has been updated with these changes as well.

@jmcvey3 jmcvey3 added bug Something isn't working enhancement New feature or request acoustics Acoustics Module labels Jun 16, 2026
@simmsa

simmsa commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

@jmcvey3 there is a test failure on python 3.10. Any ideas on a fix there? I don't know why python 3.10 would have a different numerical result for one calculation?

The other test failures don't seem to be caused by any of your changes.

https://github.com/MHKiT-Software/MHKiT-Python/actions/runs/27647812694/job/81902073822#step:8:419

=========================== short test summary info ============================
FAILED .github/workflows/mhkit/tests/acoustics/test_metrics.py::TestMetrics::test_spl - AssertionError: 
Not equal to tolerance rtol=1e-07, atol=1e-06

Mismatched elements: 2 / 25 (8%)
Max absolute difference among violations: 9.94873047e-06
Max relative difference among violations: 1.20091383e-07
 ACTUAL: array([[82.13845 , 80.43939 , 81.25442 , 83.51936 , 80.834045],
       [83.07329 , 81.89704 , 81.74825 , 83.87166 , 81.16063 ],
       [82.84301 , 81.24031 , 81.632744, 83.92746 , 81.09888 ],...
 DESIRED: array([[82.13845 , 80.43939 , 81.25442 , 83.51936 , 80.834045],
       [83.07329 , 81.89704 , 81.748245, 83.87166 , 81.16063 ],
       [82.843   , 81.24031 , 81.632744, 83.92745 , 81.09888 ],...
=========== 1 failed, 343 passed, 218 warnings in 627.76s (0:10:27) ============

@jmcvey3

jmcvey3 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

@jmcvey3 there is a test failure on python 3.10. Any ideas on a fix there? I don't know why python 3.10 would have a different numerical result for one calculation?

The other test failures don't seem to be caused by any of your changes.

https://github.com/MHKiT-Software/MHKiT-Python/actions/runs/27647812694/job/81902073822#step:8:419

=========================== short test summary info ============================
FAILED .github/workflows/mhkit/tests/acoustics/test_metrics.py::TestMetrics::test_spl - AssertionError: 
Not equal to tolerance rtol=1e-07, atol=1e-06

Mismatched elements: 2 / 25 (8%)
Max absolute difference among violations: 9.94873047e-06
Max relative difference among violations: 1.20091383e-07
 ACTUAL: array([[82.13845 , 80.43939 , 81.25442 , 83.51936 , 80.834045],
       [83.07329 , 81.89704 , 81.74825 , 83.87166 , 81.16063 ],
       [82.84301 , 81.24031 , 81.632744, 83.92746 , 81.09888 ],...
 DESIRED: array([[82.13845 , 80.43939 , 81.25442 , 83.51936 , 80.834045],
       [83.07329 , 81.89704 , 81.748245, 83.87166 , 81.16063 ],
       [82.843   , 81.24031 , 81.632744, 83.92745 , 81.09888 ],...
=========== 1 failed, 343 passed, 218 warnings in 627.76s (0:10:27) ============

Thanks for looking so quick. Looks like a machine precision error, since it's saying 9.94873047e-06 < 1e-7. I'll set the relative tolerance to 1e-6.

@simmsa simmsa left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jmcvey3 I think the code looks good here, but am deferring specific acoustic knowledge to you and your team.

I found 1 minor typo, everything else looks good here.

Comment thread mhkit/acoustics/spsdl.py
method_name : str
The validated method name in lowercase.
method_arg : float, int, or None
The argument associated with the method, if applicableotherwise, None.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo here in applicable

@jmcvey3

jmcvey3 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

Thanks Andrew for hopping on this! We're going to do a data comparison from work up in Igiugig with the UW research group soonish, so I'd like to wait to merge until we've started that.

@simmsa

simmsa commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Thanks Andrew for hopping on this! We're going to do a data comparison from work up in Igiugig with the UW research group soonish, so I'd like to wait to merge until we've started that.

Sounds good, happy to wait.

We are planning a 1.1 release by the end of this quarter (Jun 30). Do you think this your planned work for this work will fall outside of that timeline? That is fine IMO, just wondering if we should try to include this in the next release and if we need to adjust the release timeline accordingly.

@jmcvey3

jmcvey3 commented Jun 19, 2026

Copy link
Copy Markdown
Contributor Author

Thanks Andrew for hopping on this! We're going to do a data comparison from work up in Igiugig with the UW research group soonish, so I'd like to wait to merge until we've started that.

Sounds good, happy to wait.

We are planning a 1.1 release by the end of this quarter (Jun 30). Do you think this your planned work for this work will fall outside of that timeline? That is fine IMO, just wondering if we should try to include this in the next release and if we need to adjust the release timeline accordingly.

I'll try to have it done by then, yes, because I'd like to have this in the next release.

@simmsa simmsa mentioned this pull request Jun 29, 2026
3 tasks
@jmcvey3

jmcvey3 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

Okay after a quick code verification with UW, I am calling this good to go.

@jmcvey3
jmcvey3 merged commit e909273 into MHKiT-Software:develop Jun 29, 2026
117 of 118 checks passed
@jmcvey3
jmcvey3 deleted the millidecades branch June 29, 2026 21:05
@jmcvey3
jmcvey3 restored the millidecades branch June 30, 2026 16:39
@jmcvey3
jmcvey3 deleted the millidecades branch July 8, 2026 16:05
simmsa added a commit that referenced this pull request Jul 8, 2026
# MHKiT-Python v1.1.0

## Additions

* Acoustics: Add millicdecade and WISPR instrument support
  * Added millidecade spectral conversion
  * Added a WISPR hydrophone reader
  * Added a voltage-based `export_audio` resampling option
  * Refactored band-averaging to avoid losing information at frequency-band boundaries
  * #447
  * Author: @jmcvey3
  * Reviewer: @simmsa
* DOLfYN: Add [Nortek Aquadopp](https://www.nortekgroup.com/oceanography/aquadopp-series) ADCP support
  * Added DOLfYN support for reading Aquadopp instruments
  * Cleaned Nortek parsing code
  * Simplified handling of the non-cabled ADV orientation flag
  * #434
  * Author: @jmcvey3
  * Reviewer: @akeeste
* Examples: Add ADCP waves example: `example/adcp_waves_example.ipynb`
  * Added an example notebook showing how to ingest and analyze wave measurements from a dual-profile Nortek Signature 250 deployment at PacWave.
  * #430
  * Author: @jmcvey3
  * Reviewer: @akeeste

## Improvements

### Acoustics

- Improved flexibility and robustness of the Acoustics module
  - Added a configurable FFT length for sound pressure PSDs
  - Renamed bin/windowing attributes for clarity
  - Fixed an incorrectly signed gain correction
  - #433
  - Author: @jmcvey3
  - Reviewer: @akeeste

### DOLfYN

- Refactored PSD calculations to use `scipy.signal.welch`
  - Replaced DOLfYN's custom Welch-like PSD implementation (built each segment from bin slices, could not overlap FFT segments) with `scipy.signal.welch`
  - Removed the bin-based segment structure and added a `step` argument to control overlap
  - Dropped float32 casts in some functions in favor of float64
  - Removed `fft.py` and renamed `tools/misc.py` to `tools.py`
  - Breaking Changes:
    - NaNs are no longer tolerated in PSD calculations
    - DOLfYN defaults to 0% overlap to preserve existing array shapes
    - Acoustics defaults to 50% overlap
    - PSD output time dimension renamed to `time_psd`
  - #452
  - Author: @jmcvey3
  - Reviewer: @akeeste, @simmsa
- Improved handling of "averaged" profiles
  - Fixed handling of Nortek Signature dual-profile ADCP data by defaulting to "_avg" velocity variables when untagged ones are absent.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste
- Critical PSD bugfix
  - Fixed a bug where individual FFTs received a 50% overlap twice, which corrupted the first and last spectrum of a timeseries.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste

### Examples

- Added histograms to ADCP example
  - #448
  - Author: @browniea
  - Reviewer: @akeeste


### River/IO

- Fixed Qhull interpolation and D3D coordinate-system errors
  - #448
  - Author: @browniea
  - Reviewer: @akeeste
  - Fixes: #442, #444
- Delft3D module updates
  - Added new Delft3D coordinate names
  - Added a new grid-convergence-index calculation function
  - Added support for xarray/netCDF4 input in the D3D module
  - #428
  - Author: @browniea
  - Reviewer: @akeeste

### Wave

- NDBC Directional Wave Units
  - Fixed NDBC directional wave spectrum output to return degrees instead of radians
  - Updated polar plots so 0 deg is at the top and increases clockwise
  - #437
  - Author: @jmcvey3
  - Reviewer: @akeeste
  - Fixes: #427

### Wave/Hindcast

- Added a `hindcast_guard` exception-handling decorator (`hindcast_exceptions.py`) that surfaces a clear error on HSDS request failures, distinguishing the known NLR HSDS outage (#450) from other failures
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste

## Maintenance

- Added Python 3.13 support
  - #445
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #441
- Added [pandas 3](https://pandas.pydata.org/community/blog/pandas-3.0.html) Support
  - Updated the pandas dependency to allow pandas 3.x
  - Added a compatibility shim for NDBC missing-value handling related to pandas 3 object to String dtype api changes
  - Fixed a deprecated period alias in tests
  - #443
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #440
- Updated GitHub Actions CI, expanded installation/developer documentation, refreshed dev environment, and trimmed dependencies
  - Refactored optional dependencies
  - Standardized conda/conda-forge environment builds
  - Scoped black linting to changed files
  - #436
  - Author: @simmsa
  - Reviewer: @akeeste
- Update `rex` dependency to target pypi package to [`NLR-rex[hsds]>=0.5.0`](https://pypi.org/project/NLR-rex/)
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste
@simmsa simmsa mentioned this pull request Jul 8, 2026
simmsa pushed a commit to simmsa/MHKiT-Python that referenced this pull request Jul 10, 2026
Enhancements:
- Adds ability to convert sound spectral densities to millidecade format
(https://doi.org/10.1121/10.0003324)
- Adds reader for WISPR (Wideband Intelligent Signal Processing and
Recording) system for hydrophones
- Updates the export_audio function to input voltage timeseries and
allow resampling to speed up recordings

Bugfixes
- Refactors band-averaging for spectral density levels and sound
pressure levels. This refactor avoids losing information at frequencies
located at band boundaries, and conducts all of the band-averaging
immediately after the PSD calculation.

The jupyter notebook has been updated with these changes as well.
simmsa added a commit to simmsa/MHKiT-Python that referenced this pull request Jul 10, 2026
# MHKiT-Python v1.1.0

## Additions

* Acoustics: Add millicdecade and WISPR instrument support
  * Added millidecade spectral conversion
  * Added a WISPR hydrophone reader
  * Added a voltage-based `export_audio` resampling option
  * Refactored band-averaging to avoid losing information at frequency-band boundaries
  * MHKiT-Software#447
  * Author: @jmcvey3
  * Reviewer: @simmsa
* DOLfYN: Add [Nortek Aquadopp](https://www.nortekgroup.com/oceanography/aquadopp-series) ADCP support
  * Added DOLfYN support for reading Aquadopp instruments
  * Cleaned Nortek parsing code
  * Simplified handling of the non-cabled ADV orientation flag
  * MHKiT-Software#434
  * Author: @jmcvey3
  * Reviewer: @akeeste
* Examples: Add ADCP waves example: `example/adcp_waves_example.ipynb`
  * Added an example notebook showing how to ingest and analyze wave measurements from a dual-profile Nortek Signature 250 deployment at PacWave.
  * MHKiT-Software#430
  * Author: @jmcvey3
  * Reviewer: @akeeste

## Improvements

### Acoustics

- Improved flexibility and robustness of the Acoustics module
  - Added a configurable FFT length for sound pressure PSDs
  - Renamed bin/windowing attributes for clarity
  - Fixed an incorrectly signed gain correction
  - MHKiT-Software#433
  - Author: @jmcvey3
  - Reviewer: @akeeste

### DOLfYN

- Refactored PSD calculations to use `scipy.signal.welch`
  - Replaced DOLfYN's custom Welch-like PSD implementation (built each segment from bin slices, could not overlap FFT segments) with `scipy.signal.welch`
  - Removed the bin-based segment structure and added a `step` argument to control overlap
  - Dropped float32 casts in some functions in favor of float64
  - Removed `fft.py` and renamed `tools/misc.py` to `tools.py`
  - Breaking Changes:
    - NaNs are no longer tolerated in PSD calculations
    - DOLfYN defaults to 0% overlap to preserve existing array shapes
    - Acoustics defaults to 50% overlap
    - PSD output time dimension renamed to `time_psd`
  - MHKiT-Software#452
  - Author: @jmcvey3
  - Reviewer: @akeeste, @simmsa
- Improved handling of "averaged" profiles
  - Fixed handling of Nortek Signature dual-profile ADCP data by defaulting to "_avg" velocity variables when untagged ones are absent.
  - MHKiT-Software#430
  - Author: @jmcvey3
  - Reviewer: @akeeste
- Critical PSD bugfix
  - Fixed a bug where individual FFTs received a 50% overlap twice, which corrupted the first and last spectrum of a timeseries.
  - MHKiT-Software#430
  - Author: @jmcvey3
  - Reviewer: @akeeste

### Examples

- Added histograms to ADCP example
  - MHKiT-Software#448
  - Author: @browniea
  - Reviewer: @akeeste


### River/IO

- Fixed Qhull interpolation and D3D coordinate-system errors
  - MHKiT-Software#448
  - Author: @browniea
  - Reviewer: @akeeste
  - Fixes: MHKiT-Software#442, MHKiT-Software#444
- Delft3D module updates
  - Added new Delft3D coordinate names
  - Added a new grid-convergence-index calculation function
  - Added support for xarray/netCDF4 input in the D3D module
  - MHKiT-Software#428
  - Author: @browniea
  - Reviewer: @akeeste

### Wave

- NDBC Directional Wave Units
  - Fixed NDBC directional wave spectrum output to return degrees instead of radians
  - Updated polar plots so 0 deg is at the top and increases clockwise
  - MHKiT-Software#437
  - Author: @jmcvey3
  - Reviewer: @akeeste
  - Fixes: MHKiT-Software#427

### Wave/Hindcast

- Added a `hindcast_guard` exception-handling decorator (`hindcast_exceptions.py`) that surfaces a clear error on HSDS request failures, distinguishing the known NLR HSDS outage (MHKiT-Software#450) from other failures
  - MHKiT-Software#449
  - Author: @simmsa
  - Reviewer: @akeeste

## Maintenance

- Added Python 3.13 support
  - MHKiT-Software#445
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: MHKiT-Software#441
- Added [pandas 3](https://pandas.pydata.org/community/blog/pandas-3.0.html) Support
  - Updated the pandas dependency to allow pandas 3.x
  - Added a compatibility shim for NDBC missing-value handling related to pandas 3 object to String dtype api changes
  - Fixed a deprecated period alias in tests
  - MHKiT-Software#443
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: MHKiT-Software#440
- Updated GitHub Actions CI, expanded installation/developer documentation, refreshed dev environment, and trimmed dependencies
  - Refactored optional dependencies
  - Standardized conda/conda-forge environment builds
  - Scoped black linting to changed files
  - MHKiT-Software#436
  - Author: @simmsa
  - Reviewer: @akeeste
- Update `rex` dependency to target pypi package to [`NLR-rex[hsds]>=0.5.0`](https://pypi.org/project/NLR-rex/)
  - MHKiT-Software#449
  - Author: @simmsa
  - Reviewer: @akeeste
simmsa pushed a commit that referenced this pull request Jul 10, 2026
Enhancements:
- Adds ability to convert sound spectral densities to millidecade format
(https://doi.org/10.1121/10.0003324)
- Adds reader for WISPR (Wideband Intelligent Signal Processing and
Recording) system for hydrophones
- Updates the export_audio function to input voltage timeseries and
allow resampling to speed up recordings

Bugfixes
- Refactors band-averaging for spectral density levels and sound
pressure levels. This refactor avoids losing information at frequencies
located at band boundaries, and conducts all of the band-averaging
immediately after the PSD calculation.

The jupyter notebook has been updated with these changes as well.
simmsa added a commit that referenced this pull request Jul 10, 2026
# MHKiT-Python v1.1.0

## Additions

* Acoustics: Add millicdecade and WISPR instrument support
  * Added millidecade spectral conversion
  * Added a WISPR hydrophone reader
  * Added a voltage-based `export_audio` resampling option
  * Refactored band-averaging to avoid losing information at frequency-band boundaries
  * #447
  * Author: @jmcvey3
  * Reviewer: @simmsa
* DOLfYN: Add [Nortek Aquadopp](https://www.nortekgroup.com/oceanography/aquadopp-series) ADCP support
  * Added DOLfYN support for reading Aquadopp instruments
  * Cleaned Nortek parsing code
  * Simplified handling of the non-cabled ADV orientation flag
  * #434
  * Author: @jmcvey3
  * Reviewer: @akeeste
* Examples: Add ADCP waves example: `example/adcp_waves_example.ipynb`
  * Added an example notebook showing how to ingest and analyze wave measurements from a dual-profile Nortek Signature 250 deployment at PacWave.
  * #430
  * Author: @jmcvey3
  * Reviewer: @akeeste

## Improvements

### Acoustics

- Improved flexibility and robustness of the Acoustics module
  - Added a configurable FFT length for sound pressure PSDs
  - Renamed bin/windowing attributes for clarity
  - Fixed an incorrectly signed gain correction
  - #433
  - Author: @jmcvey3
  - Reviewer: @akeeste

### DOLfYN

- Refactored PSD calculations to use `scipy.signal.welch`
  - Replaced DOLfYN's custom Welch-like PSD implementation (built each segment from bin slices, could not overlap FFT segments) with `scipy.signal.welch`
  - Removed the bin-based segment structure and added a `step` argument to control overlap
  - Dropped float32 casts in some functions in favor of float64
  - Removed `fft.py` and renamed `tools/misc.py` to `tools.py`
  - Breaking Changes:
    - NaNs are no longer tolerated in PSD calculations
    - DOLfYN defaults to 0% overlap to preserve existing array shapes
    - Acoustics defaults to 50% overlap
    - PSD output time dimension renamed to `time_psd`
  - #452
  - Author: @jmcvey3
  - Reviewer: @akeeste, @simmsa
- Improved handling of "averaged" profiles
  - Fixed handling of Nortek Signature dual-profile ADCP data by defaulting to "_avg" velocity variables when untagged ones are absent.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste
- Critical PSD bugfix
  - Fixed a bug where individual FFTs received a 50% overlap twice, which corrupted the first and last spectrum of a timeseries.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste

### Examples

- Added histograms to ADCP example
  - #448
  - Author: @browniea
  - Reviewer: @akeeste


### River/IO

- Fixed Qhull interpolation and D3D coordinate-system errors
  - #448
  - Author: @browniea
  - Reviewer: @akeeste
  - Fixes: #442, #444
- Delft3D module updates
  - Added new Delft3D coordinate names
  - Added a new grid-convergence-index calculation function
  - Added support for xarray/netCDF4 input in the D3D module
  - #428
  - Author: @browniea
  - Reviewer: @akeeste

### Wave

- NDBC Directional Wave Units
  - Fixed NDBC directional wave spectrum output to return degrees instead of radians
  - Updated polar plots so 0 deg is at the top and increases clockwise
  - #437
  - Author: @jmcvey3
  - Reviewer: @akeeste
  - Fixes: #427

### Wave/Hindcast

- Added a `hindcast_guard` exception-handling decorator (`hindcast_exceptions.py`) that surfaces a clear error on HSDS request failures, distinguishing the known NLR HSDS outage (#450) from other failures
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste

## Maintenance

- Added Python 3.13 support
  - #445
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #441
- Added [pandas 3](https://pandas.pydata.org/community/blog/pandas-3.0.html) Support
  - Updated the pandas dependency to allow pandas 3.x
  - Added a compatibility shim for NDBC missing-value handling related to pandas 3 object to String dtype api changes
  - Fixed a deprecated period alias in tests
  - #443
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #440
- Updated GitHub Actions CI, expanded installation/developer documentation, refreshed dev environment, and trimmed dependencies
  - Refactored optional dependencies
  - Standardized conda/conda-forge environment builds
  - Scoped black linting to changed files
  - #436
  - Author: @simmsa
  - Reviewer: @akeeste
- Update `rex` dependency to target pypi package to [`NLR-rex[hsds]>=0.5.0`](https://pypi.org/project/NLR-rex/)
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste
simmsa added a commit that referenced this pull request Jul 10, 2026
# MHKiT-Python v1.1.0

## Additions

* Acoustics: Add millicdecade and WISPR instrument support
  * Added millidecade spectral conversion
  * Added a WISPR hydrophone reader
  * Added a voltage-based `export_audio` resampling option
  * Refactored band-averaging to avoid losing information at frequency-band boundaries
  * #447
  * Author: @jmcvey3
  * Reviewer: @simmsa
* DOLfYN: Add [Nortek Aquadopp](https://www.nortekgroup.com/oceanography/aquadopp-series) ADCP support
  * Added DOLfYN support for reading Aquadopp instruments
  * Cleaned Nortek parsing code
  * Simplified handling of the non-cabled ADV orientation flag
  * #434
  * Author: @jmcvey3
  * Reviewer: @akeeste
* Examples: Add ADCP waves example: `example/adcp_waves_example.ipynb`
  * Added an example notebook showing how to ingest and analyze wave measurements from a dual-profile Nortek Signature 250 deployment at PacWave.
  * #430
  * Author: @jmcvey3
  * Reviewer: @akeeste

## Improvements

### Acoustics

- Improved flexibility and robustness of the Acoustics module
  - Added a configurable FFT length for sound pressure PSDs
  - Renamed bin/windowing attributes for clarity
  - Fixed an incorrectly signed gain correction
  - #433
  - Author: @jmcvey3
  - Reviewer: @akeeste

### DOLfYN

- Refactored PSD calculations to use `scipy.signal.welch`
  - Replaced DOLfYN's custom Welch-like PSD implementation (built each segment from bin slices, could not overlap FFT segments) with `scipy.signal.welch`
  - Removed the bin-based segment structure and added a `step` argument to control overlap
  - Dropped float32 casts in some functions in favor of float64
  - Removed `fft.py` and renamed `tools/misc.py` to `tools.py`
  - Breaking Changes:
    - NaNs are no longer tolerated in PSD calculations
    - DOLfYN defaults to 0% overlap to preserve existing array shapes
    - Acoustics defaults to 50% overlap
    - PSD output time dimension renamed to `time_psd`
  - #452
  - Author: @jmcvey3
  - Reviewer: @akeeste, @simmsa
- Improved handling of "averaged" profiles
  - Fixed handling of Nortek Signature dual-profile ADCP data by defaulting to "_avg" velocity variables when untagged ones are absent.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste
- Critical PSD bugfix
  - Fixed a bug where individual FFTs received a 50% overlap twice, which corrupted the first and last spectrum of a timeseries.
  - #430
  - Author: @jmcvey3
  - Reviewer: @akeeste

### Examples

- Added histograms to ADCP example
  - #448
  - Author: @browniea
  - Reviewer: @akeeste

### River/IO

- Fixed Qhull interpolation and D3D coordinate-system errors
  - #448
  - Author: @browniea
  - Reviewer: @akeeste
  - Fixes: #442, #444
- Delft3D module updates
  - Added new Delft3D coordinate names
  - Added a new grid-convergence-index calculation function
  - Added support for xarray/netCDF4 input in the D3D module
  - #428
  - Author: @browniea
  - Reviewer: @akeeste

### Wave

- NDBC Directional Wave Units
  - Fixed NDBC directional wave spectrum output to return degrees instead of radians
  - Updated polar plots so 0 deg is at the top and increases clockwise
  - #437
  - Author: @jmcvey3
  - Reviewer: @akeeste
  - Fixes: #427

### Wave/Hindcast

- Added a `hindcast_guard` exception-handling decorator (`hindcast_exceptions.py`) that surfaces a clear error on HSDS request failures, distinguishing the known NLR HSDS outage (#450) from other failures
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste

## Maintenance

- Added Python 3.13 support
  - #445
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #441
- Added [pandas 3](https://pandas.pydata.org/community/blog/pandas-3.0.html) Support
  - Updated the pandas dependency to allow pandas 3.x
  - Added a compatibility shim for NDBC missing-value handling related to pandas 3 object to String dtype api changes
  - Fixed a deprecated period alias in tests
  - #443
  - Author: @simmsa
  - Reviewer: @akeeste
  - Fixes: #440
- Updated GitHub Actions CI, expanded installation/developer documentation, refreshed dev environment, and trimmed dependencies
  - Refactored optional dependencies
  - Standardized conda/conda-forge environment builds
  - Scoped black linting to changed files
  - #436
  - Author: @simmsa
  - Reviewer: @akeeste
- Update `rex` dependency to target pypi package to [`NLR-rex[hsds]>=0.5.0`](https://pypi.org/project/NLR-rex/)
  - #449
  - Author: @simmsa
  - Reviewer: @akeeste
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

acoustics Acoustics Module bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants