diff --git a/pyproject.toml b/pyproject.toml index 8a100b7..bd90388 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "scgenerator" -version = "0.4.2" +version = "0.4.3" description = "Simulate nonlinear pulse propagation in optical fibers" readme = "README.md" authors = [{ name = "Benoit Sierro", email = "benoit.sierro@iap.unibe.ch" }] diff --git a/src/scgenerator/noise.py b/src/scgenerator/noise.py index b249172..a321bac 100644 --- a/src/scgenerator/noise.py +++ b/src/scgenerator/noise.py @@ -143,7 +143,7 @@ class NoiseMeasurement: return freq[left:], psd[left:] def sample_spectrum( - self, nf: int, dt: float | None = None, log_mode: bool = False + self, nf: int, dt: float | None = None, log_mode: bool = False, left: float | None = None ) -> tuple[np.ndarray, np.ndarray]: """ sample an amplitude spectrum with nt points. The corresponding sample spacing in the time @@ -156,6 +156,9 @@ class NoiseMeasurement: dt : float | None, optional if given, freq will only be sampled up to 0.5/dt. if that value is higher than the max of freq, an exception is raised. + left : float | None, optional + extend current PSD to the lower frequency range by assuming a constant value of `left`. + if None (default), extends with the last value log_mode : bool, optional sample on a log-log scale rather than on a linear scale, by default False """ @@ -171,19 +174,24 @@ class NoiseMeasurement: if log_mode: interp = np.zeros_like(f) ind = self.freq > 0 + if left is not None and left <= 0: + raise ValueError(f"value {left!r} for `left` in log mode is invalid") + elif left is None: + left = self.psd[ind][0] interp[1:] = np.exp( np.interp( np.log(f[1:]), np.log(self.freq[ind]), np.log(self.psd[ind]), - left=np.log(self.psd[ind][0]), + left=np.log(left), right=np.log(self.psd[ind][-1]), ) ) if self.freq[0] == 0: interp[0] = self.psd[0] else: - interp = np.interp(f, self.freq, self.psd, left=self.psd[0], right=self.psd[-1]) + left = left if left is not None else self.psd[0] + interp = np.interp(f, self.freq, self.psd, left=left, right=self.psd[-1]) return f, interp def resampled(self, nf: int, dt: float | None = None, log_mode: bool = False) -> Self: @@ -211,7 +219,7 @@ class NoiseMeasurement: sample on a log-log scale rather than on a linear scale, by default False """ - freq, amp = self.sample_spectrum(nf, dt, log_mode) + freq, amp = self.sample_spectrum(nf, dt, log_mode, left=0) fs = freq[-1] * 2 if nf % 2: