dsp-collection 0.2.5 → 0.2.6

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 (62) hide show
  1. package/README.md +5 -2
  2. package/filter/SpecFilt.d.ts +10 -10
  3. package/filter/SpecFilt.js +98 -99
  4. package/math/Complex.d.ts +42 -42
  5. package/math/Complex.js +130 -130
  6. package/math/ComplexArray.d.ts +36 -36
  7. package/math/ComplexArray.js +170 -171
  8. package/math/MathUtils.d.ts +9 -7
  9. package/math/MathUtils.js +116 -82
  10. package/math/MutableComplex.d.ts +22 -22
  11. package/math/MutableComplex.js +64 -65
  12. package/math/NumApprox.d.ts +3 -3
  13. package/math/NumApprox.js +67 -68
  14. package/math/PolyReal.d.ts +13 -13
  15. package/math/PolyReal.js +226 -227
  16. package/package.json +11 -3
  17. package/signal/AdaptiveStft.d.ts +12 -12
  18. package/signal/AdaptiveStft.js +57 -58
  19. package/signal/Autocorrelation.d.ts +5 -5
  20. package/signal/Autocorrelation.js +53 -54
  21. package/signal/Dft.d.ts +9 -9
  22. package/signal/Dft.js +87 -88
  23. package/signal/EnvelopeDetection.d.ts +1 -1
  24. package/signal/EnvelopeDetection.js +9 -10
  25. package/signal/Fft.d.ts +9 -9
  26. package/signal/Fft.js +275 -276
  27. package/signal/Goertzel.d.ts +5 -5
  28. package/signal/Goertzel.js +48 -49
  29. package/signal/InstFreq.d.ts +8 -8
  30. package/signal/InstFreq.js +26 -27
  31. package/signal/PitchDetectionHarm.d.ts +26 -26
  32. package/signal/PitchDetectionHarm.js +68 -69
  33. package/signal/Resampling.d.ts +7 -7
  34. package/signal/Resampling.js +218 -219
  35. package/signal/WindowFunctions.d.ts +40 -40
  36. package/signal/WindowFunctions.js +194 -195
  37. package/utils/ArrayUtils.d.ts +9 -9
  38. package/utils/ArrayUtils.js +68 -69
  39. package/utils/DspUtils.d.ts +4 -2
  40. package/utils/DspUtils.js +12 -7
  41. package/utils/MiscUtils.d.ts +6 -6
  42. package/utils/MiscUtils.js +20 -21
  43. package/filter/SpecFilt.js.map +0 -1
  44. package/math/Complex.js.map +0 -1
  45. package/math/ComplexArray.js.map +0 -1
  46. package/math/MathUtils.js.map +0 -1
  47. package/math/MutableComplex.js.map +0 -1
  48. package/math/NumApprox.js.map +0 -1
  49. package/math/PolyReal.js.map +0 -1
  50. package/signal/AdaptiveStft.js.map +0 -1
  51. package/signal/Autocorrelation.js.map +0 -1
  52. package/signal/Dft.js.map +0 -1
  53. package/signal/EnvelopeDetection.js.map +0 -1
  54. package/signal/Fft.js.map +0 -1
  55. package/signal/Goertzel.js.map +0 -1
  56. package/signal/InstFreq.js.map +0 -1
  57. package/signal/PitchDetectionHarm.js.map +0 -1
  58. package/signal/Resampling.js.map +0 -1
  59. package/signal/WindowFunctions.js.map +0 -1
  60. package/utils/ArrayUtils.js.map +0 -1
  61. package/utils/DspUtils.js.map +0 -1
  62. package/utils/MiscUtils.js.map +0 -1
