Spaces:
Running
Running
| # Authors: The MNE-Python contributors. | |
| # License: BSD-3-Clause | |
| # Copyright the MNE-Python contributors. | |
| import numpy as np | |
| from scipy import linalg | |
| from .._fiff.pick import _picks_by_type, _picks_to_idx, pick_info | |
| from ..defaults import _handle_default | |
| from ..utils import _apply_scaling_array, verbose | |
| def _yule_walker(X, order=1): | |
| """Compute Yule-Walker (adapted from statsmodels). | |
| Operates in-place. | |
| """ | |
| assert X.ndim == 2 | |
| denom = X.shape[-1] - np.arange(order + 1) | |
| r = np.zeros(order + 1, np.float64) | |
| for di, d in enumerate(X): | |
| d -= d.mean() | |
| r[0] += np.dot(d, d) | |
| for k in range(1, order + 1): | |
| r[k] += np.dot(d[0:-k], d[k:]) | |
| r /= denom * len(X) | |
| rho = linalg.solve(linalg.toeplitz(r[:-1]), r[1:]) | |
| sigmasq = r[0] - (r[1:] * rho).sum() | |
| return rho, np.sqrt(sigmasq) | |
| def fit_iir_model_raw(raw, order=2, picks=None, tmin=None, tmax=None, verbose=None): | |
| r"""Fit an AR model to raw data and creates the corresponding IIR filter. | |
| The computed filter is fitted to data from all of the picked channels, | |
| with frequency response given by the standard IIR formula: | |
| .. math:: | |
| H(e^{jw}) = \frac{1}{a[0] + a[1]e^{-jw} + ... + a[n]e^{-jnw}} | |
| Parameters | |
| ---------- | |
| raw : Raw object | |
| An instance of Raw. | |
| order : int | |
| Order of the FIR filter. | |
| %(picks_good_data)s | |
| tmin : float | |
| The beginning of time interval in seconds. | |
| tmax : float | |
| The end of time interval in seconds. | |
| %(verbose)s | |
| Returns | |
| ------- | |
| b : ndarray | |
| Numerator filter coefficients. | |
| a : ndarray | |
| Denominator filter coefficients. | |
| """ | |
| start, stop = None, None | |
| if tmin is not None: | |
| start = raw.time_as_index(tmin)[0] | |
| if tmax is not None: | |
| stop = raw.time_as_index(tmax)[0] + 1 | |
| picks = _picks_to_idx(raw.info, picks) | |
| data = raw[picks, start:stop][0] | |
| # rescale data to similar levels | |
| picks_list = _picks_by_type(pick_info(raw.info, picks)) | |
| scalings = _handle_default("scalings_cov_rank", None) | |
| _apply_scaling_array(data, picks_list=picks_list, scalings=scalings) | |
| # do the fitting | |
| coeffs, _ = _yule_walker(data, order=order) | |
| return np.array([1.0]), np.concatenate(([1.0], -coeffs)) | |