Skip to content

Commit 9a7fabb

Browse files
author
Laurent Mackay
committed
halfway there
1 parent 1d692ad commit 9a7fabb

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

fooof/fit.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ def report(self, freqs=None, power_spectrum=None, freq_range=None, plt_log=False
321321
self.print_results(False)
322322

323323

324-
def fit(self, freqs=None, power_spectrum=None, freq_range=None):
324+
def fit(self, freqs=None, power_spectrum=None, freq_range=None, ap_range=None):
325325
"""Fit the full power spectrum as a combination of periodic and aperiodic components.
326326
327327
Parameters
@@ -340,7 +340,7 @@ def fit(self, freqs=None, power_spectrum=None, freq_range=None):
340340

341341
# If freqs & power_spectrum provided together, add data to object.
342342
if freqs is not None and power_spectrum is not None:
343-
self.add_data(freqs, power_spectrum, freq_range)
343+
self.add_data(freqs, power_spectrum, freq_range if ap_range is None else None)
344344
# If power spectrum provided alone, add to object, and use existing frequency data
345345
# Note: be careful passing in power_spectrum data like this:
346346
# It assumes the power_spectrum is already logged, with correct freq_range.
@@ -359,15 +359,37 @@ def fit(self, freqs=None, power_spectrum=None, freq_range=None):
359359
# Cause of failure: RuntimeError, failure to find parameters in curve_fit
360360
try:
361361

362+
if ap_range:
363+
ap_inds = (self.freqs >= ap_range[0]) & (self.freqs <= ap_range[1])
364+
ap_freqs = self.freqs[ap_inds]
365+
ap_spectrum = self.power_spectrum[ap_inds]
366+
else:
367+
ap_freqs = self.freqs
368+
ap_spectrum = self.power_spectrum
369+
362370
# Fit the aperiodic component
363-
self.aperiodic_params_ = self._robust_ap_fit(self.freqs, self.power_spectrum)
371+
self.aperiodic_params_ = self._robust_ap_fit(ap_freqs, ap_spectrum)
364372
self._ap_fit = gen_aperiodic(self.freqs, self.aperiodic_params_)
365373

366374
# Flatten the power_spectrum using fit aperiodic fit
367375
self._spectrum_flat = self.power_spectrum - self._ap_fit
376+
377+
if ap_range:
378+
per_inds = (self.freqs >= ap_range[0]) & (self.freqs <= ap_range[1])
379+
freqs_0 = self.freqs
380+
self.freqs = self.freqs[per_inds]
381+
per_spectrum_flat = self._spectrum_flat[per_inds]
382+
if freq_range:
383+
self.freq_range = freq_range
384+
else:
385+
per_spectrum_flat = np.copy(self._spectrum_flat)
386+
368387

369388
# Find peaks, and fit them with gaussians
370-
self.gaussian_params_ = self._fit_peaks(np.copy(self._spectrum_flat))
389+
self.gaussian_params_ = self._fit_peaks(per_spectrum_flat)
390+
391+
if ap_range:
392+
self.freqs=freqs_0
371393

372394
# Calculate the peak fit
373395
# Note: if no peaks are found, this creates a flat (all zero) peak fit.

0 commit comments

Comments
 (0)