@danielsimonjr/mathts-functions 0.33.0 → 0.35.0

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.
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Fast Fourier Transform (FFT)
3
+ *
4
+ * Implements the Cooley-Tukey radix-2 decimation-in-time FFT algorithm.
5
+ * For non-power-of-2 lengths, zero-pads to next power of 2.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Complex number representation for FFT
11
+ */
12
+ export interface ComplexNumber {
13
+ re: number;
14
+ im: number;
15
+ }
16
+ /**
17
+ * FFT result containing the frequency spectrum
18
+ */
19
+ export interface FFTResult {
20
+ /** Complex frequency components */
21
+ spectrum: ComplexNumber[];
22
+ /** Original signal length before padding */
23
+ originalLength: number;
24
+ /** Padded length (power of 2) */
25
+ paddedLength: number;
26
+ }
27
+ /**
28
+ * Create a complex number
29
+ */
30
+ export declare function complex(re: number, im?: number): ComplexNumber;
31
+ /**
32
+ * Complex conjugate
33
+ */
34
+ export declare function complexConj(a: ComplexNumber): ComplexNumber;
35
+ /**
36
+ * Complex magnitude
37
+ */
38
+ export declare function complexAbs(a: ComplexNumber): number;
39
+ /**
40
+ * Complex phase/argument
41
+ */
42
+ export declare function complexArg(a: ComplexNumber): number;
43
+ /**
44
+ * Compute the Fast Fourier Transform of a real or complex signal.
45
+ *
46
+ * Uses the Cooley-Tukey radix-2 decimation-in-time algorithm.
47
+ * Input is zero-padded to the next power of 2 if necessary.
48
+ *
49
+ * @param signal - Input signal (real numbers or complex numbers)
50
+ * @returns FFT result with spectrum and length info
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // FFT of a real signal
55
+ * const signal = [1, 0, -1, 0];
56
+ * const result = fft(signal);
57
+ * console.log(result.spectrum); // Frequency components
58
+ *
59
+ * // FFT of a complex signal
60
+ * const complexSignal = [
61
+ * { re: 1, im: 0 },
62
+ * { re: 0, im: 1 },
63
+ * ];
64
+ * const result2 = fft(complexSignal);
65
+ * ```
66
+ */
67
+ export declare function fft(signal: number[] | Float64Array | ComplexNumber[]): FFTResult;
68
+ /**
69
+ * Compute the Inverse Fast Fourier Transform.
70
+ *
71
+ * Recovers the time-domain signal from its frequency spectrum.
72
+ *
73
+ * @param spectrum - Complex frequency spectrum
74
+ * @param originalLength - Optional: truncate result to this length
75
+ * @returns Recovered signal
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * // Round-trip test
80
+ * const signal = [1, 2, 3, 4];
81
+ * const result = fft(signal);
82
+ * const recovered = ifft(result.spectrum, result.originalLength);
83
+ * // recovered ≈ signal
84
+ * ```
85
+ */
86
+ export declare function ifft(spectrum: ComplexNumber[], originalLength?: number): ComplexNumber[];
87
+ /**
88
+ * Compute the real part of IFFT result
89
+ */
90
+ export declare function ifftReal(spectrum: ComplexNumber[], originalLength?: number): number[];
91
+ /**
92
+ * Compute the magnitude spectrum (|X(k)|)
93
+ */
94
+ export declare function fftMagnitude(spectrum: ComplexNumber[]): number[];
95
+ /**
96
+ * Compute the power spectrum (|X(k)|²)
97
+ */
98
+ export declare function fftPower(spectrum: ComplexNumber[]): number[];
99
+ /**
100
+ * Compute the phase spectrum (arg(X(k)))
101
+ */
102
+ export declare function fftPhase(spectrum: ComplexNumber[]): number[];
103
+ /**
104
+ * Compute FFT frequency bins for a given sample rate
105
+ *
106
+ * @param n - Number of FFT points
107
+ * @param sampleRate - Sample rate in Hz
108
+ * @returns Array of frequencies in Hz
109
+ */
110
+ export declare function fftFrequencies(n: number, sampleRate?: number): number[];
111
+ /**
112
+ * Compute the 2D FFT of a matrix
113
+ *
114
+ * @param matrix - 2D array of real or complex values
115
+ * @returns 2D frequency spectrum
116
+ */
117
+ export declare function fft2(matrix: number[][] | ComplexNumber[][]): ComplexNumber[][];
118
+ /**
119
+ * Compute the 2D inverse FFT
120
+ *
121
+ * @param spectrum - 2D frequency spectrum
122
+ * @returns 2D spatial domain result
123
+ */
124
+ export declare function ifft2(spectrum: ComplexNumber[][]): ComplexNumber[][];
125
+ /**
126
+ * Shift zero-frequency component to center of spectrum
127
+ *
128
+ * @param spectrum - FFT spectrum
129
+ * @returns Shifted spectrum
130
+ */
131
+ export declare function fftshift<T>(spectrum: T[]): T[];
132
+ /**
133
+ * Inverse of fftshift
134
+ */
135
+ export declare function ifftshift<T>(spectrum: T[]): T[];
136
+ //# sourceMappingURL=fft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fft.d.ts","sourceRoot":"","sources":["../../src/signal/fft.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAE,MAAU,GAAG,aAAa,CAEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAE3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAEnD;AA0DD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,aAAa,EAAE,GAAG,SAAS,CAqChF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAuBxF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAEhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAE5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,MAAM,EAAE,CAa1E;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,CAoC9E;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,CA8BpE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAI9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAI/C"}
@@ -0,0 +1,62 @@
1
+ type Vec = readonly number[] | Float64Array;
2
+ /** Polynomial/deconvolution division result: `signal = conv(divisor, quotient) + remainder`. */
3
+ export interface DeconvolveResult {
4
+ quotient: number[];
5
+ remainder: number[];
6
+ }
7
+ /**
8
+ * FIR bandpass filter coefficients by the windowed-sinc method (Hamming
9
+ * window): `h[n] = (f2·sinc(f2·(n−M/2)) − f1·sinc(f1·(n−M/2)))·hamming[n]`,
10
+ * `M = numtaps−1`. `[f1, f2]` are cutoffs normalized to Nyquist (1 = Nyquist).
11
+ * This is the array-cutoff (bandpass) case the scalar-only `firwin` in
12
+ * `../signal-filter-extra.ts` didn't support (resolves the Phase-0 note).
13
+ */
14
+ export declare function firwinBandpass(numtaps: number, cutoffs: readonly [number, number]): number[];
15
+ /**
16
+ * Savitzky-Golay smoothing (`scipy.signal.savgol_filter`, default `mode='interp'`).
17
+ * For each interior position, fits a degree-`polyorder` polynomial (via the
18
+ * normal equations over a Vandermonde of the window offsets) to the centered
19
+ * `windowLength`-point window and takes the fitted value at the center. Edge
20
+ * points reuse the nearest full boundary window's fit, evaluated at the edge
21
+ * point's actual offset from that window's center (scipy's boundary handling).
22
+ * Exact on polynomials of degree <= `polyorder`.
23
+ */
24
+ export declare function savgol(x: Vec, windowLength: number, polyorder: number): number[];
25
+ /**
26
+ * FIR/polynomial deconvolution (`scipy.signal.deconvolve`): standard
27
+ * synthetic long division so that `signal = conv(divisor, quotient) + remainder`,
28
+ * with `quotient` of length `signal.length - divisor.length + 1` and
29
+ * `remainder` the same length as `signal` (zero when `divisor` exactly divides).
30
+ */
31
+ export declare function deconvolve(signal: Vec, divisor: Vec): DeconvolveResult;
32
+ /**
33
+ * Wiener adaptive filter (`scipy.signal.wiener`-style, per-sample noise
34
+ * estimate): local mean `m` and variance `v` over a sliding window of size
35
+ * `mysize` (same-length, zero-padded at the edges — matches `convDirect`'s
36
+ * `'same'` convention), noise power `= mean(v)`; output
37
+ * `m + max(0, v−noise)/max(v, noise)·(x−m)` (0 where both `v` and `noise` are 0).
38
+ */
39
+ export declare function wiener(x: Vec, mysize?: number): number[];
40
+ /**
41
+ * Least-squares linear-phase FIR design (`scipy.signal.firls`): `bands` is a
42
+ * flat list of `[lo, hi]` band-edge pairs (normalized to Nyquist, 1 = Nyquist)
43
+ * and `desired` the corresponding response values at those edges (linearly
44
+ * interpolated within each band; gaps between bands are unconstrained
45
+ * transition regions). Solves the normal equations of the cosine-basis
46
+ * representation of a symmetric (Type I odd-length / Type II even-length)
47
+ * linear-phase filter against a dense trapezoid-quadrature sampling of the
48
+ * specified bands, then maps the fitted basis coefficients back to taps.
49
+ */
50
+ export declare function firls(numtaps: number, bands: readonly number[], desired: readonly number[]): number[];
51
+ /**
52
+ * Parks-McClellan-style equiripple FIR design. **This is NOT the exact
53
+ * Remez-exchange algorithm** — it is Lawson's algorithm, an iteratively
54
+ * reweighted least squares (IRLS) scheme that approximates the minimax
55
+ * (Chebyshev) solution by repeatedly re-solving the `firls` normal equations
56
+ * with per-sample weights pushed up wherever the previous iteration's error
57
+ * was largest, converging toward (but not guaranteed to reach) a true
58
+ * equiripple response. Documented as approximate per the Task 3 spec.
59
+ */
60
+ export declare function remez(numtaps: number, bands: readonly number[], desired: readonly number[]): number[];
61
+ export {};
62
+ //# sourceMappingURL=fir-smoothing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fir-smoothing.d.ts","sourceRoot":"","sources":["../../src/signal/fir-smoothing.ts"],"names":[],"mappings":"AAUA,KAAK,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAG5C,gGAAgG;AAChG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAsCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAa5F;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BhF;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,gBAAgB,CAiBtE;AAID;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAsBnD;AAoHD;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,EAAE,CAUV;AAED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,EAAE,CAkBV"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Chebyshev I/II and elliptic (Cauer) IIR filter design, plus the supporting
3
+ * `zpk2sos`/`sosfilt`/`bilinear`/`buttord` utilities. Extends the Butterworth
4
+ * pipeline in `../signal-filter-extra.ts` with two more analog prototypes and
5
+ * reuses its shared zpk→transfer-function plumbing (`analogToDigital`,
6
+ * `polyFromRoots`). Matches `scipy.signal` — every coefficient set pinned
7
+ * against `scipy.signal.{cheby1,cheby2,ellip,bilinear,buttord}` (see
8
+ * `functions/tests/iir-design.test.ts`).
9
+ *
10
+ * The elliptic prototype (`ellipap`) follows Orfanidis, "Lecture Notes on
11
+ * Elliptic Filter Design" (the algorithm scipy itself implements): the filter
12
+ * degree equation is solved in closed form via the theta-function nome
13
+ * expansion (`ellipdeg`), and the "arc Jacobi sc" root (`arcJacSc1`) via the
14
+ * descending Landen transformation (`arcJacSn`) — no numerical optimizer is
15
+ * needed. Reuses the repo's existing AGM-based `ellipticKScalar` and
16
+ * `jacobiSN`/`jacobiCN`/`jacobiDN` (Phase 5 special functions, `m = k²`
17
+ * convention, matching scipy's `ellipk`/`ellipj`).
18
+ */
19
+ import { Complex } from '@danielsimonjr/mathts-core';
20
+ import { type FilterBtype } from '../signal-filter-extra.js';
21
+ type Vec = readonly number[] | Float64Array;
22
+ /**
23
+ * Chebyshev Type I digital IIR filter design — equiripple in the passband, `rp`
24
+ * dB of ripple. `Wn` is the cutoff (scalar) or `[low, high]` band edges,
25
+ * normalized to Nyquist. Matches `scipy.signal.cheby1(N, rp, Wn, btype)`.
26
+ */
27
+ export declare function cheby1(N: number, rp: number, Wn: number | readonly number[], btype?: FilterBtype): {
28
+ b: number[];
29
+ a: number[];
30
+ };
31
+ /**
32
+ * Chebyshev Type II digital IIR filter design — equiripple in the stopband,
33
+ * `rs` dB of stopband attenuation, monotone passband. `Wn` is the cutoff
34
+ * (scalar) or `[low, high]` band edges, normalized to Nyquist. Matches
35
+ * `scipy.signal.cheby2(N, rs, Wn, btype)`.
36
+ */
37
+ export declare function cheby2(N: number, rs: number, Wn: number | readonly number[], btype?: FilterBtype): {
38
+ b: number[];
39
+ a: number[];
40
+ };
41
+ /**
42
+ * Elliptic (Cauer) digital IIR filter design — equiripple in both passband
43
+ * (`rp` dB) and stopband (`rs` dB); the steepest roll-off of the four classical
44
+ * IIR families for a given order. `Wn` is the cutoff (scalar) or `[low, high]`
45
+ * band edges, normalized to Nyquist. Matches `scipy.signal.ellip(N, rp, rs, Wn,
46
+ * btype)` exactly (verified against `scipy.signal` 1.17.1 — see
47
+ * `functions/tests/iir-design.test.ts`); this is a full port of scipy's
48
+ * closed-form (nome-based) elliptic design, not an approximation.
49
+ */
50
+ export declare function ellip(N: number, rp: number, rs: number, Wn: number | readonly number[], btype?: FilterBtype): {
51
+ b: number[];
52
+ a: number[];
53
+ };
54
+ /**
55
+ * Analog-to-digital bilinear (Tustin) transform of a transfer function: given
56
+ * `H(s) = b(s)/a(s)` (coefficients highest-degree-first), substitutes
57
+ * `s = 2·fs·(z−1)/(z+1)` to produce the digital `{ b, a }` (no pre-warping is
58
+ * done — the caller pre-warps `fs`/critical frequencies if needed). Matches
59
+ * `scipy.signal.bilinear(b, a, fs)`.
60
+ */
61
+ export declare function bilinear(bIn: Vec, aIn: Vec, fs: number): {
62
+ b: number[];
63
+ a: number[];
64
+ };
65
+ /**
66
+ * Minimum Butterworth filter order (and the corresponding `-3dB`-ish natural
67
+ * frequency `Wn`) meeting a passband/stopband spec, for a digital lowpass
68
+ * (`wp < ws`) or highpass (`wp > ws`) filter. `wp`/`ws` are normalized to
69
+ * Nyquist (0..1); `gpass`/`gstop` are in dB. Matches
70
+ * `scipy.signal.buttord(wp, ws, gpass, gstop)` (scalar/digital case only —
71
+ * the bandpass/bandstop array form is not implemented).
72
+ */
73
+ export declare function buttord(wp: number, ws: number, gpass: number, gstop: number): {
74
+ N: number;
75
+ Wn: number;
76
+ };
77
+ type ZpkRoot = number | Complex;
78
+ /**
79
+ * Group zeros/poles/gain into cascaded second-order sections:
80
+ * `[[b0,b1,b2,a0,a1,a2], …]`, each a monic-denominator biquad (`a0 = 1`) with
81
+ * the overall gain folded into the first section's numerator. `z` is
82
+ * zero-padded (roots at the origin) if shorter than `p`. Matches
83
+ * `scipy.signal.zpk2sos` in effect (the two decompositions can differ in
84
+ * pairing order, but the resulting cascaded transfer function is identical).
85
+ */
86
+ export declare function zpk2sos(z: readonly ZpkRoot[], p: readonly ZpkRoot[], k: number): number[][];
87
+ /**
88
+ * Apply a cascade of second-order sections (`[[b0,b1,b2,a0,a1,a2], …]`, as
89
+ * produced by `zpk2sos`) to `x`, each biquad in direct-form-II transposed.
90
+ * Matches `scipy.signal.sosfilt(sos, x)`.
91
+ */
92
+ export declare function sosfilt(sos: readonly (readonly number[])[], x: Vec): number[];
93
+ export {};
94
+ //# sourceMappingURL=iir-design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iir-design.d.ts","sourceRoot":"","sources":["../../src/signal/iir-design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AAKnC,KAAK,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAoB5C;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAC9B,KAAK,GAAE,WAAmB,GACzB;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAI9B;AAgCD;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAC9B,KAAK,GAAE,WAAmB,GACzB;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAI9B;AAkJD;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CACnB,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAC9B,KAAK,GAAE,WAAmB,GACzB;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAK9B;AA4BD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CA8BrF;AAID;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAc3B;AAID,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAoDhC;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAmB3F;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAS7E"}
@@ -0,0 +1,115 @@
1
+ /** Options for {@link findPeaks}. */
2
+ export interface FindPeaksOptions {
3
+ /** Minimum peak value to keep. */
4
+ height?: number;
5
+ /** Minimum index separation between kept peaks (greedily keeps the taller peak). */
6
+ distance?: number;
7
+ /** Minimum topographic prominence to keep (see {@link peakWidths} for the definition). */
8
+ prominence?: number;
9
+ }
10
+ /**
11
+ * Find strict local-maxima peak indices in `x` (`x[i-1] < x[i] > x[i+1]`), then
12
+ * optionally filter by minimum `height`, minimum index `distance` (greedily keeping
13
+ * the taller peak of any too-close pair), and/or minimum topographic `prominence` —
14
+ * `scipy.signal.find_peaks`.
15
+ *
16
+ * @param x - Input signal
17
+ * @param opts - `{ height?, distance?, prominence? }`
18
+ * @returns Ascending indices of the surviving peaks
19
+ */
20
+ export declare function findPeaks(x: readonly number[], opts?: FindPeaksOptions): number[];
21
+ /**
22
+ * Width (in samples) of each peak at `relHeight` down from the peak toward its
23
+ * topographic base (see {@link peakProminence}), with linearly-interpolated crossing
24
+ * points — `scipy.signal.peak_widths`.
25
+ *
26
+ * @param x - Input signal
27
+ * @param peaks - Peak indices (e.g. from {@link findPeaks})
28
+ * @param relHeight - Fraction of the prominence to descend (default 0.5, i.e. FWHM-style)
29
+ * @returns Width per peak, same order as `peaks`
30
+ */
31
+ export declare function peakWidths(x: readonly number[], peaks: readonly number[], relHeight?: number): number[];
32
+ /** Options shared by {@link csd} and {@link coherence}. */
33
+ export interface CsdOptions {
34
+ /** Segment length (default `min(256, x.length, y.length)`). */
35
+ nperseg?: number;
36
+ /** Samples of overlap between segments (default `floor(nperseg/2)`). */
37
+ noverlap?: number;
38
+ /** Window applied to each segment (default `'hann'`) — see {@link windowFunction}. */
39
+ window?: string;
40
+ /** Sample rate in Hz, used to scale frequencies and power (default 1). */
41
+ fs?: number;
42
+ }
43
+ /**
44
+ * Cross-spectral density of `x` and `y` via Welch's overlapped-segment-averaging
45
+ * method (segment, window, FFT, average `X·conj(Y)`) — `scipy.signal.csd`.
46
+ *
47
+ * @param x - First signal
48
+ * @param y - Second signal
49
+ * @param opts - `{ nperseg?, noverlap?, window?, fs? }`
50
+ * @returns `{ frequencies, power }` — `power` is the magnitude of the averaged
51
+ * cross spectrum at each frequency bin
52
+ */
53
+ export declare function csd(x: readonly number[], y: readonly number[], opts?: CsdOptions): {
54
+ frequencies: number[];
55
+ power: number[];
56
+ };
57
+ /**
58
+ * Magnitude-squared coherence between `x` and `y`: `|Pxy|² / (Pxx·Pyy)`, per Welch
59
+ * frequency bin — `scipy.signal.coherence`. Values lie in `[0, 1]`.
60
+ *
61
+ * @param x - First signal
62
+ * @param y - Second signal
63
+ * @param opts - `{ nperseg?, noverlap?, window?, fs? }`
64
+ * @returns `{ frequencies, coherence }`
65
+ */
66
+ export declare function coherence(x: readonly number[], y: readonly number[], opts?: CsdOptions): {
67
+ frequencies: number[];
68
+ coherence: number[];
69
+ };
70
+ /** Options for {@link stft} / {@link istft} — must match between the two calls. */
71
+ export interface StftOptions {
72
+ /** Frame length (default 256). */
73
+ nperseg?: number;
74
+ /** Samples of overlap between frames (default `floor(nperseg/2)`). */
75
+ noverlap?: number;
76
+ /** Window applied to each frame (default `'hann'`) — see {@link windowFunction}. */
77
+ window?: string;
78
+ }
79
+ /** `stft`'s output: one row per frame, one column per (non-redundant-truncated) frequency bin. */
80
+ export interface StftResult {
81
+ re: number[][];
82
+ im: number[][];
83
+ }
84
+ /**
85
+ * Short-time Fourier transform: windowed, overlapping frames, each FFT'd independently
86
+ * — `scipy.signal.stft` (magnitude/phase convention; frames are not scaled).
87
+ *
88
+ * @param x - Input signal
89
+ * @param opts - `{ nperseg?, noverlap?, window? }`
90
+ * @returns `{ re, im }`, each `number[frame][bin]`
91
+ */
92
+ export declare function stft(x: readonly number[], opts?: StftOptions): StftResult;
93
+ /**
94
+ * Inverse short-time Fourier transform via overlap-add: each frame is inverse-FFT'd
95
+ * back to `nperseg` samples, re-windowed, and accumulated; the accumulation is
96
+ * normalized by the running sum of squared window values (the standard
97
+ * constant-overlap-add / COLA normalization), so reconstruction is exact in the
98
+ * interior wherever the window's overlap sum is nonzero — `scipy.signal.istft`.
99
+ *
100
+ * @param S - `{ re, im }` as returned by {@link stft}
101
+ * @param opts - `{ nperseg?, noverlap?, window? }` — must match the `stft` call
102
+ * @returns Reconstructed signal
103
+ */
104
+ export declare function istft(S: StftResult, opts?: StftOptions): number[];
105
+ /**
106
+ * Downsample `x` by an integer factor `q`: apply a Butterworth anti-alias lowpass
107
+ * (order 4, cutoff `min(0.8/q, 0.99)` of Nyquist) with zero-phase `filtfilt`, then
108
+ * take every `q`-th sample — `scipy.signal.decimate` (IIR mode).
109
+ *
110
+ * @param x - Input signal
111
+ * @param q - Downsampling factor (positive integer)
112
+ * @returns Downsampled signal, length `ceil(x.length / q)`
113
+ */
114
+ export declare function decimate(x: readonly number[], q: number): number[];
115
+ //# sourceMappingURL=spectral-peaks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spectral-peaks.d.ts","sourceRoot":"","sources":["../../src/signal/spectral-peaks.ts"],"names":[],"mappings":"AAoBA,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2DD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAmBjF;AAyBD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,SAAM,GACd,MAAM,EAAE,CAQV;AAMD,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAgED;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CACjB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,IAAI,CAAC,EAAE,UAAU,GAChB;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAI5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,IAAI,CAAC,EAAE,UAAU,GAChB;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAahD;AAMD,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kGAAkG;AAClG,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IACf,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAoBzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,CA6BjE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAclE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Phase 6 Task 4 — inverse DWT, multilevel wavedec/waverec (perfect
3
+ * reconstruction), and the continuous wavelet transform (CWT).
4
+ *
5
+ * `idwt`/`wavedec`/`waverec` must invert the existing `dwt` (`../typed/signal.ts`)
6
+ * exactly, so they match its Haar convention bit-for-bit: analysis filters
7
+ * scaled by `s = 1/sqrt(2)`, `approx[i] = s*(x[2i]+x[2i+1])`,
8
+ * `detail[i] = s*(x[2i]-x[2i+1])`. Haar's synthesis (reconstruction) filters
9
+ * are the time-reverse of its analysis filters — for a symmetric 2-tap filter
10
+ * that reversal is a no-op, so the closed-form inverse below is exact:
11
+ * `x[2i] = s*(approx[i]+detail[i])`, `x[2i+1] = s*(approx[i]-detail[i])`.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ /**
16
+ * Inverse single-level discrete wavelet transform. Upsamples `approx`/`detail`
17
+ * and combines them with the Haar synthesis filters, exactly inverting `dwt`.
18
+ *
19
+ * @param approx - Approximation (low-pass) coefficients
20
+ * @param detail - Detail (high-pass) coefficients, same length as `approx`
21
+ * @param wavelet - Wavelet name (currently only 'haar'/'db1', matching `dwt`)
22
+ * @returns Reconstructed signal, length `2 * approx.length`
23
+ */
24
+ export declare function idwt(approx: number[], detail: number[], wavelet?: string): number[];
25
+ /**
26
+ * Multilevel discrete wavelet decomposition: repeatedly applies `dwt` to the
27
+ * approximation coefficients.
28
+ *
29
+ * @param x - Input signal
30
+ * @param wavelet - Wavelet name (passed through to `dwt`)
31
+ * @param level - Number of decomposition levels (>= 1)
32
+ * @returns `[cA_level, cD_level, cD_{level-1}, ..., cD_1]` (pywt order)
33
+ */
34
+ export declare function wavedec(x: number[], wavelet?: string, level?: number): number[][];
35
+ /**
36
+ * Inverse of `wavedec`: repeatedly applies `idwt` from the coarsest level
37
+ * (`coeffs[0]` = cA_level) up to the finest detail (`coeffs[coeffs.length-1]`
38
+ * = cD_1), reconstructing the original signal.
39
+ *
40
+ * @param coeffs - Coefficient arrays as returned by `wavedec`
41
+ * @param wavelet - Wavelet name (passed through to `idwt`)
42
+ * @returns Reconstructed signal
43
+ */
44
+ export declare function waverec(coeffs: number[][], wavelet?: string): number[];
45
+ /**
46
+ * Continuous wavelet transform: convolves `x` with a discretized, normalized
47
+ * wavelet at each requested scale.
48
+ *
49
+ * @param x - Input signal
50
+ * @param scales - Wavelet scales to evaluate (each > 0)
51
+ * @param wavelet - 'ricker' (Mexican-hat, default) or 'morlet'
52
+ * @returns `scales.length` x `x.length` matrix, row `i` = CWT at `scales[i]`
53
+ */
54
+ export declare function cwt(x: number[], scales: number[], wavelet?: string): number[][];
55
+ //# sourceMappingURL=wavelets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wavelets.d.ts","sourceRoot":"","sources":["../../src/signal/wavelets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAe,GAAG,MAAM,EAAE,CAgB3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAe,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM,EAAE,EAAE,CAc5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAE,MAAe,GAAG,MAAM,EAAE,CAU9E;AA2BD;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAiB,GAAG,MAAM,EAAE,EAAE,CAYzF"}
@@ -1,4 +1,12 @@
1
+ /**
2
+ * Digital filter design + application (Wave D / remaining). FIR window design
3
+ * (`firwin`), IIR Butterworth design (`butter`), the direct-form filter (`lfilter`),
4
+ * and zero-phase filtering (`filtfilt`). Matches `scipy.signal`. `butter` reuses the
5
+ * core `Complex` type for the analog-pole bilinear-transform pipeline.
6
+ */
7
+ import { Complex } from '@danielsimonjr/mathts-core';
1
8
  type Vec = readonly number[] | Float64Array;
