commkit 1.0.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 (84) hide show
  1. commkit/__init__.py +74 -0
  2. commkit/_cuda/__init__.py +321 -0
  3. commkit/_cuda/compiler.py +88 -0
  4. commkit/_cuda/src/bps_min_d2.cu +104 -0
  5. commkit/_cuda/src/cs_block.cu +119 -0
  6. commkit/_cuda/src/selftest.cu +14 -0
  7. commkit/analysis/__init__.py +55 -0
  8. commkit/analysis/_common.py +236 -0
  9. commkit/analysis/allan.py +108 -0
  10. commkit/analysis/drift.py +213 -0
  11. commkit/analysis/interferometry.py +887 -0
  12. commkit/analysis/linewidth.py +480 -0
  13. commkit/analysis/trajectory.py +91 -0
  14. commkit/backend.py +507 -0
  15. commkit/coding/__init__.py +23 -0
  16. commkit/coding/base.py +17 -0
  17. commkit/coding/bch.py +6 -0
  18. commkit/coding/convolutional.py +7 -0
  19. commkit/coding/crc.py +7 -0
  20. commkit/coding/galois.py +8 -0
  21. commkit/coding/hamming.py +6 -0
  22. commkit/coding/interleaving.py +7 -0
  23. commkit/coding/ldpc.py +8 -0
  24. commkit/coding/polar.py +8 -0
  25. commkit/coding/ratematch.py +6 -0
  26. commkit/coding/reed_solomon.py +6 -0
  27. commkit/coding/turbo.py +8 -0
  28. commkit/core/__init__.py +32 -0
  29. commkit/core/frame.py +992 -0
  30. commkit/core/generation.py +581 -0
  31. commkit/core/signal.py +725 -0
  32. commkit/equalization/__init__.py +49 -0
  33. commkit/equalization/_block.py +1855 -0
  34. commkit/equalization/_common.py +606 -0
  35. commkit/equalization/_kernels_jax.py +1720 -0
  36. commkit/equalization/_kernels_numba.py +1704 -0
  37. commkit/equalization/blind.py +223 -0
  38. commkit/equalization/linear.py +365 -0
  39. commkit/equalization/polarization.py +790 -0
  40. commkit/equalization/result.py +191 -0
  41. commkit/equalization/sequential.py +2805 -0
  42. commkit/filtering.py +1120 -0
  43. commkit/frequency.py +1191 -0
  44. commkit/helpers.py +489 -0
  45. commkit/impairments/__init__.py +43 -0
  46. commkit/impairments/channel/__init__.py +20 -0
  47. commkit/impairments/channel/linear.py +310 -0
  48. commkit/impairments/channel/nonlinear.py +11 -0
  49. commkit/impairments/frontend.py +229 -0
  50. commkit/impairments/noise.py +105 -0
  51. commkit/impairments/source.py +219 -0
  52. commkit/io.py +308 -0
  53. commkit/logger.py +103 -0
  54. commkit/mapping/__init__.py +46 -0
  55. commkit/mapping/bits.py +240 -0
  56. commkit/mapping/constellation.py +153 -0
  57. commkit/mapping/gray.py +429 -0
  58. commkit/mapping/llr.py +253 -0
  59. commkit/mapping/shaping.py +218 -0
  60. commkit/metrics.py +949 -0
  61. commkit/multirate.py +476 -0
  62. commkit/plotting/__init__.py +78 -0
  63. commkit/plotting/analysis.py +627 -0
  64. commkit/plotting/constellation.py +483 -0
  65. commkit/plotting/equalizer.py +390 -0
  66. commkit/plotting/eye.py +388 -0
  67. commkit/plotting/spectral.py +575 -0
  68. commkit/plotting/sync.py +953 -0
  69. commkit/plotting/theme.py +203 -0
  70. commkit/plotting/waveform.py +200 -0
  71. commkit/py.typed +0 -0
  72. commkit/recovery/__init__.py +51 -0
  73. commkit/recovery/bps.py +337 -0
  74. commkit/recovery/corrections.py +751 -0
  75. commkit/recovery/pilots.py +803 -0
  76. commkit/recovery/pll.py +482 -0
  77. commkit/recovery/tikhonov.py +424 -0
  78. commkit/recovery/viterbi_viterbi.py +227 -0
  79. commkit/spectral.py +560 -0
  80. commkit/timing.py +841 -0
  81. commkit-1.0.0.dist-info/METADATA +145 -0
  82. commkit-1.0.0.dist-info/RECORD +84 -0
  83. commkit-1.0.0.dist-info/WHEEL +4 -0
  84. commkit-1.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,145 @@
