[med-svn] [python-mne] 242/376: adding low and high pass filters
Yaroslav Halchenko
debian at onerussian.com
Fri Nov 27 17:22:59 UTC 2015
This is an automated email from the git hooks/post-receive script.
yoh pushed a commit to annotated tag v0.1
in repository python-mne.
commit 722ad1f2ed0280948a4e21551e55c3408b26f1db
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date: Tue May 10 15:44:33 2011 -0400
adding low and high pass filters
---
mne/filter.py | 130 ++++++++++++++++++++++++++++++++++++++++++++++-
mne/tests/test_filter.py | 12 +++++
2 files changed, 141 insertions(+), 1 deletion(-)
diff --git a/mne/filter.py b/mne/filter.py
index a6a8be4..c2f4d73 100644
--- a/mne/filter.py
+++ b/mne/filter.py
@@ -43,6 +43,8 @@ def band_pass_filter(x, Fs, Fp1, Fp2):
Fs1 = Fp1 - 0.5 in Hz
Fs2 = Fp2 + 0.5 in Hz
"""
+ Fp1 = float(Fp1)
+ Fp2 = float(Fp2)
# Default values in Hz
Fs1 = Fp1 - 0.5
@@ -53,7 +55,7 @@ def band_pass_filter(x, Fs, Fp1, Fp2):
# Make x EVEN
Norig = len(x)
if Norig % 2 == 1:
- x = np.c_[x, 1]
+ x = np.r_[x, 1]
# Normalize frequencies
Ns1 = Fs1 / (Fs / 2)
@@ -74,3 +76,129 @@ def band_pass_filter(x, Fs, Fp1, Fp2):
x = x[:Norig]
return xf
+
+
+def low_pass_filter(x, Fs, Fp):
+ """Lowpass filter for the signal x.
+
+ An acausal fft algorithm is applied (i.e. no phase shift). The filter
+ functions is constructed from a Hamming window (window used in "firwin2"
+ function) to avoid ripples in the frequency reponse (windowing is a
+ smoothing in frequency domain)
+
+ Parameters
+ ----------
+ x : 1d array
+ Signal to filter
+ Fs : float
+ sampling rate
+ Fp : float
+ cut-off frequency
+
+ Returns
+ -------
+ xf : array
+ x filtered
+
+ Notes
+ -----
+ The passbands (Fp1 Fp2) frequencies are defined in Hz as
+ -------------------------
+ | \
+ | \
+ | \
+ | \
+ | -----------------
+ |
+ Fp Fp+0.5
+
+ """
+ Fp = float(Fp)
+
+ assert x.ndim == 1
+
+ # Make x EVEN
+ Norig = len(x)
+ if Norig % 2 == 1:
+ x = np.r_[x, 1]
+
+ # Normalize frequencies
+ Ns = (Fp + 0.5) / (Fs / 2)
+ Np = Fp / (Fs / 2)
+
+ # Construct the filter function H(f)
+ N = len(x)
+
+ B = signal.firwin2(N, [0, Np, Ns, 1], [1, 1, 0, 0])
+
+ # Make zero-phase filter function
+ H = np.abs(fft(B))
+
+ xf = np.real(ifft(fft(x) * H))
+ xf = xf[:Norig]
+ x = x[:Norig]
+
+ return xf
+
+
+def high_pass_filter(x, Fs, Fp):
+ """Highpass filter for the signal x.
+
+ An acausal fft algorithm is applied (i.e. no phase shift). The filter
+ functions is constructed from a Hamming window (window used in "firwin2"
+ function) to avoid ripples in the frequency reponse (windowing is a
+ smoothing in frequency domain)
+
+ Parameters
+ ----------
+ x : 1d array
+ Signal to filter
+ Fs : float
+ sampling rate
+ Fp : float
+ cut-off frequency
+
+ Returns
+ -------
+ xf : array
+ x filtered
+
+ Notes
+ -----
+ The passbands (Fp1 Fp2) frequencies are defined in Hz as
+ -----------------------
+ /|
+ / |
+ / |
+ / |
+ ---------- |
+ |
+ Fp-0.5 Fp
+
+ """
+ Fp = float(Fp)
+
+ assert x.ndim == 1
+
+ # Make x ODD
+ Norig = len(x)
+ if Norig % 2 == 0:
+ x = np.r_[x, 1]
+
+ # Normalize frequencies
+ Ns = (Fp - 0.5) / (Fs / 2)
+ Np = Fp / (Fs / 2)
+
+ # Construct the filter function H(f)
+ N = len(x)
+
+ B = signal.firwin2(N, [0, Ns, Np, 1], [0, 0, 1, 1])
+
+ # Make zero-phase filter function
+ H = np.abs(fft(B))
+
+ xf = np.real(ifft(fft(x) * H))
+ xf = xf[:Norig]
+ x = x[:Norig]
+
+ return xf
diff --git a/mne/tests/test_filter.py b/mne/tests/test_filter.py
new file mode 100644
index 0000000..98f5ff1
--- /dev/null
+++ b/mne/tests/test_filter.py
@@ -0,0 +1,12 @@
+import numpy as np
+from numpy.testing import assert_array_almost_equal
+
+from ..filter import band_pass_filter, high_pass_filter, low_pass_filter
+
+def test_filters():
+ a = np.random.randn(1000)
+ Fs = 1000
+ bp = band_pass_filter(a, Fs, 4, 8)
+ lp = low_pass_filter(a, Fs, 8)
+ hp = high_pass_filter(lp, Fs, 4)
+ assert_array_almost_equal(hp, bp, 2)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git
More information about the debian-med-commit
mailing list