9
+ export declare const sinc: (x: number) => number;
2
10
  /**
3
11
  * FIR lowpass filter coefficients by the windowed-sinc method (Hamming window,
4
12
  * normalized to unit DC gain) — `scipy.signal.firwin(numtaps, cutoff)` with the
@@ -22,12 +30,43 @@ export declare function lfilterZi(b: Vec, a: Vec): number[];
22
30
  * magnitude response is applied with no phase distortion.
23
31
  */
24
32
  export declare function filtfilt(b: Vec, a: Vec, x: Vec): number[];
33
+ export declare const cAdd: (p: Complex, q: Complex) => Complex;
34
+ export declare const cSub: (p: Complex, q: Complex) => Complex;
35
+ export declare const cMul: (p: Complex, q: Complex) => Complex;
36
+ export declare const cDiv: (p: Complex, q: Complex) => Complex;
37
+ /** Scale a Complex by a real number (`Complex.mul` only accepts `Scalar`, not `number`). */
38
+ export declare const cScale: (p: Complex, s: number) => Complex;
39
+ /** Real polynomial coefficients (highest degree first) of ∏(x − rₖ). */
40
+ export declare function polyFromRoots(roots: Complex[]): number[];
41
+ /** Analog lowpass prototype: zeros, poles, gain (cutoff normalized to 1 rad/s). */
42
+ export interface AnalogProto {
43
+ z: Complex[];
44
+ p: Complex[];
45
+ k: number;
46
+ }
47
+ export type FilterBtype = 'low' | 'high' | 'bandpass' | 'bandstop';
48
+ /** zpk → transfer-function coefficients (scipy `zpk2tf`). */
49
+ export declare function zpkToTf(z: Complex[], p: Complex[], k: number): {
50
+ b: number[];
51
+ a: number[];
52
+ };
53
+ /**
54
+ * Digital IIR filter design pipeline shared by butter/cheby1/cheby2/ellip:
55
+ * pre-warp `Wn` → frequency-transform the analog lowpass prototype (`proto`,
56
+ * cutoff normalized to 1 rad/s) to the requested `btype` → bilinear transform →
57
+ * zpk2tf. Matches `scipy.signal.iirfilter`'s internal pipeline (fs = 2 convention).
58
+ */
59
+ export declare function analogToDigital(proto: AnalogProto, Wn: number | readonly number[], btype: FilterBtype): {
60
+ b: number[];
61
+ a: number[];
62
+ };
25
63
  /**
26
64
  * Butterworth IIR filter design — returns `{ b, a }` transfer-function coefficients.
27
- * `N` is the order, `Wn` the cutoff normalized to Nyquist (0..1). Lowpass only
28
- * (`btype='low'`, the common case). Matches `scipy.signal.butter(N, Wn)`.
65
+ * `N` is the order, `Wn` the cutoff (scalar) or `[low, high]` band edges, normalized
66
+ * to Nyquist (0..1). `btype` defaults to `'low'` (matches the original 2-arg call
67
+ * unchanged). Matches `scipy.signal.butter(N, Wn, btype)`.
29
68
  */