1
+ Metadata-Version: 2.5
2
+ Name: commkit
3
+ Version: 1.0.0
4
+ Summary: A Python library for high-performance digital communications research.
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: jax>=0.10
9
+ Requires-Dist: matplotlib>=3.11
10
+ Requires-Dist: numba>=0.65
11
+ Requires-Dist: numpy>=2.4
12
+ Requires-Dist: pydantic>=2.13
13
+ Requires-Dist: pyyaml>=6.0.2
14
+ Requires-Dist: scipy>=1.17
15
+ Provides-Extra: gpu
16
+ Requires-Dist: cupy-cuda13x>=14.1; extra == 'gpu'
17
+ Requires-Dist: jax[cuda13]>=0.10; extra == 'gpu'
18
+ Requires-Dist: nvidia-curand>=10.4.1.34; extra == 'gpu'
19
+ Provides-Extra: notebook
20
+ Requires-Dist: jupyter>=1.1.1; extra == 'notebook'
21
+ Description-Content-Type: text/markdown
22
+
23
+ # CommKit
24
+
25
+ **High-performance digital communications research kit for Python.**
26
+
27
+ ![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)
28
+ ![Backends](https://img.shields.io/badge/backend-NumPy%20%7C%20CuPy%20%7C%20JAX-orange)
29
+ ![License](https://img.shields.io/badge/license-MIT-green)
30
+ ![CUDA](https://img.shields.io/badge/CUDA-13.x-76B900?logo=nvidia)
31
+
32
+ ---
33
+
34
+ CommKit is a Python library for digital communications research that treats hardware as a first-class concern. A single `Signal` object carries IQ samples, physical metadata, and modulation context - with DSP operations dispatching automatically to NumPy, CuPy, or JAX based on data location.
35
+
36
+ ---
37
+
38
+ ## Why CommKit?
39
+
40
+ - **One object, complete context:** Sampling rate, symbol rate, modulation format, and pulse shape travel with the signal through the processing pipeline.
41
+ - **Backend-transparent DSP:** `dispatch()` resolves NumPy, CuPy, or SciPy modules at runtime. The same code executes seamlessly on CPU or GPU.
42
+ - **Method chaining:** High-level fluent API (`sig.to("gpu").fir_filter(taps).resample(sps_out=2)...`) for rapid prototyping.
43
+ - **JAX escape hatch:** Zero-copy DLPack export on GPU allows direct application of JAX transforms (gradients, `vmap`, `scan`) without leaving the research loop.
44
+
45
+ ---
46
+
47
+ ## Modules & Features
48
+
49
+ | Module | Key Capabilities & Features |
50
+ | --- | --- |
51
+ | [`commkit.core`](commkit/core) | `Signal` container (IQ samples + metadata), `SingleCarrierFrame`, `Preamble`, and symbol/frame factories (PAM, PSK, QAM). |
52
+ | [`commkit.backend`](commkit/backend.py) | Hardware abstraction layer (`dispatch`, `to_device`, `to_jax`, `from_jax`), placement management, and backend execution (NumPy, CuPy, JAX). |
53
+ | [`commkit.mapping`](commkit/mapping) | Gray-coded constellations, symbol mapping, hard demapping, soft LLR computation (max-log and exact log-sum-exp via JAX JIT), and GMI. |
54
+ | [`commkit.filtering`](commkit/filtering.py) | Pulse shaping (RRC, RC, Gaussian, Smooth-Rectangle), tap generators, matched filtering, Overlap-Save, and polyphase multirate filtering. |
55
+ | [`commkit.multirate`](commkit/multirate.py) | Fractional and integer sample rate conversion (`resample`, `decimate`, `upsample`, `decimate_to_symbol_rate`). |
56
+ | [`commkit.timing`](commkit/timing.py) | Preamble generation (Barker, Zadoff-Chu), cross-correlation timing delay estimation, and frame alignment. |
57
+ | [`commkit.frequency`](commkit/frequency.py) | Carrier frequency offset estimation (FOE via M-th power, Mengali-Morelli, Jacobsen) and phase-locked FOE correction. |
58
+ | [`commkit.recovery`](commkit/recovery) | Carrier phase recovery (CPR via Viterbi-Viterbi, BPS, DD-PLL) and cycle-slip detection/correction. |
59
+ | [`commkit.equalization`](commkit/equalization) | Adaptive equalizers (`lms`, `rls`, `cma`, `rde`, `zf`), butterfly MIMO topology support, with Numba JIT and JAX execution backends. |
60
+ | [`commkit.impairments`](commkit/impairments) | Channel impairments simulation: AWGN (with SPS correction), PMD (differential group delay, Jones matrix), phase noise, IQ imbalance, and chromatic dispersion. |
61
+ | [`commkit.coding`](commkit/coding) | Channel coding and FEC primitives (BCH, Convolutional, CRC, Galois field arithmetic, Hamming, Interleaving, LDPC, Polar, Rate matching, Reed-Solomon, Turbo codes). |
62
+ | [`commkit.metrics`](commkit/metrics.py) | System performance evaluation: EVM (%, dB), data-aided SNR, and BER estimation. |
63
+ | [`commkit.analysis`](commkit/analysis) | Laser phase and linewidth characterization: DSH, homodyne IQ, zero-phase drift detrending, AWGN-free lag-slope linewidth fit, Di Domenico $\beta$-separation line FWHM, and Allan deviation. |
64
+ | [`commkit.spectral`](commkit/spectral.py) | Welch PSD estimation and frequency shifting with bin-quantized mixing. |
65
+ | [`commkit.io`](commkit/io.py) | Signal persistence and disk serialization (`load_npz`, `save_npz`). |
66
+ | [`commkit.plotting`](commkit/plotting) | Visualization tools for constellations, eye diagrams, PSDs, time-domain signals, filter responses, and equalizer convergence. |
67
+ | [`commkit.helpers`](commkit/helpers.py) | General DSP helpers: random bit/symbol generators, array normalization, RMS calculation, and SI prefix formatting. |
68
+
69
+ ---
70
+
71
+ ## Installation & Usage
72
+
73
+ **Requires Python 3.12+** and [`uv`](https://github.com/astral-sh/uv).
74
+
75
+ ### Core Installation (CPU)
76
+
77
+ ```bash
78
+ # Using uv (Recommended)
79
+ uv pip install git+https://github.com/lokgar/commkit.git
80
+
81
+ # Or with standard pip
82
+ pip install git+https://github.com/lokgar/commkit.git
83
+ ```
84
+
85
+ ### GPU Support
86
+
87
+ To install with CUDA acceleration (includes JAX CUDA 13 and CuPy stacks):
88
+
89
+ ```bash
90
+ # Using uv
91
+ uv pip install "commkit[gpu] @ git+https://github.com/lokgar/commkit.git"
92
+
93
+ # Or with standard pip
94
+ pip install "commkit[gpu] @ git+https://github.com/lokgar/commkit.git"
95
+ ```
96
+
97
+ > [!NOTE]
98
+ > **WSL2 CUDA Configuration:**
99
+ > When NVIDIA drivers and CUDA are properly installed on Windows, there is no need to install CUDA inside WSL2. However, to allow Python CUDA packages inside WSL2 to locate the bundled NVIDIA shared libraries, add the following line to your `~/.bashrc`:
100
+ >
101
+ > ```bash
102
+ > export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(echo $HOME/commkit/.venv/lib/python3.*/site-packages/nvidia/cu13/lib)
103
+ > ```
104
+ >
105
+ > *(Assumes `commkit` is cloned in `$HOME/commkit`. If located elsewhere, replace `$HOME/commkit` with `<path-to-repo>`. `python3.*/` matches any Python version automatically).*
106
+
107
+ ### Development Installation
108
+
109
+ ```bash
110
+ git clone https://github.com/lokgar/commkit.git
111
+ cd commkit
112
+
113
+ # Sync core environment
114
+ uv sync
115
+
116
+ # Sync environment with all extras (including GPU packages)
117
+ uv sync --all-extras
118
+ ```
119
+
120
+ ---
121
+
122
+ ## Examples & Notebooks
123
+
124
+ For complete usage scripts and DSP examples, explore the [`examples/`](examples) directory.
125
+
126
+ ---
127
+
128
+ ## Running Tests
129
+
130
+ ```bash
131
+ # CPU test suite
132
+ uv run pytest --device=cpu
133
+
134
+ # GPU test suite (requires CuPy + CUDA)
135
+ uv run pytest --device=gpu
136
+
137
+ # Run all test suites
138
+ uv run pytest --device=all
139
+ ```
140
+
141
+ ---
142
+
143
+ ## License
144
+
145
+ This project is licensed under the [MIT License](LICENSE).
@@ -0,0 +1,84 @@
1
+ commkit/__init__.py,sha256=m9-JgEkO_ba43EXxfw6z2Dk9nHRH4-Cbo82WEuwwZwo,1922
2
+ commkit/backend.py,sha256=k3EpznsfHZd6OVlYbi3Kx-GZfxY904QuhbQfIYObpfg,15786
3
+ commkit/filtering.py,sha256=EkT9_ogjKyysdR1xfaexXVFYiH-5ZrOHpWkN4mm-bE8,37452
4
+ commkit/frequency.py,sha256=uTtTx7cp6enYYtFBCWHvu0LpKFGDTXQgfnJqCj2geG4,46152
5
+ commkit/helpers.py,sha256=b2qzLAQzSTdFl9emBSXYHew5Ib5ZbREWo0qo4aCqrfI,17402
6
+ commkit/io.py,sha256=xSH58lNYg64BnsHojO13GvMdKeitiKAhy05_gQs20Z8,11991
7
+ commkit/logger.py,sha256=C1HWxH_G3CC2RVfXt7QDkFy7ztCfb4TJknR_GqPmA8g,2790
8
+ commkit/metrics.py,sha256=Ypmdv0VoMmJnoe2ow2HTEq5WfwyEjiOz1Y2chFUNxQ4,35975
9
+ commkit/multirate.py,sha256=pFmq_zwnM7ejLhvondEZq3yTHpv3wJR3sTtqkj2a010,17059
10
+ commkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ commkit/spectral.py,sha256=pQcoqoI8j73uDUOG1ydNfbxvokfFg9eC0ATX5kkQB14,21071
12
+ commkit/timing.py,sha256=0yTn0iB1S3P8vsnUFYZjCSlPEzq-8OpqJIYetmkurWg,31785
13
+ commkit/_cuda/__init__.py,sha256=ivwcVqDn_buIKf9QEkRy4EW3NwyXL3KTPvn6cFrzJbU,11028
14
+ commkit/_cuda/compiler.py,sha256=auZBcdGBUHnLSSpv2d8IkSwgfni3SD_XR_9dBTQxgTE,2669
15
+ commkit/_cuda/src/bps_min_d2.cu,sha256=2qqv9o-kMW_ddChF5rSf1k-Xg17HZ3by1RASO5AFiwQ,4078
16
+ commkit/_cuda/src/cs_block.cu,sha256=NLVXTX8wYUo1gtYXDu3Dx4Z_TqJsuvy_iqu0JZBJjFg,5021
17
+ commkit/_cuda/src/selftest.cu,sha256=wVM-4HvA8egVF6CGp7Q_Z4A0SlO8dW6sQZmcMwpoPDo,511
18
+ commkit/analysis/__init__.py,sha256=6ENcGmyhW946NHYGR7UIzMhFLMCThjVDoJ2scJqt7HU,2160
19
+ commkit/analysis/_common.py,sha256=mEkXRDmRdesqHykDEzmC4-JCY0GAG8CittQRhrcyUU0,9697
20
+ commkit/analysis/allan.py,sha256=YvJ_LdvAFIAB9N2qjqlNTXIXYHBx6b43BLDHBHbIq14,4108
21
+ commkit/analysis/drift.py,sha256=rN2rmTJg21bAEYl2niLfgYQi30bjdAEpoK_ss2R9YHo,8313
22
+ commkit/analysis/interferometry.py,sha256=esdxvznJiXYuierAkbjG0iHX5qeNc_Y8CqMScMpvd3w,39607
23
+ commkit/analysis/linewidth.py,sha256=p6cmaHgRv-UwHBQglsQtvYxErQyNDpTm32Xi4Ey87R8,20173
24
+ commkit/analysis/trajectory.py,sha256=Jel_TUqt_1fXzITtqYDfryeRPM-oxRagxadxGvztVH8,3806
25
+ commkit/coding/__init__.py,sha256=_C3jhsmr5d3qHFokzY3gbUGKVV0GrUAWeba3Z2kqz9Q,1085
26
+ commkit/coding/base.py,sha256=sSwlyYB7n2Vf9_9mUiEy8BsuWjfmTbLSY8nRyRIjOAQ,753
27
+ commkit/coding/bch.py,sha256=YY3b0reQndVCpsPZ4NHAwinNfTdzkZ01KVYu5E_UKws,154
28
+ commkit/coding/convolutional.py,sha256=IVZmOfvSRxq4UT-eTbbyn4zou7fTiD2RZMLx4ZHcQC4,239
29
+ commkit/coding/crc.py,sha256=cVSI0YhU4jZj7h9ysM6Neqs0oOr0xjTK-mGJSsE_DaU,208
30
+ commkit/coding/galois.py,sha256=WhjS11z0VUnNSd29d_uL3JD6kOiEMg6wTrkoo7iQ2f0,301
31
+ commkit/coding/hamming.py,sha256=GI7QwYV05jpGPMv3-gApqx6hWhC5DL18MI9rzymhUBg,153
32
+ commkit/coding/interleaving.py,sha256=VH220faQB4GRIM89zDdT4de9pkoI3KL7bHvkLpNUwmc,224
33
+ commkit/coding/ldpc.py,sha256=1Sp_Q3MxAlqcdW7RyuredBzpLszLA9RTySd1AHdCVGQ,313
34
+ commkit/coding/polar.py,sha256=rCDqC6NYah3-Pz0hLaz11RJnmI0XCXFWcMHVxlM7nbI,293
35
+ commkit/coding/ratematch.py,sha256=i7dstHwKOlmoZsqCYigMmECn9Jnxb8zh2-tqb4vIYBo,159
36
+ commkit/coding/reed_solomon.py,sha256=U2IU1WfNuGhYCYAU94oWv-QwDGVBvvpzOxRw9R0-qX8,153
37
+ commkit/coding/turbo.py,sha256=p6W0BGdsW-sBCi7SXt2THyKEs4vkVuWDWkVzM5sTRqM,275
38
+ commkit/core/__init__.py,sha256=VsaPj73qIQo0ucr1Ftzp_kMLsGoUa2SeFEWC54wM8IY,871
39
+ commkit/core/frame.py,sha256=cAvvWAMG15AMfqbwTICv5319nTFysxAZq4685Wu1p0A,37861
40
+ commkit/core/generation.py,sha256=Y4xnJ0u-ZSfo-xkytCsWG9podHpdHg9xssb272HzaIk,18883
41
+ commkit/core/signal.py,sha256=ESQn0KknVUJPtEx-TVpkNfyvWCfQXwNe_2Rn_BVeaO0,28059
42
+ commkit/equalization/__init__.py,sha256=P3x5dek0AFk1QzM7siIPwMfuf8Nj4tYz_Un65aaOeYY,1640
43
+ commkit/equalization/_block.py,sha256=lBcnuijIunrw4u_V8vjvAE8m3cKlJzAVttseSVNx05o,81322
44
+ commkit/equalization/_common.py,sha256=3pagobuXFAZiaSYH9HyEz3yjLh1WPursbr4dbCKisys,22717
45
+ commkit/equalization/_kernels_jax.py,sha256=g8bx5l6Q5pqI9_LVHjy3L-z5Ht15ev198hP1Rve7XJQ,70885
46
+ commkit/equalization/_kernels_numba.py,sha256=4nw4l1e1KrvemI5V4tZN_ZVcA7tWa7xAR-G6wzrLYkw,75198
47
+ commkit/equalization/blind.py,sha256=b_EzCne4RBws8K07KzXN0MWwmIRBhlGJmSn4mgmJfFU,8296
48
+ commkit/equalization/linear.py,sha256=dgheW19-s7LqBP-lZb6zM-xf5YTfgH9FF7axLm574sA,14671
49
+ commkit/equalization/polarization.py,sha256=Ti44l3RRvdde6q38uxTAFZatzjX0mnK3uw1ZRqd5OWc,36513
50
+ commkit/equalization/result.py,sha256=SdmHSmLUDGpPaTiGctJpLxXCxQOfJFTuijtcQOpw2TA,8142
51
+ commkit/equalization/sequential.py,sha256=_8zM7yMDfek7AlNEmpyF9bMDupu1psUvTjEFYIPmTlA,120190
52
+ commkit/impairments/__init__.py,sha256=_GsY_M3flYVRHDq0FP9n2F-_RSTXQg9mSBxtW7w4Ugg,1437
53
+ commkit/impairments/frontend.py,sha256=YKTRnwPi9YBTgU4x0hmFi_1ik0GPjjTgpeXRlcKw4i0,6850
54
+ commkit/impairments/noise.py,sha256=OgvyA6DD9qS7JnqMCemL0DRfZgT8YOO6d6fYPEJPq7k,3722
55
+ commkit/impairments/source.py,sha256=9nqZqYhvE8LbQVQTRbnUfX_oN2pRY6W-CUnzVztFabM,7298
56
+ commkit/impairments/channel/__init__.py,sha256=GzEAZu6PxYlYqlYh8SPTjiY7fN9F6piiLmdAmnr3hO0,471
57
+ commkit/impairments/channel/linear.py,sha256=P9e9gmYg9b_LIOsLVpm9mQ0sOpom1sEh8K35lztK9wc,9947
58
+ commkit/impairments/channel/nonlinear.py,sha256=0LhoqErFEdZ-xQznC4wyqoW8t_JhmDyOJqCNimPzo80,456
59
+ commkit/mapping/__init__.py,sha256=MB6DGYDBG4tO0hLXl3PRmJ4pJ0g1J1kpJC5hyCue1dc,1511
60
+ commkit/mapping/bits.py,sha256=hFksHu6_evXZTf4ZppsKtBlc7wrE_vvIlRxUfTgPSR0,8599
61
+ commkit/mapping/constellation.py,sha256=B-Aur0_eZqeXhAV9qsR23fWgOkzYGYYGs_TbsWFnnOQ,4975
62
+ commkit/mapping/gray.py,sha256=t3bPUDyOn3VIDYwjqqo-uOXl777oqq06CnGF-1B45So,11439
63
+ commkit/mapping/llr.py,sha256=stT9sHW4J8iOQelqqLno9Y14mzgP_FCwujOuRDxUXzM,9024
64
+ commkit/mapping/shaping.py,sha256=qxPq8j6zk5Cu9knBluFMc_9k1J84-_5OW96dAz_NEV8,6939
65
+ commkit/plotting/__init__.py,sha256=A9QdogNOglW6Gqz6FuMIgnV2Jzc0tNvj43gBfPBt_4Y,2512
66
+ commkit/plotting/analysis.py,sha256=eYosIuRH3KKiFEDDqgOeFgjINNXbQNeL6A72obVB2kU,19256
67
+ commkit/plotting/constellation.py,sha256=faCRkYUYYaoLntVwtJuU8849Q7WFrkDv2zp4Ion4stI,15219
68
+ commkit/plotting/equalizer.py,sha256=jUyY5yywWD132xWRLpzoq6gFsUSihVSgxA6zaerM4_Y,12517
69
+ commkit/plotting/eye.py,sha256=_nFmtT5_Gwz0B1Gwgg556TjfGQXdDcZcIUQ6UO9ijfg,11784
70
+ commkit/plotting/spectral.py,sha256=E3QvZG-t2ohGoU9QkZJvk1uI4BHiFml_ZVv7Eqge3ig,18133
71
+ commkit/plotting/sync.py,sha256=7txbQYmqjJD6D9WOmqHSe4e2pvWrFXwz0vlaP4Ic9l0,31235
72
+ commkit/plotting/theme.py,sha256=N2QmSnVMg4L427kjKdXHO9HDnJKM752scBNeCXHBytg,6832
73
+ commkit/plotting/waveform.py,sha256=bzGxp1_uBo6DfpxK1Bo8YnCXZ8p2Mob2yj7zxQGnU4c,5503
74
+ commkit/recovery/__init__.py,sha256=mtEqN3oKm1E6vy_qrICSF1Y55oAaxDZVW0RTlGZg1yQ,1659
75
+ commkit/recovery/bps.py,sha256=d5d2vkEg0_AX-eak06ZHUTEaXsxCLQlxHZXnw_RbHnQ,14469
76
+ commkit/recovery/corrections.py,sha256=Km8tV7WrpbsNzxTcJYvOGNgmp38St4RIikzwgTOIirM,30180
77
+ commkit/recovery/pilots.py,sha256=pIXXGK_ZUZitJ91yIYjwHqDGGN877_reqbaam2cn0pY,34460
78
+ commkit/recovery/pll.py,sha256=NNrypJWQuJ-u96QKdAMBeohszu1hHuAOmpFciaLP03c,17882
79
+ commkit/recovery/tikhonov.py,sha256=C2LakaYs3NmuzfBJQ6RwWnNIBPjvRAA1UboLee5bATU,16219
80
+ commkit/recovery/viterbi_viterbi.py,sha256=SPy1mEbwueBSA9dSAcAIHWXBiasSBgrHnFfm3G-K5LU,9567
81
+ commkit-1.0.0.dist-info/METADATA,sha256=V6qOUaUJs5VKFYGAZvfeYQLGpFwnVvW3Sr2Kw1WsA7E,6692
82
+ commkit-1.0.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
83
+ commkit-1.0.0.dist-info/licenses/LICENSE,sha256=X9bm1DEtmmDugEV7ulyQzdX-fZcZ711lPAwtdDiU2yg,1059
84
+ commkit-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 lokgar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction acting including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom it is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.