diff --git a/changelog.md b/changelog.md index d86a63602..34c068f7a 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,10 @@ * Added [`PowerSpectrum.compress()`](https://lumicks-pylake.readthedocs.io/en/latest/_api/lumicks.pylake.force_calibration.power_spectrum.PowerSpectrum.html#lumicks.pylake.force_calibration.power_spectrum.PowerSpectrum.compress#) to discard high frequency spectral data for a downsampled spectrum to conserve memory. +#### Improvements + +* Force `num_points_per_block` to be integer when down-sampling a [`PowerSpectrum`](https://lumicks-pylake.readthedocs.io/en/latest/_api/lumicks.pylake.force_calibration.power_spectrum.PowerSpectrum.html). + ## v1.6.0 | t.b.d. #### New features diff --git a/lumicks/pylake/force_calibration/power_spectrum.py b/lumicks/pylake/force_calibration/power_spectrum.py index f93dbcde5..153cbb85b 100644 --- a/lumicks/pylake/force_calibration/power_spectrum.py +++ b/lumicks/pylake/force_calibration/power_spectrum.py @@ -264,6 +264,11 @@ def downsampled_by(self, factor, reduce=np.mean) -> "PowerSpectrum": (Deprecated) Function to use for down-sampling the data. Only `np.mean` will be supported going forward. """ + if int(factor) != factor: + raise NotImplementedError("Only integer downsampling factors are supported") + else: + factor = int(factor) + if reduce != np.mean: warnings.warn( DeprecationWarning( @@ -271,6 +276,7 @@ def downsampled_by(self, factor, reduce=np.mean) -> "PowerSpectrum": "removed in a future version of Pylake" ) ) + return PowerSpectrum( downsample(self.frequency, factor, reduce), downsample(self.power, factor, reduce), diff --git a/lumicks/pylake/force_calibration/tests/test_power_spectrum.py b/lumicks/pylake/force_calibration/tests/test_power_spectrum.py index b3acb1534..838d5da41 100644 --- a/lumicks/pylake/force_calibration/tests/test_power_spectrum.py +++ b/lumicks/pylake/force_calibration/tests/test_power_spectrum.py @@ -390,3 +390,15 @@ def test_compress(): assert compressed._num_points_per_block == 100 np.testing.assert_allclose(ps_downsampled.frequency, ps_downsampled.frequency) np.testing.assert_allclose(compressed.power, ps_downsampled.power) + + +def test_integer_num_points_per_block(): + ps = PowerSpectrum(np.arange(500), np.arange(500), 78125, total_duration=1) + ps_ds = ps.downsampled_by(10.0) + ps_ds_int = ps.downsampled_by(10) + np.testing.assert_allclose(ps_ds.power, ps_ds_int.power) + + with pytest.raises( + NotImplementedError, match="Only integer downsampling factors are supported" + ): + ps.downsampled_by(10.00001)