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.
Files changed (64) hide show
  1. ezmsg/sigproc/__version__.py +2 -2
  2. ezmsg/sigproc/activation.py +5 -11
  3. ezmsg/sigproc/adaptive_lattice_notch.py +11 -30
  4. ezmsg/sigproc/affinetransform.py +16 -42
  5. ezmsg/sigproc/aggregate.py +17 -34
  6. ezmsg/sigproc/bandpower.py +12 -20
  7. ezmsg/sigproc/base.py +141 -1276
  8. ezmsg/sigproc/butterworthfilter.py +8 -16
  9. ezmsg/sigproc/butterworthzerophase.py +7 -16
  10. ezmsg/sigproc/cheby.py +4 -10
  11. ezmsg/sigproc/combfilter.py +5 -8
  12. ezmsg/sigproc/coordinatespaces.py +142 -0
  13. ezmsg/sigproc/decimate.py +3 -7
  14. ezmsg/sigproc/denormalize.py +6 -11
  15. ezmsg/sigproc/detrend.py +3 -4
  16. ezmsg/sigproc/diff.py +8 -17
  17. ezmsg/sigproc/downsample.py +11 -20
  18. ezmsg/sigproc/ewma.py +11 -28
  19. ezmsg/sigproc/ewmfilter.py +1 -1
  20. ezmsg/sigproc/extract_axis.py +3 -4
  21. ezmsg/sigproc/fbcca.py +34 -59
  22. ezmsg/sigproc/filter.py +19 -45
  23. ezmsg/sigproc/filterbank.py +37 -74
  24. ezmsg/sigproc/filterbankdesign.py +7 -14
  25. ezmsg/sigproc/fir_hilbert.py +13 -30
  26. ezmsg/sigproc/fir_pmc.py +5 -10
  27. ezmsg/sigproc/firfilter.py +12 -14
  28. ezmsg/sigproc/gaussiansmoothing.py +5 -9
  29. ezmsg/sigproc/kaiser.py +11 -15
  30. ezmsg/sigproc/math/abs.py +4 -3
  31. ezmsg/sigproc/math/add.py +121 -0
  32. ezmsg/sigproc/math/clip.py +4 -1
  33. ezmsg/sigproc/math/difference.py +100 -36
  34. ezmsg/sigproc/math/invert.py +3 -3
  35. ezmsg/sigproc/math/log.py +5 -6
  36. ezmsg/sigproc/math/scale.py +2 -0
  37. ezmsg/sigproc/messages.py +1 -2
  38. ezmsg/sigproc/quantize.py +3 -6
  39. ezmsg/sigproc/resample.py +17 -38
  40. ezmsg/sigproc/rollingscaler.py +12 -37
  41. ezmsg/sigproc/sampler.py +19 -37
  42. ezmsg/sigproc/scaler.py +11 -22
  43. ezmsg/sigproc/signalinjector.py +7 -18
  44. ezmsg/sigproc/slicer.py +14 -34
  45. ezmsg/sigproc/spectral.py +3 -3
  46. ezmsg/sigproc/spectrogram.py +12 -19
  47. ezmsg/sigproc/spectrum.py +17 -38
  48. ezmsg/sigproc/transpose.py +12 -24
  49. ezmsg/sigproc/util/asio.py +25 -156
  50. ezmsg/sigproc/util/axisarray_buffer.py +12 -26
  51. ezmsg/sigproc/util/buffer.py +22 -43
  52. ezmsg/sigproc/util/message.py +17 -31
  53. ezmsg/sigproc/util/profile.py +23 -174
  54. ezmsg/sigproc/util/sparse.py +7 -15
  55. ezmsg/sigproc/util/typeresolution.py +17 -83
  56. ezmsg/sigproc/wavelets.py +10 -19
  57. ezmsg/sigproc/window.py +29 -83
  58. ezmsg_sigproc-2.7.0.dist-info/METADATA +60 -0
  59. ezmsg_sigproc-2.7.0.dist-info/RECORD +64 -0
  60. ezmsg/sigproc/synth.py +0 -774
  61. ezmsg_sigproc-2.5.0.dist-info/METADATA +0 -72
  62. ezmsg_sigproc-2.5.0.dist-info/RECORD +0 -63
  63. {ezmsg_sigproc-2.5.0.dist-info → ezmsg_sigproc-2.7.0.dist-info}/WHEEL +0 -0
  64. /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 is_pydata_sparse_namespace, get_namespace
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
- 0, multi_shift - self._state.buffer.shape[axis_idx]
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
- k: v
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,,