30
- export declare function butter(N: number, Wn: number): {
69
+ export declare function butter(N: number, Wn: number | readonly number[], btype?: FilterBtype): {
31
70
  b: number[];
32
71
  a: number[];
33
72
  };
@@ -1 +1 @@
1
- {"version":3,"file":"signal-filter-extra.d.ts","sourceRoot":"","sources":["../src/signal-filter-extra.ts"],"names":[],"mappings":"AAYA,KAAK,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAK5C;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAahE;AAkCD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAqBlD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAqBzD;AAuBD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B1E"}
1
+ {"version":3,"file":"signal-filter-extra.d.ts","sourceRoot":"","sources":["../src/signal-filter-extra.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAMrD,KAAK,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAG5C,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAA+D,CAAC;AAEjG;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAahE;AAkCD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAuBlD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CA+BzD;AAMD,eAAO,MAAM,IAAI,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAAmB,CAAC;AAClE,eAAO,MAAM,IAAI,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAAmB,CAAC;AAClE,eAAO,MAAM,IAAI,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAAwB,CAAC;AACvE,eAAO,MAAM,IAAI,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAAsB,CAAC;AACrE,4FAA4F;AAC5F,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,EAAE,GAAG,MAAM,KAAG,OAAqC,CAAC;AAErF,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAWxD;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,OAAO,EAAE,CAAC;IACb,CAAC,EAAE,OAAO,EAAE,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAoFnE,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAE3F;AAgBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAC9B,KAAK,EAAE,WAAW,GACjB;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB9B;AAaD;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,EAC9B,KAAK,GAAE,WAAmB,GACzB;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAG9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielsimonjr/mathts-functions",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "Mathematical functions for MathTS - arithmetic, algebra, trigonometry, statistics, and more",
5
5
  "author": "Daniel Simon Jr.",
6
6
  "license": "MIT",