ezmsg-sigproc 2.5.0__py3-none-any.whl → 2.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ezmsg/sigproc/__version__.py +2 -2
- ezmsg/sigproc/activation.py +5 -11
- ezmsg/sigproc/adaptive_lattice_notch.py +11 -30
- ezmsg/sigproc/affinetransform.py +16 -42
- ezmsg/sigproc/aggregate.py +17 -34
- ezmsg/sigproc/bandpower.py +12 -20
- ezmsg/sigproc/base.py +141 -1276
- ezmsg/sigproc/butterworthfilter.py +8 -16
- ezmsg/sigproc/butterworthzerophase.py +7 -16
- ezmsg/sigproc/cheby.py +4 -10
- ezmsg/sigproc/combfilter.py +5 -8
- ezmsg/sigproc/coordinatespaces.py +142 -0
- ezmsg/sigproc/decimate.py +3 -7
- ezmsg/sigproc/denormalize.py +6 -11
- ezmsg/sigproc/detrend.py +3 -4
- ezmsg/sigproc/diff.py +8 -17
- ezmsg/sigproc/downsample.py +11 -20
- ezmsg/sigproc/ewma.py +11 -28
- ezmsg/sigproc/ewmfilter.py +1 -1
- ezmsg/sigproc/extract_axis.py +3 -4
- ezmsg/sigproc/fbcca.py +34 -59
- ezmsg/sigproc/filter.py +19 -45
- ezmsg/sigproc/filterbank.py +37 -74
- ezmsg/sigproc/filterbankdesign.py +7 -14
- ezmsg/sigproc/fir_hilbert.py +13 -30
- ezmsg/sigproc/fir_pmc.py +5 -10
- ezmsg/sigproc/firfilter.py +12 -14
- ezmsg/sigproc/gaussiansmoothing.py +5 -9
- ezmsg/sigproc/kaiser.py +11 -15
- ezmsg/sigproc/math/abs.py +4 -3
- ezmsg/sigproc/math/add.py +121 -0
- ezmsg/sigproc/math/clip.py +4 -1
- ezmsg/sigproc/math/difference.py +100 -36
- ezmsg/sigproc/math/invert.py +3 -3
- ezmsg/sigproc/math/log.py +5 -6
- ezmsg/sigproc/math/scale.py +2 -0
- ezmsg/sigproc/messages.py +1 -2
- ezmsg/sigproc/quantize.py +3 -6
- ezmsg/sigproc/resample.py +17 -38
- ezmsg/sigproc/rollingscaler.py +12 -37
- ezmsg/sigproc/sampler.py +19 -37
- ezmsg/sigproc/scaler.py +11 -22
- ezmsg/sigproc/signalinjector.py +7 -18
- ezmsg/sigproc/slicer.py +14 -34
- ezmsg/sigproc/spectral.py +3 -3
- ezmsg/sigproc/spectrogram.py +12 -19
- ezmsg/sigproc/spectrum.py +17 -38
- ezmsg/sigproc/transpose.py +12 -24
- ezmsg/sigproc/util/asio.py +25 -156
- ezmsg/sigproc/util/axisarray_buffer.py +12 -26
- ezmsg/sigproc/util/buffer.py +22 -43
- ezmsg/sigproc/util/message.py +17 -31
- ezmsg/sigproc/util/profile.py +23 -174
- ezmsg/sigproc/util/sparse.py +7 -15
- ezmsg/sigproc/util/typeresolution.py +17 -83
- ezmsg/sigproc/wavelets.py +10 -19
- ezmsg/sigproc/window.py +29 -83
- ezmsg_sigproc-2.7.0.dist-info/METADATA +60 -0
- ezmsg_sigproc-2.7.0.dist-info/RECORD +64 -0
- ezmsg/sigproc/synth.py +0 -774
- ezmsg_sigproc-2.5.0.dist-info/METADATA +0 -72
- ezmsg_sigproc-2.5.0.dist-info/RECORD +0 -63
- {ezmsg_sigproc-2.5.0.dist-info → ezmsg_sigproc-2.7.0.dist-info}/WHEEL +0 -0
- /ezmsg_sigproc-2.5.0.dist-info/licenses/LICENSE.txt → /ezmsg_sigproc-2.7.0.dist-info/licenses/LICENSE +0 -0
ezmsg/sigproc/window.py
CHANGED
|
@@ -5,21 +5,21 @@ import typing
|
|
|
5
5
|
import ezmsg.core as ez
|
|
6
6
|
import numpy.typing as npt
|
|
7
7
|
import sparse
|
|
8
|
-
from array_api_compat import
|
|
8
|
+
from array_api_compat import get_namespace, is_pydata_sparse_namespace
|
|
9
|
+
from ezmsg.baseproc import (
|
|
10
|
+
BaseStatefulTransformer,
|
|
11
|
+
BaseTransformerUnit,
|
|
12
|
+
processor_state,
|
|
13
|
+
)
|
|
9
14
|
from ezmsg.util.messages.axisarray import (
|
|
10
15
|
AxisArray,
|
|
16
|
+
replace,
|
|
11
17
|
slice_along_axis,
|
|
12
18
|
sliding_win_oneaxis,
|
|
13
|
-
replace,
|
|
14
19
|
)
|
|
15
20
|
|
|
16
|
-
from .base import (
|
|
17
|
-
BaseStatefulTransformer,
|
|
18
|
-
BaseTransformerUnit,
|
|
19
|
-
processor_state,
|
|
20
|
-
)
|
|
21
|
-
from .util.sparse import sliding_win_oneaxis as sparse_sliding_win_oneaxis
|
|
22
21
|
from .util.profile import profile_subpub
|
|
22
|
+
from .util.sparse import sliding_win_oneaxis as sparse_sliding_win_oneaxis
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class Anchor(enum.Enum):
|
|
@@ -55,9 +55,7 @@ class WindowState:
|
|
|
55
55
|
out_dims: list[str] | None = None
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
class WindowTransformer(
|
|
59
|
-
BaseStatefulTransformer[WindowSettings, AxisArray, AxisArray, WindowState]
|
|
60
|
-
):
|
|
58
|
+
class WindowTransformer(BaseStatefulTransformer[WindowSettings, AxisArray, AxisArray, WindowState]):
|
|
61
59
|
"""
|
|
62
60
|
Apply a sliding window along the specified axis to input streaming data.
|
|
63
61
|
The `windowing` method is perhaps the most useful and versatile method in ezmsg.sigproc, but its parameterization
|
|
@@ -99,19 +97,13 @@ class WindowTransformer(
|
|
|
99
97
|
# if self.settings.newaxis is None:
|
|
100
98
|
# ez.logger.warning("`newaxis=None` will be replaced with `newaxis='win'`.")
|
|
101
99
|
# object.__setattr__(self.settings, "newaxis", "win")
|
|
102
|
-
if
|
|
103
|
-
self.settings.window_shift is None
|
|
104
|
-
and self.settings.zero_pad_until != "input"
|
|
105
|
-
):
|
|
100
|
+
if self.settings.window_shift is None and self.settings.zero_pad_until != "input":
|
|
106
101
|
ez.logger.warning(
|
|
107
102
|
"`zero_pad_until` must be 'input' if `window_shift` is None. "
|
|
108
103
|
f"Ignoring received argument value: {self.settings.zero_pad_until}"
|
|
109
104
|
)
|
|
110
105
|
object.__setattr__(self.settings, "zero_pad_until", "input")
|
|
111
|
-
elif
|
|
112
|
-
self.settings.window_shift is not None
|
|
113
|
-
and self.settings.zero_pad_until == "input"
|
|
114
|
-
):
|
|
106
|
+
elif self.settings.window_shift is not None and self.settings.zero_pad_until == "input":
|
|
115
107
|
ez.logger.warning(
|
|
116
108
|
"windowing is non-deterministic with `zero_pad_until='input'` as it depends on the size "
|
|
117
109
|
"of the first input. We recommend using `zero_pad_until='shift'` when `window_shift` is float-valued."
|
|
@@ -135,9 +127,7 @@ class WindowTransformer(
|
|
|
135
127
|
def _reset_state(self, message: AxisArray) -> None:
|
|
136
128
|
_newaxis = self.settings.newaxis or "win"
|
|
137
129
|
if not self._state.newaxis_warned and _newaxis in message.dims:
|
|
138
|
-
ez.logger.warning(
|
|
139
|
-
f"newaxis {_newaxis} present in input dims. Using {_newaxis}_win instead"
|
|
140
|
-
)
|
|
130
|
+
ez.logger.warning(f"newaxis {_newaxis} present in input dims. Using {_newaxis}_win instead")
|
|
141
131
|
self._state.newaxis_warned = True
|
|
142
132
|
self.settings.newaxis = f"{_newaxis}_win"
|
|
143
133
|
|
|
@@ -154,33 +144,20 @@ class WindowTransformer(
|
|
|
154
144
|
self._state.window_shift_samples = int(self.settings.window_shift * fs)
|
|
155
145
|
if self.settings.zero_pad_until == "none":
|
|
156
146
|
req_samples = self._state.window_samples
|
|
157
|
-
elif
|
|
158
|
-
self.settings.zero_pad_until == "shift"
|
|
159
|
-
and self.settings.window_shift is not None
|
|
160
|
-
):
|
|
147
|
+
elif self.settings.zero_pad_until == "shift" and self.settings.window_shift is not None:
|
|
161
148
|
req_samples = self._state.window_shift_samples
|
|
162
149
|
else: # i.e. zero_pad_until == "input"
|
|
163
150
|
req_samples = message.data.shape[axis_idx]
|
|
164
151
|
n_zero = max(0, self._state.window_samples - req_samples)
|
|
165
|
-
init_buffer_shape = (
|
|
166
|
-
message.data.shape[:axis_idx]
|
|
167
|
-
+ (n_zero,)
|
|
168
|
-
+ message.data.shape[axis_idx + 1 :]
|
|
169
|
-
)
|
|
152
|
+
init_buffer_shape = message.data.shape[:axis_idx] + (n_zero,) + message.data.shape[axis_idx + 1 :]
|
|
170
153
|
self._state.buffer = xp.zeros(init_buffer_shape, dtype=message.data.dtype)
|
|
171
154
|
|
|
172
155
|
# Prepare reusable parts of output
|
|
173
156
|
if self._state.out_newaxis is None:
|
|
174
|
-
self._state.out_dims = (
|
|
175
|
-
list(message.dims[:axis_idx])
|
|
176
|
-
+ [_newaxis]
|
|
177
|
-
+ list(message.dims[axis_idx:])
|
|
178
|
-
)
|
|
157
|
+
self._state.out_dims = list(message.dims[:axis_idx]) + [_newaxis] + list(message.dims[axis_idx:])
|
|
179
158
|
self._state.out_newaxis = replace(
|
|
180
159
|
axis_info,
|
|
181
|
-
gain=0.0
|
|
182
|
-
if self.settings.window_shift is None
|
|
183
|
-
else axis_info.gain * self._state.window_shift_samples,
|
|
160
|
+
gain=0.0 if self.settings.window_shift is None else axis_info.gain * self._state.window_shift_samples,
|
|
184
161
|
offset=0.0, # offset modified per-msg below
|
|
185
162
|
)
|
|
186
163
|
|
|
@@ -204,9 +181,7 @@ class WindowTransformer(
|
|
|
204
181
|
# is generally faster than np.roll and slicing anyway, but this could still
|
|
205
182
|
# be a performance bottleneck for large memory arrays.
|
|
206
183
|
# A circular buffer might be faster.
|
|
207
|
-
self._state.buffer = xp.concatenate(
|
|
208
|
-
(self._state.buffer, message.data), axis=axis_idx
|
|
209
|
-
)
|
|
184
|
+
self._state.buffer = xp.concatenate((self._state.buffer, message.data), axis=axis_idx)
|
|
210
185
|
|
|
211
186
|
# Create a vector of buffer timestamps to track axis `offset` in output(s)
|
|
212
187
|
buffer_t0 = 0.0
|
|
@@ -222,9 +197,7 @@ class WindowTransformer(
|
|
|
222
197
|
if self.settings.window_shift is not None and self._state.shift_deficit > 0:
|
|
223
198
|
n_skip = min(self._state.buffer.shape[axis_idx], self._state.shift_deficit)
|
|
224
199
|
if n_skip > 0:
|
|
225
|
-
self._state.buffer = slice_along_axis(
|
|
226
|
-
self._state.buffer, slice(n_skip, None), axis_idx
|
|
227
|
-
)
|
|
200
|
+
self._state.buffer = slice_along_axis(self._state.buffer, slice(n_skip, None), axis_idx)
|
|
228
201
|
buffer_t0 += n_skip * axis_info.gain
|
|
229
202
|
buffer_tlen -= n_skip
|
|
230
203
|
self._state.shift_deficit -= n_skip
|
|
@@ -249,20 +222,12 @@ class WindowTransformer(
|
|
|
249
222
|
self._state.buffer, slice(-self._state.window_samples, None), axis_idx
|
|
250
223
|
)
|
|
251
224
|
out_dat = self._state.buffer.reshape(
|
|
252
|
-
self._state.buffer.shape[:axis_idx]
|
|
253
|
-
+ (1,)
|
|
254
|
-
+ self._state.buffer.shape[axis_idx:]
|
|
255
|
-
)
|
|
256
|
-
win_offset = buffer_t0 + axis_info.gain * (
|
|
257
|
-
buffer_tlen - self._state.window_samples
|
|
225
|
+
self._state.buffer.shape[:axis_idx] + (1,) + self._state.buffer.shape[axis_idx:]
|
|
258
226
|
)
|
|
227
|
+
win_offset = buffer_t0 + axis_info.gain * (buffer_tlen - self._state.window_samples)
|
|
259
228
|
elif self._state.buffer.shape[axis_idx] >= self._state.window_samples:
|
|
260
229
|
# Deterministic window shifts.
|
|
261
|
-
sliding_win_fun = (
|
|
262
|
-
sparse_sliding_win_oneaxis
|
|
263
|
-
if is_pydata_sparse_namespace(xp)
|
|
264
|
-
else sliding_win_oneaxis
|
|
265
|
-
)
|
|
230
|
+
sliding_win_fun = sparse_sliding_win_oneaxis if is_pydata_sparse_namespace(xp) else sliding_win_oneaxis
|
|
266
231
|
out_dat = sliding_win_fun(
|
|
267
232
|
self._state.buffer,
|
|
268
233
|
self._state.window_samples,
|
|
@@ -273,18 +238,12 @@ class WindowTransformer(
|
|
|
273
238
|
|
|
274
239
|
# Drop expired beginning of buffer and update shift_deficit
|
|
275
240
|
multi_shift = self._state.window_shift_samples * out_dat.shape[axis_idx]
|
|
276
|
-
self._state.shift_deficit = max(
|
|
277
|
-
|
|
278
|
-
)
|
|
279
|
-
self._state.buffer = slice_along_axis(
|
|
280
|
-
self._state.buffer, slice(multi_shift, None), axis_idx
|
|
281
|
-
)
|
|
241
|
+
self._state.shift_deficit = max(0, multi_shift - self._state.buffer.shape[axis_idx])
|
|
242
|
+
self._state.buffer = slice_along_axis(self._state.buffer, slice(multi_shift, None), axis_idx)
|
|
282
243
|
else:
|
|
283
244
|
# Not enough data to make a new window. Return empty data.
|
|
284
245
|
empty_data_shape = (
|
|
285
|
-
message.data.shape[:axis_idx]
|
|
286
|
-
+ (0, self._state.window_samples)
|
|
287
|
-
+ message.data.shape[axis_idx + 1 :]
|
|
246
|
+
message.data.shape[:axis_idx] + (0, self._state.window_samples) + message.data.shape[axis_idx + 1 :]
|
|
288
247
|
)
|
|
289
248
|
out_dat = xp.zeros(empty_data_shape, dtype=message.data.dtype)
|
|
290
249
|
# out_newaxis will have first timestamp in input... but mostly meaningless because output is size-zero.
|
|
@@ -305,9 +264,7 @@ class WindowTransformer(
|
|
|
305
264
|
return msg_out
|
|
306
265
|
|
|
307
266
|
|
|
308
|
-
class Window(
|
|
309
|
-
BaseTransformerUnit[WindowSettings, AxisArray, AxisArray, WindowTransformer]
|
|
310
|
-
):
|
|
267
|
+
class Window(BaseTransformerUnit[WindowSettings, AxisArray, AxisArray, WindowTransformer]):
|
|
311
268
|
SETTINGS = WindowSettings
|
|
312
269
|
INPUT_SIGNAL = ez.InputStream(AxisArray)
|
|
313
270
|
OUTPUT_SIGNAL = ez.OutputStream(AxisArray)
|
|
@@ -325,30 +282,19 @@ class Window(
|
|
|
325
282
|
try:
|
|
326
283
|
ret = self.processor(message)
|
|
327
284
|
if ret.data.size > 0:
|
|
328
|
-
if
|
|
329
|
-
self.SETTINGS.newaxis is not None
|
|
330
|
-
or self.SETTINGS.window_dur is None
|
|
331
|
-
):
|
|
285
|
+
if self.SETTINGS.newaxis is not None or self.SETTINGS.window_dur is None:
|
|
332
286
|
# Multi-win mode or pass-through mode.
|
|
333
287
|
yield self.OUTPUT_SIGNAL, ret
|
|
334
288
|
else:
|
|
335
289
|
# We need to split out_msg into multiple yields, dropping newaxis.
|
|
336
290
|
axis_idx = ret.get_axis_idx("win")
|
|
337
291
|
win_axis = ret.axes["win"]
|
|
338
|
-
offsets = win_axis.value(
|
|
339
|
-
xp.asarray(range(ret.data.shape[axis_idx]))
|
|
340
|
-
)
|
|
292
|
+
offsets = win_axis.value(xp.asarray(range(ret.data.shape[axis_idx])))
|
|
341
293
|
for msg_ix in range(ret.data.shape[axis_idx]):
|
|
342
294
|
# Need to drop 'win' and replace self.SETTINGS.axis from axes.
|
|
343
295
|
_out_axes = {
|
|
344
|
-
**{
|
|
345
|
-
|
|
346
|
-
for k, v in ret.axes.items()
|
|
347
|
-
if k not in ["win", self.SETTINGS.axis]
|
|
348
|
-
},
|
|
349
|
-
self.SETTINGS.axis: replace(
|
|
350
|
-
ret.axes[self.SETTINGS.axis], offset=offsets[msg_ix]
|
|
351
|
-
),
|
|
296
|
+
**{k: v for k, v in ret.axes.items() if k not in ["win", self.SETTINGS.axis]},
|
|
297
|
+
self.SETTINGS.axis: replace(ret.axes[self.SETTINGS.axis], offset=offsets[msg_ix]),
|
|
352
298
|
}
|
|
353
299
|
_ret = replace(
|
|
354
300
|
ret,
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ezmsg-sigproc
|
|
3
|
+
Version: 2.7.0
|
|
4
|
+
Summary: Timeseries signal processing implementations in ezmsg
|
|
5
|
+
Author-email: Griffin Milsap <griffin.milsap@gmail.com>, Preston Peranich <pperanich@gmail.com>, Chadwick Boulay <chadwick.boulay@gmail.com>, Kyle McGraw <kmcgraw@blackrockneuro.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: >=3.10.15
|
|
9
|
+
Requires-Dist: array-api-compat>=1.11.1
|
|
10
|
+
Requires-Dist: ezmsg-baseproc>=1.1.0
|
|
11
|
+
Requires-Dist: ezmsg>=3.6.0
|
|
12
|
+
Requires-Dist: numba>=0.61.0
|
|
13
|
+
Requires-Dist: numpy>=1.26.0
|
|
14
|
+
Requires-Dist: pywavelets>=1.6.0
|
|
15
|
+
Requires-Dist: scipy>=1.13.1
|
|
16
|
+
Requires-Dist: sparse>=0.15.4
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# ezmsg-sigproc
|
|
20
|
+
|
|
21
|
+
Signal processing primitives for the [ezmsg](https://www.ezmsg.org) message-passing framework.
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
* **Filtering** - Chebyshev, comb filters, and more
|
|
26
|
+
* **Spectral analysis** - Spectrogram, spectrum, and wavelet transforms
|
|
27
|
+
* **Resampling** - Downsample, decimate, and resample operations
|
|
28
|
+
* **Windowing** - Sliding windows and buffering utilities
|
|
29
|
+
* **Math operations** - Arithmetic, log, abs, difference, and more
|
|
30
|
+
* **Signal generation** - Synthetic signal generators
|
|
31
|
+
|
|
32
|
+
All modules use `AxisArray` as the primary data structure for passing signals between components.
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
Install from PyPI:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install ezmsg-sigproc
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Or install from GitHub for the latest development version:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install git+https://github.com/ezmsg-org/ezmsg-sigproc.git@dev
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Documentation
|
|
49
|
+
|
|
50
|
+
Full documentation is available at [ezmsg.org](https://www.ezmsg.org).
|
|
51
|
+
|
|
52
|
+
## Development
|
|
53
|
+
|
|
54
|
+
We use [`uv`](https://docs.astral.sh/uv/) for development.
|
|
55
|
+
|
|
56
|
+
1. Fork and clone the repository
|
|
57
|
+
2. `uv sync` to create a virtual environment and install dependencies
|
|
58
|
+
3. `uv run pre-commit install` to set up linting and formatting hooks
|
|
59
|
+
4. `uv run pytest tests` to run the test suite
|
|
60
|
+
5. Submit a PR against the `dev` branch
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
ezmsg/sigproc/__init__.py,sha256=8K4IcOA3-pfzadoM6s2Sfg5460KlJUocGgyTJTJl96U,52
|
|
2
|
+
ezmsg/sigproc/__version__.py,sha256=egp6dAw7S80JrGAUNYGJNY3iqzeSzC4Vs5c3SnC3SIY,704
|
|
3
|
+
ezmsg/sigproc/activation.py,sha256=83vnTa3ZcC4Q3VSWcGfaqhCEqYRNySUOyVpMHZXfz-c,2755
|
|
4
|
+
ezmsg/sigproc/adaptive_lattice_notch.py,sha256=ThUR48mbSHuThkimtD0j4IXNMrOVcpZgGhE7PCYfXhU,8818
|
|
5
|
+
ezmsg/sigproc/affinetransform.py,sha256=umEsbEcuiCI02oljWueJnKaI0aJxJ0wqOjH5yXclEM0,8414
|
|
6
|
+
ezmsg/sigproc/aggregate.py,sha256=yc3Hnak0yhucqlTCv9Isg6BKR24s6rMZqbZKpayyBgM,9048
|
|
7
|
+
ezmsg/sigproc/bandpower.py,sha256=dAhH56sUrXNhcRFymTTwjdM_KcU5OxFzrR_sxIPAxyw,2264
|
|
8
|
+
ezmsg/sigproc/base.py,sha256=SJvKEb8gw6mUMwlV5sH0iPG0bXrgS8tvkPwhI-j89MQ,3672
|
|
9
|
+
ezmsg/sigproc/butterworthfilter.py,sha256=NKTGkgjvlmC1Dc9gD2Z6UBzUq12KicfnczrzM5ZTosk,5255
|
|
10
|
+
ezmsg/sigproc/butterworthzerophase.py,sha256=QbJ_gGXrIfVOl_OybD07orO460owSMP5yTDMcGgASP0,4109
|
|
11
|
+
ezmsg/sigproc/cheby.py,sha256=B8pGt5_pOBpNZCmaibNl_NKkyuasd8ZEJXeTDCTaino,3711
|
|
12
|
+
ezmsg/sigproc/combfilter.py,sha256=MSxr1I-jBePW_9AuCiv3RQ1HUNxIsNhLk0q1Iu8ikAw,4766
|
|
13
|
+
ezmsg/sigproc/coordinatespaces.py,sha256=NWbQVvizmiU4F3AIwHHhiZ30Kg2IeSW0fRaa-yXkn-c,4610
|
|
14
|
+
ezmsg/sigproc/decimate.py,sha256=DCX9p4ZrcGoQ9di-jmPKqiKERTkvTAtSqLg8chQLp84,2336
|
|
15
|
+
ezmsg/sigproc/denormalize.py,sha256=CaH34QJ3OvsnhZT7bhCw2KVxVKvaU24ui6BS5-oe_x0,3040
|
|
16
|
+
ezmsg/sigproc/detrend.py,sha256=TxqZ41AdjsH_yOTj8fBoKTnbKCbdyzVibpCHWkFARYU,898
|
|
17
|
+
ezmsg/sigproc/diff.py,sha256=PC8KJAqaXMsdS_kPlDSEtXpcQ5rk92Ze_TeUjsVwbN0,2782
|
|
18
|
+
ezmsg/sigproc/downsample.py,sha256=Jqxt1Va1FrQLH1wUQpP0U79iQARTTHEKklKHy7yGL2o,3679
|
|
19
|
+
ezmsg/sigproc/ewma.py,sha256=I6WZkf6yf8jnpLdeEAWfAcpui5erVcVMZo6hTMMvDvg,6247
|
|
20
|
+
ezmsg/sigproc/ewmfilter.py,sha256=9AuvVn3TDdf5R4bVolYNM46AtDVHFJa8MLGltY6mYPE,4795
|
|
21
|
+
ezmsg/sigproc/extract_axis.py,sha256=4beqJ0EyUkT9Pa1FdYa9IteHGaxkh87j5_rYiZlvIG4,1598
|
|
22
|
+
ezmsg/sigproc/fbcca.py,sha256=JYFWsMDRJEWwUNujr4EsFL5t1ux-cnBGamNVrCRO_RA,12043
|
|
23
|
+
ezmsg/sigproc/filter.py,sha256=rLmJCgPevoODTL3g_D6czwVvcCD4uK8hJJ0tKfTH5_w,11609
|
|
24
|
+
ezmsg/sigproc/filterbank.py,sha256=tD7fn4dZzEvsmp_sSn16VVJ4WcJ5sN5lsSuNTLDCQZ8,13056
|
|
25
|
+
ezmsg/sigproc/filterbankdesign.py,sha256=vLXQVJwoFEK4V6umqzcr1PJKcwv6pGO29klSWQXk7y0,4712
|
|
26
|
+
ezmsg/sigproc/fir_hilbert.py,sha256=aurBCcpvsG69qD6Du2aHMye4HCBXF4RXzACdSxIy_Z8,10859
|
|
27
|
+
ezmsg/sigproc/fir_pmc.py,sha256=Ze2pd9K8XrdDhgJZG2E7x-5C2hfd6kIns4bYjTJsBvc,6997
|
|
28
|
+
ezmsg/sigproc/firfilter.py,sha256=7r_I476nYuixJsuwc_hQ0Fbq8WB0gnYBZUKs3zultOQ,3790
|
|
29
|
+
ezmsg/sigproc/gaussiansmoothing.py,sha256=BfXm9YQoOtieM4ABK2KRgxeQz055rd7mqtTVqmjT3Rk,2672
|
|
30
|
+
ezmsg/sigproc/kaiser.py,sha256=dIwgHbLXUHPtdotsGNLE9VG_clhcMgvVnSoFkMVgF9M,3483
|
|
31
|
+
ezmsg/sigproc/messages.py,sha256=KQczHTeifn4BZycChN8ZcpfZoQW3lC_xuFmN72QT97s,925
|
|
32
|
+
ezmsg/sigproc/quantize.py,sha256=uSM2z2xXwL0dgSltyzLEmlKjaJZ2meA3PDWX8_bM0Hs,2195
|
|
33
|
+
ezmsg/sigproc/resample.py,sha256=3mm9pvxryNVhQuTCIMW3ToUkUfbVOCsIgvXUiurit1Y,11389
|
|
34
|
+
ezmsg/sigproc/rollingscaler.py,sha256=j5hoWgJMbeDST7FXE6UBLSeR2hhfACIqQvFKr92ZTZA,8503
|
|
35
|
+
ezmsg/sigproc/sampler.py,sha256=iOk2YoUX22u9iTjFKimzP5V074RDBVcmswgfyxvZRZo,10761
|
|
36
|
+
ezmsg/sigproc/scaler.py,sha256=n0aGo272vs_MnFRtT1b3vVCQOzY-UEAxnqZKlpIldX8,4041
|
|
37
|
+
ezmsg/sigproc/signalinjector.py,sha256=mB62H2b-ScgPtH1jajEpxgDHqdb-RKekQfgyNncsE8Y,2874
|
|
38
|
+
ezmsg/sigproc/slicer.py,sha256=xLXxWf722V08ytVwvPimYjDKKj0pkC2HjdgCVaoaOvs,5195
|
|
39
|
+
ezmsg/sigproc/spectral.py,sha256=wFzuihS7qJZMQcp0ds_qCG-zCbvh5DyhFRjn2wA9TWQ,322
|
|
40
|
+
ezmsg/sigproc/spectrogram.py,sha256=g8xYWENzle6O5uEF-vfjsF5gOSDnJTwiu3ZudicO470,2893
|
|
41
|
+
ezmsg/sigproc/spectrum.py,sha256=AAxrywIYpAPENRWvaaM2VjcKEaqMt6ra1E3Ao26jdZs,9523
|
|
42
|
+
ezmsg/sigproc/transpose.py,sha256=Yx4losN7tKCacUt2GmFvjOSqJ0b3XhEepXzq_Z_iMCI,4381
|
|
43
|
+
ezmsg/sigproc/wavelets.py,sha256=mN9TrZencyvKBfnuMiGZ_lzrE1O7DhVo05EYgCjXncg,7428
|
|
44
|
+
ezmsg/sigproc/window.py,sha256=ZlawY4TPbLc46qIgcKhP4X7dpMDo4zNlnfzgV1eFaGU,15335
|
|
45
|
+
ezmsg/sigproc/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
+
ezmsg/sigproc/math/abs.py,sha256=_omQP4baHGu8MgKzNDMUsjrmA_yeXWNqKyTU7BiHCSE,741
|
|
47
|
+
ezmsg/sigproc/math/add.py,sha256=lR4lB8-QdUfyARJcdf5sMQhbHtFpRNYt8_1zYzkVEhU,3659
|
|
48
|
+
ezmsg/sigproc/math/clip.py,sha256=vJ8zpzVlTVPlkElsqyPVMOwyKBrgym8RD8BEOvf8g1o,1131
|
|
49
|
+
ezmsg/sigproc/math/difference.py,sha256=TtAURz9TsW_Vk39sMJOT84P0xw0xDrgE3ToRi8MWVv4,4491
|
|
50
|
+
ezmsg/sigproc/math/invert.py,sha256=SYJDNEb7snkVODnItfkkp8rhMrHEdyBmzg6qZkZLX2c,630
|
|
51
|
+
ezmsg/sigproc/math/log.py,sha256=K8bZSm-ubTDY0oqwuc0IOMkdPIwpw1yysjTOG657kkQ,1488
|
|
52
|
+
ezmsg/sigproc/math/scale.py,sha256=Zpzlz1NSLyvmggjs0pPypUKgXX99z2S3VXJ06fHok5M,942
|
|
53
|
+
ezmsg/sigproc/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
|
+
ezmsg/sigproc/util/asio.py,sha256=aAj0e7OoBvkRy28k05HL2s9YPCTxOddc05xMN-qd4lQ,577
|
|
55
|
+
ezmsg/sigproc/util/axisarray_buffer.py,sha256=TGDeC6CXmmp7OUuiGd6xYQijRGYDE4QGdWxjK5Vs3nE,14057
|
|
56
|
+
ezmsg/sigproc/util/buffer.py,sha256=83Gm0IuowmcMlXgLFB_rz8_ZPhkwG4DNNejyWJDKJl8,19658
|
|
57
|
+
ezmsg/sigproc/util/message.py,sha256=ppN3IYtIAwrxWG9JOvgWFn1wDdIumkEzYFfqpH9VQkY,338
|
|
58
|
+
ezmsg/sigproc/util/profile.py,sha256=eVOo9pXgusrnH1yfRdd2RsM7Dbe2UpyC0LJ9MfGpB08,416
|
|
59
|
+
ezmsg/sigproc/util/sparse.py,sha256=NjbJitCtO0B6CENTlyd9c-lHEJwoCan-T3DIgPyeShw,4834
|
|
60
|
+
ezmsg/sigproc/util/typeresolution.py,sha256=fMFzLi63dqCIclGFLcMdM870OYxJnkeWw6aWKNMk718,362
|
|
61
|
+
ezmsg_sigproc-2.7.0.dist-info/METADATA,sha256=QtI9FWw5pFVEqs1Ma6tooyGj73dZ6IOnM0QueJnzeSY,1908
|
|
62
|
+
ezmsg_sigproc-2.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
63
|
+
ezmsg_sigproc-2.7.0.dist-info/licenses/LICENSE,sha256=seu0tKhhAMPCUgc1XpXGGaCxY1YaYvFJwqFuQZAl2go,1100
|
|
64
|
+
ezmsg_sigproc-2.7.0.dist-info/RECORD,,
|