modusa 0.2.21__py3-none-any.whl → 0.2.23__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.
- modusa/decorators.py +4 -4
- modusa/devtools/docs/source/generators/audio_waveforms.rst +8 -0
- modusa/devtools/docs/source/generators/base.rst +8 -0
- modusa/devtools/docs/source/generators/index.rst +8 -0
- modusa/devtools/docs/source/io/audio_loader.rst +8 -0
- modusa/devtools/docs/source/io/base.rst +8 -0
- modusa/devtools/docs/source/io/index.rst +8 -0
- modusa/devtools/docs/source/plugins/base.rst +8 -0
- modusa/devtools/docs/source/plugins/index.rst +7 -0
- modusa/devtools/docs/source/signals/audio_signal.rst +8 -0
- modusa/devtools/docs/source/signals/base.rst +8 -0
- modusa/devtools/docs/source/signals/frequency_domain_signal.rst +8 -0
- modusa/devtools/docs/source/signals/index.rst +11 -0
- modusa/devtools/docs/source/signals/spectrogram.rst +8 -0
- modusa/devtools/docs/source/signals/time_domain_signal.rst +8 -0
- modusa/devtools/docs/source/tools/audio_converter.rst +8 -0
- modusa/devtools/docs/source/tools/audio_player.rst +8 -0
- modusa/devtools/docs/source/tools/base.rst +8 -0
- modusa/devtools/docs/source/tools/fourier_tranform.rst +8 -0
- modusa/devtools/docs/source/tools/index.rst +13 -0
- modusa/devtools/docs/source/tools/math_ops.rst +8 -0
- modusa/devtools/docs/source/tools/plotter.rst +8 -0
- modusa/devtools/docs/source/tools/youtube_downloader.rst +8 -0
- modusa/devtools/generate_doc_source.py +96 -0
- modusa/devtools/generate_template.py +8 -8
- modusa/devtools/main.py +3 -2
- modusa/devtools/templates/test.py +2 -3
- modusa/devtools/templates/{engine.py → tool.py} +3 -8
- modusa/generators/__init__.py +0 -2
- modusa/generators/audio_waveforms.py +22 -13
- modusa/generators/base.py +1 -1
- modusa/io/__init__.py +1 -5
- modusa/io/audio_loader.py +3 -33
- modusa/main.py +0 -30
- modusa/signals/__init__.py +1 -5
- modusa/signals/audio_signal.py +181 -124
- modusa/signals/base.py +1 -8
- modusa/signals/frequency_domain_signal.py +140 -93
- modusa/signals/spectrogram.py +197 -98
- modusa/signals/time_domain_signal.py +177 -74
- modusa/tools/__init__.py +2 -0
- modusa/{io → tools}/audio_converter.py +12 -4
- modusa/tools/audio_player.py +114 -0
- modusa/tools/base.py +43 -0
- modusa/tools/fourier_tranform.py +24 -0
- modusa/tools/math_ops.py +232 -0
- modusa/{io → tools}/plotter.py +155 -42
- modusa/{io → tools}/youtube_downloader.py +2 -2
- modusa/utils/excp.py +9 -42
- {modusa-0.2.21.dist-info → modusa-0.2.23.dist-info}/METADATA +2 -1
- modusa-0.2.23.dist-info/RECORD +70 -0
- modusa/engines/.DS_Store +0 -0
- modusa/engines/__init__.py +0 -3
- modusa/engines/base.py +0 -14
- modusa/io/audio_player.py +0 -72
- modusa/signals/signal_ops.py +0 -158
- modusa-0.2.21.dist-info/RECORD +0 -47
- {modusa-0.2.21.dist-info → modusa-0.2.23.dist-info}/WHEEL +0 -0
- {modusa-0.2.21.dist-info → modusa-0.2.23.dist-info}/entry_points.txt +0 -0
- {modusa-0.2.21.dist-info → modusa-0.2.23.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
modusa-0.2.23.dist-info/METADATA,sha256=sacHnoRHGvAPRw9cIsB27bhiZr57KLnGkfXvTkDZ_FA,1505
|
|
2
|
+
modusa-0.2.23.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
|
|
3
|
+
modusa-0.2.23.dist-info/entry_points.txt,sha256=fmKpleVXj6CdaBVL14WoEy6xx7JQCs85jvzwTi3lePM,73
|
|
4
|
+
modusa-0.2.23.dist-info/licenses/LICENSE.md,sha256=JTaXAjx5awk76VArKCx5dUW8vmLEWsL_ZlR7-umaHbA,1078
|
|
5
|
+
modusa/.DS_Store,sha256=Q0eG2RQNYtV4qa5BYj_GznvlEBpNdebi6ZTIR-a7AhU,6148
|
|
6
|
+
modusa/__init__.py,sha256=bfQKVSpAXlKmKvMRIU6WSRQW2qoJsaZsdNJ8E69ghn0,37
|
|
7
|
+
modusa/config.py,sha256=bTqK4t00FZqERVITrxW_q284aDDJAa9aMSfFknfR-oU,280
|
|
8
|
+
modusa/decorators.py,sha256=8zeNX_wE37O6Vp0ysR4-WCZaEL8mq8dyCF_I5DHOzks,5905
|
|
9
|
+
modusa/devtools/docs/source/generators/audio_waveforms.rst,sha256=GPVEKRVG0Sx5G_i2PPpoEDE2Q-XDXp8538TdEkxIEsI,174
|
|
10
|
+
modusa/devtools/docs/source/generators/base.rst,sha256=ihi8zjzdqM3xqBj9S8Pd7qVRZboqv-SbF3FUzPvo0gQ,142
|
|
11
|
+
modusa/devtools/docs/source/generators/index.rst,sha256=UDTcmd-A90pqkNI4iIqOMm6-_ytx3a4HM8F2XKa4hxE,80
|
|
12
|
+
modusa/devtools/docs/source/io/audio_loader.rst,sha256=hiaO0uFz9LxEw181q4ClOKzxYaPUjLTfT9YLDT4gDXQ,130
|
|
13
|
+
modusa/devtools/docs/source/io/base.rst,sha256=kpGDys8NG2H6zpniHMOU0jWtpTl-EVKBsAXVnpwOq-Q,113
|
|
14
|
+
modusa/devtools/docs/source/io/index.rst,sha256=pladgl9BRJleyJUIjJA4ty33VsXdvlHG-fEdasJaiaI,61
|
|
15
|
+
modusa/devtools/docs/source/plugins/base.rst,sha256=K68G3TPe7HG3UE60Bk4nogYAw9IqEY5oAFvslOPsszM,130
|
|
16
|
+
modusa/devtools/docs/source/plugins/index.rst,sha256=rLzwBQaNMT5-B2Z2SuZCNT65QTgc0qLlYAuC3rUon48,55
|
|
17
|
+
modusa/devtools/docs/source/signals/audio_signal.rst,sha256=Y1Lm5D_O2OGkQ4AiBC8cMzGKZF3Qw6xl9Vj5kstNYhw,135
|
|
18
|
+
modusa/devtools/docs/source/signals/base.rst,sha256=J670LBdOlE_MWWaOKFmc0EQRaUC9XEjbeI7Mw_m9yok,130
|
|
19
|
+
modusa/devtools/docs/source/signals/frequency_domain_signal.rst,sha256=1c5hV8dvFJFqqC9TcG_Cn_EXp06ILzCrAiRXJW6rFs4,176
|
|
20
|
+
modusa/devtools/docs/source/signals/index.rst,sha256=-vdOMPAzRXno6qGTqTBcn9q2eItpI94rpNUFVzUouF8,135
|
|
21
|
+
modusa/devtools/docs/source/signals/spectrogram.rst,sha256=up8GbZq175Hi7b3ylceDoUsSexq-7WUwd-ZNW5b1ZnU,134
|
|
22
|
+
modusa/devtools/docs/source/signals/time_domain_signal.rst,sha256=EqDes752jCdO_dHmfgeVKwycEm--0HImc7uWl55wc3Y,156
|
|
23
|
+
modusa/devtools/docs/source/tools/audio_converter.rst,sha256=HX89WnMJ8LkszT-iofNUkyTApsx1p8eSUkI4Y4LWD2M,145
|
|
24
|
+
modusa/devtools/docs/source/tools/audio_player.rst,sha256=RQ6o5nI1916q-hK5XrMbmsoY86ZAeDnugn0227ZnA2c,133
|
|
25
|
+
modusa/devtools/docs/source/tools/base.rst,sha256=uHkVsg0vszarLQ1eG1NCPNbEvhibHcWJSaR7R-F2IeQ,122
|
|
26
|
+
modusa/devtools/docs/source/tools/fourier_tranform.rst,sha256=0NoX4pve4YPucjYa0mKXuyX0lLOzVrk5NF3c9-zYojI,152
|
|
27
|
+
modusa/devtools/docs/source/tools/index.rst,sha256=_VDKHoVeiEfXq_pzPxUm0QOU1B7tnNF0YINjyzZG-_A,151
|
|
28
|
+
modusa/devtools/docs/source/tools/math_ops.rst,sha256=wIPxzO9guRFrPp_hSYOVkVgHYBmpXVqQrwSPwIKrUbM,117
|
|
29
|
+
modusa/devtools/docs/source/tools/plotter.rst,sha256=sm9rA8qKyRYweAcoPI9jWMRMXwzF--bC3wEupPZhcDI,116
|
|
30
|
+
modusa/devtools/docs/source/tools/youtube_downloader.rst,sha256=5DibjwfLM0bo0_-emO2JRkmD2UR97XtcAgpezPmv41U,157
|
|
31
|
+
modusa/devtools/generate_doc_source.py,sha256=RNzZPWyuYfBU7bxzEsy0AQoRopff2g4MwTRcGlMidqM,3410
|
|
32
|
+
modusa/devtools/generate_template.py,sha256=xkVDIPWmcccRkYpOzQ97eQTHju6JYpjXyTTaDxhjgng,5210
|
|
33
|
+
modusa/devtools/list_authors.py,sha256=FWBQKOLznVthvMYMASrx2Gw5lqKHEOccQpBisDZ53Dw,24
|
|
34
|
+
modusa/devtools/list_plugins.py,sha256=g-R5hoaCzHfClY_Sfa788IQ9CAKzQGTfyqmthXDZQqw,1729
|
|
35
|
+
modusa/devtools/main.py,sha256=fHcpxZZHiXn_G8_T84TrKskW7SoZuIJh1dCMOq_OhNI,1996
|
|
36
|
+
modusa/devtools/templates/generator.py,sha256=tf2k2L9RF5S9iJmqPD5AFETJKvqL5XknqK3sR6n2ceQ,444
|
|
37
|
+
modusa/devtools/templates/io.py,sha256=jcO4vAH8iiw6uvwy2aEbsBeNnQOj5VaU_VrQvhJflRA,383
|
|
38
|
+
modusa/devtools/templates/plugin.py,sha256=HNoN0S63ahk83EPup_15pbfOY5_kFfnLF63U3vWOMp8,863
|
|
39
|
+
modusa/devtools/templates/signal.py,sha256=Jqdq38W6ye2cf499oGXWlpCVH4Nmoo1jNfPYgdVLseA,775
|
|
40
|
+
modusa/devtools/templates/test.py,sha256=CjZ_oqwJFhltNYzqfK1pcz1ShgeJXZLOnYpmOawfASs,244
|
|
41
|
+
modusa/devtools/templates/tool.py,sha256=2iQfHbFKtTELPvNoX42rHr9_5lXRrXpwxb9z5OL96Xc,435
|
|
42
|
+
modusa/generators/__init__.py,sha256=cA4Sqql6dnmGXmQGCffaZfBpQYduccYSMN4oe0bxwY4,75
|
|
43
|
+
modusa/generators/audio_waveforms.py,sha256=n9gVKFKxupZ72RLAtL4HuEEl-21Ot8MYSwnI0bDhjwg,6106
|
|
44
|
+
modusa/generators/base.py,sha256=cxIhZORQ2VVVOZlvpZZXGB6fsD4AHWHgMmk1GupBFR0,939
|
|
45
|
+
modusa/io/__init__.py,sha256=hueCcEC83Q7RUAct-CK9HILerXi0Re7YanxoFKLqqH4,89
|
|
46
|
+
modusa/io/audio_loader.py,sha256=oe3jRSY_MatX4xBTpFXDBW8ReW3QQ_F4sjhbTJzoIw8,4272
|
|
47
|
+
modusa/io/base.py,sha256=GOMvpicWWLWXoxm4nLwqq_0hWmXWzYAPLVx-CbthCsQ,1291
|
|
48
|
+
modusa/main.py,sha256=v9oOhnPcbw8ULfkKRoantEfHw7MqOETJwXC-odx3dnA,25
|
|
49
|
+
modusa/plugins/__init__.py,sha256=OB-b_GnUnTkECn1fwxl844UBmiui3mSWIvhBqMZY7Tc,22
|
|
50
|
+
modusa/plugins/base.py,sha256=Bh_1Bja7fOymFsCgwhXDbV6ys3D8muNrPwrfDrG_G_A,2382
|
|
51
|
+
modusa/signals/__init__.py,sha256=wbTeDflDfQj8HT8n78GHUKkJERphQH0XtdMCBOd1S0U,61
|
|
52
|
+
modusa/signals/audio_signal.py,sha256=aFkQYMFZXbKiWTuAomDMJM_dBCEIJpiXEBxDUTRAJ-4,16851
|
|
53
|
+
modusa/signals/base.py,sha256=KTZZWt_1z7nErXkg6xXWIqrBFZ1Yo8cP5J64jvpTf6w,523
|
|
54
|
+
modusa/signals/frequency_domain_signal.py,sha256=r4lkKLD2v8v7a3SIwctWSfBzcJ2PEW6Yn-FjP4qzNXc,12830
|
|
55
|
+
modusa/signals/spectrogram.py,sha256=Nhb5SG4ruybcExUwhR_AYrJ97QMmya7PxUno1caBBQE,19693
|
|
56
|
+
modusa/signals/time_domain_signal.py,sha256=muujNGh5YNYsQ9PzPIDVlvFiwINmGhHn3Nh6jor2C5g,13411
|
|
57
|
+
modusa/tools/__init__.py,sha256=FWBQKOLznVthvMYMASrx2Gw5lqKHEOccQpBisDZ53Dw,24
|
|
58
|
+
modusa/tools/audio_converter.py,sha256=HA-XYu0XaNoWcpOjd3rTBc252Gp6na3c5zWAN5zWVPk,2183
|
|
59
|
+
modusa/tools/audio_player.py,sha256=1DLdeIgIRm7UL0g3MkLpdtveYFq2c2PRFQMVLI7KjYg,3131
|
|
60
|
+
modusa/tools/base.py,sha256=C0ESJ0mIfjjRlAkRbSetNtMoOfS6IrHBjexRp3l_Mh4,1293
|
|
61
|
+
modusa/tools/fourier_tranform.py,sha256=6A1RjKwa7KlAXoDJc7L7ozcjIaqm-DDSaV52ibu9jsk,442
|
|
62
|
+
modusa/tools/math_ops.py,sha256=tovVNIpQDPTpk_fQg9wW1Hs1Uqp9u9i3B_pnhVx8zVw,6246
|
|
63
|
+
modusa/tools/plotter.py,sha256=AI14F4IC0rXyzuwTI6oEZEPb6hqWY3FWKUxrNIGAtW8,14159
|
|
64
|
+
modusa/tools/youtube_downloader.py,sha256=0G2u2jNZhQfilyhYnytKkq_k4jMIzK5fw6j_gd8fk8I,3451
|
|
65
|
+
modusa/utils/.DS_Store,sha256=nLXMwF7QJNuglLI_Gk74F7vl5Dyus2Wd74Mgowijmdo,6148
|
|
66
|
+
modusa/utils/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
|
|
67
|
+
modusa/utils/config.py,sha256=cuGbqbovx5WDQq5rw3hIKcv3CnE5NttjacSOWnP1yu4,576
|
|
68
|
+
modusa/utils/excp.py,sha256=yX0suXZZDfYgVi2HBpp4FShQ_bbtW99no2uas6Jx9c4,796
|
|
69
|
+
modusa/utils/logger.py,sha256=K0rsnObeNKCxlNeSnVnJeRhgfmob6riB2uyU7h3dDmA,571
|
|
70
|
+
modusa-0.2.23.dist-info/RECORD,,
|
modusa/engines/.DS_Store
DELETED
|
Binary file
|
modusa/engines/__init__.py
DELETED
modusa/engines/base.py
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
class ModusaEngine(ABC):
|
|
7
|
-
"""
|
|
8
|
-
Base class for all core logic components in the Modusa system.
|
|
9
|
-
Every subclass must implement the `run` method.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
@abstractmethod
|
|
13
|
-
def run(self, *args, **kwargs) -> Any:
|
|
14
|
-
pass
|
modusa/io/audio_player.py
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
from modusa import excp
|
|
5
|
-
from modusa.decorators import validate_args_type
|
|
6
|
-
from modusa.io import ModusaIO
|
|
7
|
-
from IPython.display import display, HTML, Audio
|
|
8
|
-
import numpy as np
|
|
9
|
-
|
|
10
|
-
class AudioPlayer(ModusaIO):
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
#--------Meta Information----------
|
|
16
|
-
_name = "Audio Player"
|
|
17
|
-
_description = ""
|
|
18
|
-
_author_name = "Ankit Anand"
|
|
19
|
-
_author_email = "ankit0.anand0@gmail.com"
|
|
20
|
-
_created_at = "2025-07-08"
|
|
21
|
-
#----------------------------------
|
|
22
|
-
|
|
23
|
-
@staticmethod
|
|
24
|
-
def play(
|
|
25
|
-
y: np.ndarray,
|
|
26
|
-
sr: int,
|
|
27
|
-
regions: list[tuple[float, float]] | None = None,
|
|
28
|
-
title: str | None = None
|
|
29
|
-
) -> None:
|
|
30
|
-
"""
|
|
31
|
-
Plays audio clips for given regions in Jupyter Notebooks.
|
|
32
|
-
|
|
33
|
-
Parameters
|
|
34
|
-
----------
|
|
35
|
-
y : np.ndarray
|
|
36
|
-
Audio time series.
|
|
37
|
-
sr : int
|
|
38
|
-
Sampling rate.
|
|
39
|
-
regions : list of (float, float), optional
|
|
40
|
-
Regions to extract and play (in seconds).
|
|
41
|
-
title : str, optional
|
|
42
|
-
Title to display above audio players.
|
|
43
|
-
|
|
44
|
-
Returns
|
|
45
|
-
-------
|
|
46
|
-
None
|
|
47
|
-
"""
|
|
48
|
-
if not AudioPlayer._in_notebook():
|
|
49
|
-
return
|
|
50
|
-
|
|
51
|
-
if title:
|
|
52
|
-
display(HTML(f"<h4>{title}</h4>"))
|
|
53
|
-
|
|
54
|
-
if regions:
|
|
55
|
-
for i, (start_sec, end_sec) in enumerate(regions):
|
|
56
|
-
start_sample = int(start_sec * sr)
|
|
57
|
-
end_sample = int(end_sec * sr)
|
|
58
|
-
clip = y[start_sample:end_sample]
|
|
59
|
-
|
|
60
|
-
display(HTML(f"<b>Clip {i+1}</b>: {start_sec:.2f}s → {end_sec:.2f}s"))
|
|
61
|
-
display(Audio(data=clip, rate=sr))
|
|
62
|
-
else:
|
|
63
|
-
display(Audio(data=y, rate=sr))
|
|
64
|
-
|
|
65
|
-
@staticmethod
|
|
66
|
-
def _in_notebook() -> bool:
|
|
67
|
-
try:
|
|
68
|
-
from IPython import get_ipython
|
|
69
|
-
shell = get_ipython()
|
|
70
|
-
return shell and shell.__class__.__name__ == "ZMQInteractiveShell"
|
|
71
|
-
except ImportError:
|
|
72
|
-
return False
|
modusa/signals/signal_ops.py
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
from modusa import excp
|
|
4
|
-
from typing import Any
|
|
5
|
-
import numpy as np
|
|
6
|
-
|
|
7
|
-
class SignalOps:
|
|
8
|
-
"""
|
|
9
|
-
Performs arithmetic and NumPy-style ops on ModusaSignal instances.
|
|
10
|
-
|
|
11
|
-
Note
|
|
12
|
-
----
|
|
13
|
-
- Shape-changing operations like reshape, transpose, etc. are not yet supported. Use only element-wise or aggregation ops for now.
|
|
14
|
-
- Index alignment must be handled carefully in future extensions.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
def _axes_match(a1: tuple[np.ndarray, ...], a2: tuple[np.ndarray, ...]) -> bool:
|
|
18
|
-
"""
|
|
19
|
-
To check if two axes are same.
|
|
20
|
-
"""
|
|
21
|
-
if len(a1) != len(a2):
|
|
22
|
-
return False
|
|
23
|
-
return all(np.allclose(x, y, atol=1e-8) for x, y in zip(a1, a2))
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
#----------------------------------
|
|
27
|
-
# To handle basic math operations like
|
|
28
|
-
# +, -, *, **, / ...
|
|
29
|
-
#----------------------------------
|
|
30
|
-
|
|
31
|
-
@staticmethod
|
|
32
|
-
def add(data: np.ndarray, other: np.ndarray) -> np.ndarray:
|
|
33
|
-
return np.add(data, other)
|
|
34
|
-
|
|
35
|
-
@staticmethod
|
|
36
|
-
def subtract(signal: "ModusaSignal", other: Any) -> "ModusaSignal":
|
|
37
|
-
return SignalOps._apply_binary_op(signal, other, np.subtract, "subtract")
|
|
38
|
-
|
|
39
|
-
@staticmethod
|
|
40
|
-
def multiply(signal: "ModusaSignal", other: Any):
|
|
41
|
-
return SignalOps._apply_binary_op(signal, other, np.multiply, "multiply")
|
|
42
|
-
|
|
43
|
-
@staticmethod
|
|
44
|
-
def divide(signal: "ModusaSignal", other: Any):
|
|
45
|
-
return SignalOps._apply_binary_op(signal, other, np.divide, "divide")
|
|
46
|
-
|
|
47
|
-
@staticmethod
|
|
48
|
-
def power(signal: "ModusaSignal", other: Any):
|
|
49
|
-
return SignalOps._apply_binary_op(signal, other, np.power, "power")
|
|
50
|
-
|
|
51
|
-
@staticmethod
|
|
52
|
-
def floor_divide(signal: "ModusaSignal", other: Any):
|
|
53
|
-
return SignalOps._apply_binary_op(signal, other, np.floor_divide, "floor_divide")
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
#----------------------------------
|
|
58
|
-
# To handle numpy aggregator ops
|
|
59
|
-
# mean, sum, ...
|
|
60
|
-
# TODO: Add dimension select option
|
|
61
|
-
#----------------------------------
|
|
62
|
-
@staticmethod
|
|
63
|
-
def mean(signal: "ModusaSignal") -> float:
|
|
64
|
-
"""Return the mean of the signal data."""
|
|
65
|
-
return float(np.mean(signal._data))
|
|
66
|
-
|
|
67
|
-
@staticmethod
|
|
68
|
-
def std(signal: "ModusaSignal") -> float:
|
|
69
|
-
"""Return the standard deviation of the signal data."""
|
|
70
|
-
return float(np.std(signal._data))
|
|
71
|
-
|
|
72
|
-
@staticmethod
|
|
73
|
-
def min(signal: "ModusaSignal") -> float:
|
|
74
|
-
"""Return the minimum value in the signal data."""
|
|
75
|
-
return float(np.min(signal._data))
|
|
76
|
-
|
|
77
|
-
@staticmethod
|
|
78
|
-
def max(signal: "ModusaSignal") -> float:
|
|
79
|
-
"""Return the maximum value in the signal data."""
|
|
80
|
-
return float(np.max(signal._data))
|
|
81
|
-
|
|
82
|
-
@staticmethod
|
|
83
|
-
def sum(signal: "ModusaSignal") -> float:
|
|
84
|
-
"""Return the sum of the signal data."""
|
|
85
|
-
return float(np.sum(signal._data))
|
|
86
|
-
|
|
87
|
-
#----------------------------------
|
|
88
|
-
# To handle numpy ops where the
|
|
89
|
-
# shapes are unaltered
|
|
90
|
-
# sin, cos, exp, log, ...
|
|
91
|
-
#----------------------------------
|
|
92
|
-
|
|
93
|
-
@staticmethod
|
|
94
|
-
def _apply_unary_op(signal: "ModusaSignal", op_func, op_name: str):
|
|
95
|
-
from modusa.signals.base import ModusaSignal # avoid circular import
|
|
96
|
-
|
|
97
|
-
if not isinstance(signal, ModusaSignal):
|
|
98
|
-
raise excp.InputTypeError(f"`signal` must be a ModusaSignal, got {type(signal)}")
|
|
99
|
-
|
|
100
|
-
try:
|
|
101
|
-
result = op_func(signal._data)
|
|
102
|
-
except Exception as e:
|
|
103
|
-
raise excp.SignalOpError(f"{op_name} failed: {e}")
|
|
104
|
-
|
|
105
|
-
if not isinstance(result, np.ndarray):
|
|
106
|
-
raise excp.SignalOpError(f"{op_name} did not return a NumPy array, got {type(result)}")
|
|
107
|
-
|
|
108
|
-
if result.shape != signal._data.shape:
|
|
109
|
-
raise excp.SignalOpError(f"{op_name} changed shape: {signal._data.shape} → {result.shape}")
|
|
110
|
-
|
|
111
|
-
return signal.replace(data=result)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@staticmethod
|
|
115
|
-
def sin(signal: "ModusaSignal"):
|
|
116
|
-
return SignalOps._apply_unary_op(signal, np.sin, "sin")
|
|
117
|
-
|
|
118
|
-
@staticmethod
|
|
119
|
-
def cos(signal: "ModusaSignal"):
|
|
120
|
-
return SignalOps._apply_unary_op(signal, np.cos, "cos")
|
|
121
|
-
|
|
122
|
-
@staticmethod
|
|
123
|
-
def exp(signal: "ModusaSignal"):
|
|
124
|
-
return SignalOps._apply_unary_op(signal, np.exp, "exp")
|
|
125
|
-
|
|
126
|
-
@staticmethod
|
|
127
|
-
def tanh(signal: "ModusaSignal"):
|
|
128
|
-
return SignalOps._apply_unary_op(signal, np.tanh, "tanh")
|
|
129
|
-
|
|
130
|
-
@staticmethod
|
|
131
|
-
def log(signal: "ModusaSignal"):
|
|
132
|
-
return SignalOps._apply_unary_op(signal, np.log, "log")
|
|
133
|
-
|
|
134
|
-
@staticmethod
|
|
135
|
-
def log10(signal: "ModusaSignal"):
|
|
136
|
-
return SignalOps._apply_unary_op(signal, np.log10, "log10")
|
|
137
|
-
|
|
138
|
-
@staticmethod
|
|
139
|
-
def log2(signal: "ModusaSignal"):
|
|
140
|
-
return SignalOps._apply_unary_op(signal, np.log2, "log2")
|
|
141
|
-
|
|
142
|
-
@staticmethod
|
|
143
|
-
def log1p(signal: "ModusaSignal"):
|
|
144
|
-
return SignalOps._apply_unary_op(signal, np.log1p, "log1p")
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
@staticmethod
|
|
148
|
-
def sqrt(signal: "ModusaSignal"):
|
|
149
|
-
return SignalOps._apply_unary_op(signal, np.sqrt, "sqrt")
|
|
150
|
-
|
|
151
|
-
@staticmethod
|
|
152
|
-
def abs(signal: "ModusaSignal"):
|
|
153
|
-
return SignalOps._apply_unary_op(signal, np.abs, "abs")
|
|
154
|
-
|
|
155
|
-
#------------------------------------
|
|
156
|
-
# TODO: Add shape-changing ops like
|
|
157
|
-
# reshape, transpose, squeeze later
|
|
158
|
-
#------------------------------------
|
modusa-0.2.21.dist-info/RECORD
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
modusa-0.2.21.dist-info/METADATA,sha256=8w92QC0HD1G1ffEuooI1tR_EMDkB0aGTjqmngzKvki4,1475
|
|
2
|
-
modusa-0.2.21.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
|
|
3
|
-
modusa-0.2.21.dist-info/entry_points.txt,sha256=fmKpleVXj6CdaBVL14WoEy6xx7JQCs85jvzwTi3lePM,73
|
|
4
|
-
modusa-0.2.21.dist-info/licenses/LICENSE.md,sha256=JTaXAjx5awk76VArKCx5dUW8vmLEWsL_ZlR7-umaHbA,1078
|
|
5
|
-
modusa/.DS_Store,sha256=Q0eG2RQNYtV4qa5BYj_GznvlEBpNdebi6ZTIR-a7AhU,6148
|
|
6
|
-
modusa/__init__.py,sha256=bfQKVSpAXlKmKvMRIU6WSRQW2qoJsaZsdNJ8E69ghn0,37
|
|
7
|
-
modusa/config.py,sha256=bTqK4t00FZqERVITrxW_q284aDDJAa9aMSfFknfR-oU,280
|
|
8
|
-
modusa/decorators.py,sha256=kGadBm1UzAuWjc4tw9ycOkUm3xP6q-jebGo5yjk_Aqs,5909
|
|
9
|
-
modusa/devtools/generate_template.py,sha256=1WTMIHvBoa42Ow3g2HvYKVNSBxLB6JLGXhs-7G7zi28,5225
|
|
10
|
-
modusa/devtools/list_authors.py,sha256=FWBQKOLznVthvMYMASrx2Gw5lqKHEOccQpBisDZ53Dw,24
|
|
11
|
-
modusa/devtools/list_plugins.py,sha256=g-R5hoaCzHfClY_Sfa788IQ9CAKzQGTfyqmthXDZQqw,1729
|
|
12
|
-
modusa/devtools/main.py,sha256=Me7nkn-oaaxIVuj1aJ5dCq3CB8xODH6i2kqE_pAFmXQ,1836
|
|
13
|
-
modusa/devtools/templates/engine.py,sha256=fmUhvgOpmNtJ5zbYDonyLVjRDzUnVCRzDWY6WeSeiVY,514
|
|
14
|
-
modusa/devtools/templates/generator.py,sha256=tf2k2L9RF5S9iJmqPD5AFETJKvqL5XknqK3sR6n2ceQ,444
|
|
15
|
-
modusa/devtools/templates/io.py,sha256=jcO4vAH8iiw6uvwy2aEbsBeNnQOj5VaU_VrQvhJflRA,383
|
|
16
|
-
modusa/devtools/templates/plugin.py,sha256=HNoN0S63ahk83EPup_15pbfOY5_kFfnLF63U3vWOMp8,863
|
|
17
|
-
modusa/devtools/templates/signal.py,sha256=Jqdq38W6ye2cf499oGXWlpCVH4Nmoo1jNfPYgdVLseA,775
|
|
18
|
-
modusa/devtools/templates/test.py,sha256=OXEeIGW1D8g3a0jLyweNBpwfAQkkClhiIAEI6x0CooU,266
|
|
19
|
-
modusa/engines/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
20
|
-
modusa/engines/__init__.py,sha256=HtXuC9NWIo6faKTmbalxNvw2CTtiGrsPly7i08GlHVg,54
|
|
21
|
-
modusa/engines/base.py,sha256=gHeGTbvcPhTxwUwt16OLpepMkbG40rv19vs8tN8xqgA,297
|
|
22
|
-
modusa/generators/__init__.py,sha256=vcu5uk1hP637bmPTAiyb0LQ_vkFwgp4r-A1hAHR4zfo,110
|
|
23
|
-
modusa/generators/audio_waveforms.py,sha256=qWg9TUVux8Abxmxa7EjCB_Pt88UFC6bJBqvYRWz8MTg,5868
|
|
24
|
-
modusa/generators/base.py,sha256=QTb-8F19DmoCwLS7Mn9MdugOMZ_22suuTBFrmpyE7LM,934
|
|
25
|
-
modusa/io/__init__.py,sha256=2Jg44klIAjbgLCn4faXXug_4nW-UiMsOH4Z3g0VGxWw,250
|
|
26
|
-
modusa/io/audio_converter.py,sha256=CjsuvdjpHAuwJFjFNCHSzge-i07zW6U-cnb0EIYhMC0,1877
|
|
27
|
-
modusa/io/audio_loader.py,sha256=o_tAFZaGVm62z59Yinzf2z6Gp_lujRoSWk1GHCaeOlI,4903
|
|
28
|
-
modusa/io/audio_player.py,sha256=5BrYx1YyTYUybroJSNaZ5n7ABgKWeP4zBCLfhyQYPBE,1626
|
|
29
|
-
modusa/io/base.py,sha256=GOMvpicWWLWXoxm4nLwqq_0hWmXWzYAPLVx-CbthCsQ,1291
|
|
30
|
-
modusa/io/plotter.py,sha256=VViXHuIugAQDcTkSWjbrymrMrQOKVw97jqsd4-kWl_8,11920
|
|
31
|
-
modusa/io/youtube_downloader.py,sha256=7Ah3JCHZTdL47v3m6KthYt80QOm40dDp2qAT2fChgFA,3444
|
|
32
|
-
modusa/main.py,sha256=YeNg_GX3pzP4qNNU7CItCkWt5eOCHhnWLENFcQFlgfc,538
|
|
33
|
-
modusa/plugins/__init__.py,sha256=OB-b_GnUnTkECn1fwxl844UBmiui3mSWIvhBqMZY7Tc,22
|
|
34
|
-
modusa/plugins/base.py,sha256=Bh_1Bja7fOymFsCgwhXDbV6ys3D8muNrPwrfDrG_G_A,2382
|
|
35
|
-
modusa/signals/__init__.py,sha256=TZujCd50gGnO-r27Tv6hrzNl8zBsMIMFwYCeIwszMjc,237
|
|
36
|
-
modusa/signals/audio_signal.py,sha256=DvjQUjja9s3nrAHM7H_3z5DVC0nha0Az2D1025q5upk,15750
|
|
37
|
-
modusa/signals/base.py,sha256=UdwOTlIHvXjpuCBwE-IcCQBL0F-wuhQpD6aOvI8FvXE,795
|
|
38
|
-
modusa/signals/frequency_domain_signal.py,sha256=wS7MN6y56BDInNgtnkIB3XNsxDS_TNmewqS-A31MJmY,11192
|
|
39
|
-
modusa/signals/signal_ops.py,sha256=tpbZs10NVkT4Y7nsIhqGEP4Y6T8JZ07PiKxF34fYu-I,4685
|
|
40
|
-
modusa/signals/spectrogram.py,sha256=Rbt7AVHuRjRLjHXaoUtaT_uG-CCK6Tc9_P9apH2Oczk,14443
|
|
41
|
-
modusa/signals/time_domain_signal.py,sha256=SOiBVhvsZcctYOGLLtnXXK5IT9wOTO-S4_K0DPWPr-Y,9751
|
|
42
|
-
modusa/utils/.DS_Store,sha256=nLXMwF7QJNuglLI_Gk74F7vl5Dyus2Wd74Mgowijmdo,6148
|
|
43
|
-
modusa/utils/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
|
|
44
|
-
modusa/utils/config.py,sha256=cuGbqbovx5WDQq5rw3hIKcv3CnE5NttjacSOWnP1yu4,576
|
|
45
|
-
modusa/utils/excp.py,sha256=_NLfR1AKU4dOpK-OF0NaChYjaVBCcq1VmSd_dkOexi4,1235
|
|
46
|
-
modusa/utils/logger.py,sha256=K0rsnObeNKCxlNeSnVnJeRhgfmob6riB2uyU7h3dDmA,571
|
|
47
|
-
modusa-0.2.21.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|