@@ -1,54 +1,53 @@
1
- import * as WindowFunctions from "./WindowFunctions.js";
2
- import * as ArrayUtils from "../utils/ArrayUtils.js";
3
- function autocorrelationKernel(x, distance, n) {
4
- let sum = 0;
5
- for (let i = 0; i < n; i++) {
6
- sum += x[i] * x[i + distance];
7
- }
8
- return sum;
9
- }
10
- export function nonPeriodicAutocorrelationSingle(x, distance, compensate) {
11
- const n = x.length - distance;
12
- let sum = autocorrelationKernel(x, distance, n);
13
- if (compensate && n > 0) {
14
- sum *= x.length / n;
15
- }
16
- return sum;
17
- }
18
- export function findNonPeriodicAutocorrelationMaximum(x, minDistance, maxDistance, fixedOverlapWidth) {
19
- let maxVal = -Infinity;
20
- let maxPos = minDistance;
21
- for (let distance = minDistance; distance < maxDistance; distance++) {
22
- const val = fixedOverlapWidth ?
23
- autocorrelationKernel(x, distance, x.length - maxDistance) :
24
- nonPeriodicAutocorrelationSingle(x, distance, true);
25
- if (val > maxVal) {
26
- maxVal = val;
27
- maxPos = distance;
28
- }
29
- }
30
- return maxPos;
31
- }
32
- export function nonPeriodicAutocorrelation(x, normalize) {
33
- const n = x.length;
34
- const r = new Float64Array(n);
35
- for (let distance = 0; distance < n; distance++) {
36
- r[distance] = nonPeriodicAutocorrelationSingle(x, distance, true);
37
- }
38
- if (normalize && n > 0 && r[0] != 0) {
39
- const max = r[0];
40
- for (let distance = 0; distance < n; distance++) {
41
- r[distance] /= max;
42
- }
43
- }
44
- return r;
45
- }
46
- export function windowedNonPeriodicAutocorrelation(x, windowFunction, normalize) {
47
- const windowed = WindowFunctions.applyWindow(x, windowFunction);
48
- const autoCorr = nonPeriodicAutocorrelation(windowed, normalize);
49
- const window = WindowFunctions.getWindowTable(windowFunction, x.length);
50
- const windowAutoCorr = nonPeriodicAutocorrelation(window, true);
51
- const compensated = ArrayUtils.divide(autoCorr, windowAutoCorr);
52
- return compensated;
53
- }
54
- //# sourceMappingURL=Autocorrelation.js.map
1
+ import * as WindowFunctions from "./WindowFunctions.js";
2
+ import * as ArrayUtils from "../utils/ArrayUtils.js";
3
+ function autocorrelationKernel(x, distance, n) {
4
+ let sum = 0;
5
+ for (let i = 0; i < n; i++) {
6
+ sum += x[i] * x[i + distance];
7
+ }
8
+ return sum;
9
+ }
10
+ export function nonPeriodicAutocorrelationSingle(x, distance, compensate) {
11
+ const n = x.length - distance;
12
+ let sum = autocorrelationKernel(x, distance, n);
13
+ if (compensate && n > 0) {
14
+ sum *= x.length / n;
15
+ }
16
+ return sum;
17
+ }
18
+ export function findNonPeriodicAutocorrelationMaximum(x, minDistance, maxDistance, fixedOverlapWidth) {
19
+ let maxVal = -Infinity;
20
+ let maxPos = minDistance;
21
+ for (let distance = minDistance; distance < maxDistance; distance++) {
22
+ const val = fixedOverlapWidth ?
23
+ autocorrelationKernel(x, distance, x.length - maxDistance) :
24
+ nonPeriodicAutocorrelationSingle(x, distance, true);
25
+ if (val > maxVal) {
26
+ maxVal = val;
27
+ maxPos = distance;
28
+ }
29
+ }
30
+ return maxPos;
31
+ }
32
+ export function nonPeriodicAutocorrelation(x, normalize) {
33
+ const n = x.length;
34
+ const r = new Float64Array(n);
35
+ for (let distance = 0; distance < n; distance++) {
36
+ r[distance] = nonPeriodicAutocorrelationSingle(x, distance, true);
37
+ }
38
+ if (normalize && n > 0 && r[0] != 0) {
39
+ const max = r[0];
40
+ for (let distance = 0; distance < n; distance++) {
41
+ r[distance] /= max;
42
+ }
43
+ }
44
+ return r;
45
+ }
46
+ export function windowedNonPeriodicAutocorrelation(x, windowFunction, normalize) {
47
+ const windowed = WindowFunctions.applyWindow(x, windowFunction);
48
+ const autoCorr = nonPeriodicAutocorrelation(windowed, normalize);
49
+ const window = WindowFunctions.getWindowTable(windowFunction, x.length);
50
+ const windowAutoCorr = nonPeriodicAutocorrelation(window, true);
51
+ const compensated = ArrayUtils.divide(autoCorr, windowAutoCorr);
52
+ return compensated;
53
+ }
package/signal/Dft.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import MutableComplex from "../math/MutableComplex.js";
2
- import ComplexArray from "../math/ComplexArray.js";
3
- export declare function dftRealSingle(x: ArrayLike<number>, relativeFrequency: number): MutableComplex;
4
- export declare function dftSingle(x: ComplexArray, relativeFrequency: number, direction: boolean): MutableComplex;
5
- export declare function dftReal(x: ArrayLike<number>): ComplexArray;
6
- export declare function dftRealHalf(x: ArrayLike<number>): ComplexArray;
7
- export declare function dft(x: ComplexArray, direction: boolean): ComplexArray;
8
- export declare function dftRealSpectrum(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
9
- export declare function iDftRealSpectrum(x: ComplexArray, len: number): Float64Array;
1
+ import MutableComplex from "../math/MutableComplex.ts";
2
+ import ComplexArray from "../math/ComplexArray.ts";
3
+ export declare function dftRealSingle(x: ArrayLike<number>, relativeFrequency: number): MutableComplex;
4
+ export declare function dftSingle(x: ComplexArray, relativeFrequency: number, direction: boolean): MutableComplex;
5
+ export declare function dftReal(x: ArrayLike<number>): ComplexArray;
6
+ export declare function dftRealHalf(x: ArrayLike<number>): ComplexArray;
7
+ export declare function dft(x: ComplexArray, direction: boolean): ComplexArray;
8
+ export declare function dftRealSpectrum(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
9
+ export declare function iDftRealSpectrum(x: ComplexArray, len: number): Float64Array;
package/signal/Dft.js CHANGED
@@ -1,88 +1,87 @@
1
- import Complex from "../math/Complex.js";
2
- import MutableComplex from "../math/MutableComplex.js";
3
- import ComplexArray from "../math/ComplexArray.js";
4
- export function dftRealSingle(x, relativeFrequency) {
5
- const n = x.length;
6
- if (n == 0) {
7
- throw new Error("Input array must not be empty.");
8
- }
9
- const w = -2 * Math.PI / n * relativeFrequency;
10
- const acc = new MutableComplex(0, 0);
11
- for (let p = 0; p < n; p++) {
12
- const c = Complex.fromPolar(x[p], w * p);
13
- acc.addTo(c);
14
- }
15
- return acc;
16
- }
17
- export function dftSingle(x, relativeFrequency, direction) {
18
- const n = x.length;
19
- if (n == 0) {
20
- throw new Error("Input array must not be empty.");
21
- }
22
- const w = (direction ? -1 : 1) * 2 * Math.PI / n * relativeFrequency;
23
- const acc = new MutableComplex(0, 0);
24
- for (let p = 0; p < n; p++) {
25
- const c = MutableComplex.fromPolar(1, w * p);
26
- c.mulBy(x.get(p));
27
- acc.addTo(c);
28
- }
29
- return acc;
30
- }
31
- export function dftReal(x) {
32
- const n = x.length;
33
- const a = new ComplexArray(n);
34
- for (let frequency = 0; frequency < n; frequency++) {
35
- const c = dftRealSingle(x, frequency);
36
- a.set(frequency, c);
37
- }
38
- return a;
39
- }
40
- export function dftRealHalf(x) {
41
- const n = Math.ceil(x.length / 2);
42
- const a = new ComplexArray(n);
43
- for (let frequency = 0; frequency < n; frequency++) {
44
- const c = dftRealSingle(x, frequency);
45
- a.set(frequency, c);
46
- }
47
- return a;
48
- }
49
- export function dft(x, direction) {
50
- const n = x.length;
51
- const a = new ComplexArray(n);
52
- for (let frequency = 0; frequency < n; frequency++) {
53
- const c = dftSingle(x, frequency, direction);
54
- a.set(frequency, c);
55
- }
56
- return a;
57
- }
58
- export function dftRealSpectrum(x, inclNyquist = false) {
59
- const n = x.length;
60
- if (n == 0) {
61
- throw new Error("Input array must not be empty.");
62
- }
63
- const m = (n % 2 == 0 && inclNyquist) ? n / 2 + 1 : Math.ceil(n / 2);
64
- const a = new ComplexArray(m);
65
- for (let frequency = 0; frequency < m; frequency++) {
66
- const c = dftRealSingle(x, frequency);
67
- const r = (frequency == 0 || frequency == n / 2) ? 1 / n : 2 / n;
68
- c.mulByReal(r);
69
- a.set(frequency, c);
70
- }
71
- return a;
72
- }
73
- export function iDftRealSpectrum(x, len) {
74
- const a = new Float64Array(len);
75
- for (let frequency = 0; frequency < x.length; frequency++) {
76
- const c = x.get(frequency);
77
- synthesizeSinusoidal(a, frequency, c.abs(), c.arg());
78
- }
79
- return a;
80
- }
81
- function synthesizeSinusoidal(a, frequency, amplitude, phase) {
82
- const n = a.length;
83
- const w = frequency * 2 * Math.PI / n;
84
- for (let p = 0; p < n; p++) {
85
- a[p] += amplitude * Math.cos(phase + w * p);
86
- }
87
- }
88
- //# sourceMappingURL=Dft.js.map
1
+ import Complex from "../math/Complex.js";
2
+ import MutableComplex from "../math/MutableComplex.js";
3
+ import ComplexArray from "../math/ComplexArray.js";
4
+ export function dftRealSingle(x, relativeFrequency) {
5
+ const n = x.length;
6
+ if (n == 0) {
7
+ throw new Error("Input array must not be empty.");
8
+ }
9
+ const w = -2 * Math.PI / n * relativeFrequency;
10
+ const acc = new MutableComplex(0, 0);
11
+ for (let p = 0; p < n; p++) {
12
+ const c = Complex.fromPolar(x[p], w * p);
13
+ acc.addTo(c);
14
+ }
15
+ return acc;
16
+ }
17
+ export function dftSingle(x, relativeFrequency, direction) {
18
+ const n = x.length;
19
+ if (n == 0) {
20
+ throw new Error("Input array must not be empty.");
21
+ }
22
+ const w = (direction ? -1 : 1) * 2 * Math.PI / n * relativeFrequency;
23
+ const acc = new MutableComplex(0, 0);
24
+ for (let p = 0; p < n; p++) {
25
+ const c = MutableComplex.fromPolar(1, w * p);
26
+ c.mulBy(x.get(p));
27
+ acc.addTo(c);
28
+ }
29
+ return acc;
30
+ }
31
+ export function dftReal(x) {
32
+ const n = x.length;
33
+ const a = new ComplexArray(n);
34
+ for (let frequency = 0; frequency < n; frequency++) {
35
+ const c = dftRealSingle(x, frequency);
36
+ a.set(frequency, c);
37
+ }
38
+ return a;
39
+ }
40
+ export function dftRealHalf(x) {
41
+ const n = Math.ceil(x.length / 2);
42
+ const a = new ComplexArray(n);
43
+ for (let frequency = 0; frequency < n; frequency++) {
44
+ const c = dftRealSingle(x, frequency);
45
+ a.set(frequency, c);
46
+ }
47
+ return a;
48
+ }
49
+ export function dft(x, direction) {
50
+ const n = x.length;
51
+ const a = new ComplexArray(n);
52
+ for (let frequency = 0; frequency < n; frequency++) {
53
+ const c = dftSingle(x, frequency, direction);
54
+ a.set(frequency, c);
55
+ }
56
+ return a;
57
+ }
58
+ export function dftRealSpectrum(x, inclNyquist = false) {
59
+ const n = x.length;
60
+ if (n == 0) {
61
+ throw new Error("Input array must not be empty.");
62
+ }
63
+ const m = (n % 2 == 0 && inclNyquist) ? n / 2 + 1 : Math.ceil(n / 2);
64
+ const a = new ComplexArray(m);
65
+ for (let frequency = 0; frequency < m; frequency++) {
66
+ const c = dftRealSingle(x, frequency);
67
+ const r = (frequency == 0 || frequency == n / 2) ? 1 / n : 2 / n;
68
+ c.mulByReal(r);
69
+ a.set(frequency, c);
70
+ }
71
+ return a;
72
+ }
73
+ export function iDftRealSpectrum(x, len) {
74
+ const a = new Float64Array(len);
75
+ for (let frequency = 0; frequency < x.length; frequency++) {
76
+ const c = x.get(frequency);
77
+ synthesizeSinusoidal(a, frequency, c.abs(), c.arg());
78
+ }
79
+ return a;
80
+ }
81
+ function synthesizeSinusoidal(a, frequency, amplitude, phase) {
82
+ const n = a.length;
83
+ const w = frequency * 2 * Math.PI / n;
84
+ for (let p = 0; p < n; p++) {
85
+ a[p] += amplitude * Math.cos(phase + w * p);
86
+ }
87
+ }
@@ -1 +1 @@
1
- export declare function generateSignalEnvelope(signal: ArrayLike<number>, windowWidthDc: number, windowWidthEnvelope: number): Float64Array;
1
+ export declare function generateSignalEnvelope(signal: ArrayLike<number>, windowWidthDc: number, windowWidthEnvelope: number): Float64Array;
@@ -1,10 +1,9 @@
1
- import * as MathUtils from "../math/MathUtils.js";
2
- export function generateSignalEnvelope(signal, windowWidthDc, windowWidthEnvelope) {
3
- const a1 = MathUtils.movingAverage(signal, windowWidthDc);
4
- for (let i = 0; i < a1.length; i++) {
5
- a1[i] = Math.abs(signal[i] - a1[i]);
6
- }
7
- const a2 = MathUtils.movingAverage(a1, windowWidthEnvelope);
8
- return a2;
9
- }
10
- //# sourceMappingURL=EnvelopeDetection.js.map
1
+ import * as MathUtils from "../math/MathUtils.js";
2
+ export function generateSignalEnvelope(signal, windowWidthDc, windowWidthEnvelope) {
3
+ const a1 = MathUtils.simpleMovingAverage(signal, windowWidthDc);
4
+ for (let i = 0; i < a1.length; i++) {
5
+ a1[i] = Math.abs(signal[i] - a1[i]);
6
+ }
7
+ const a2 = MathUtils.simpleMovingAverage(a1, windowWidthEnvelope);
8
+ return a2;
9
+ }
package/signal/Fft.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import ComplexArray from "../math/ComplexArray.js";
2
- export declare function fft(x: ComplexArray, direction?: boolean): ComplexArray;
3
- export declare function fftReal(x: ArrayLike<number>): ComplexArray;
4
- export declare function fftRealHalf(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
5
- export declare function fftRealSpectrum(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
6
- export declare function fftShift(x: ComplexArray): ComplexArray;
7
- export declare function iFftRealHalfSimple(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;
8
- export declare function iFftRealHalfOpt(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;
9
- export declare function iFftRealHalf(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;
1
+ import ComplexArray from "../math/ComplexArray.ts";
2
+ export declare function fft(x: ComplexArray, direction?: boolean): ComplexArray;
3
+ export declare function fftReal(x: ArrayLike<number>): ComplexArray;
4
+ export declare function fftRealHalf(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
5
+ export declare function fftRealSpectrum(x: ArrayLike<number>, inclNyquist?: boolean): ComplexArray;
6
+ export declare function fftShift(x: ComplexArray): ComplexArray;
7
+ export declare function iFftRealHalfSimple(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;
8
+ export declare function iFftRealHalfOpt(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;
9
+ export declare function iFftRealHalf(x: ComplexArray, len: number, inclNyquist?: boolean): Float64Array;