-
Notifications
You must be signed in to change notification settings - Fork 13
/
filters.py
57 lines (48 loc) · 1.73 KB
/
filters.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
Convenience functions for using Numpy/Scipy filters in the audio domain.
"""
import ctypes
import numpy as np
import os
_mydir = os.path.dirname(__file__)
_so_path = os.path.join(_mydir, "signal.so")
# Try to import Scipy. If not present, we can't use these functions.
try:
import scipy.signal as signal
scipy_imported = True
except ImportError:
scipy_imported = False
def bandpass_filter(data, low, high, fs, order=5):
"""
Does a bandpass filter over the given data.
:param data: The data (numpy array) to be filtered.
:param low: The low cutoff in Hz.
:param high: The high cutoff in Hz.
:param fs: The sample rate (in Hz) of the data.
:param order: The order of the filter. The higher the order, the tighter the roll-off.
:returns: Filtered data (numpy array).
"""
if not scipy_imported:
raise NotImplementedError("This function is unusable without Scipy")
nyq = 0.5 * fs
low = low / nyq
high = high / nyq
b, a = signal.butter(order, [low, high], btype='band')
y = signal.lfilter(b, a, data)
return y
def lowpass_filter(data, cutoff, fs, order=5):
"""
Does a lowpass filter over the given data.
:param data: The data (numpy array) to be filtered.
:param cutoff: The high cutoff in Hz.
:param fs: The sample rate in Hz of the data.
:param order: The order of the filter. The higher the order, the tighter the roll-off.
:returns: Filtered data (numpy array).
"""
if not scipy_imported:
raise NotImplementedError("This function is unusable without Scipy")
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = signal.butter(order, normal_cutoff, btype='low', analog=False)
y = signal.lfilter(b, a, data)
return y