/
rollingMedian.js
33 lines (30 loc) · 1.06 KB
/
rollingMedian.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { xRollingMedian } from 'ml-spectra-processing';
/**
*
* @export
* @param {Array<number>} ys
* @param {Object} [options={}]
* @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum
* @param {string} [options.padding.size=window-1] none, value, circular, duplicate
* @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate
* @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')
* @returns {BaselineOutput}
*/
export function rollingMedianBaseline(ys, options = {}) {
let window = Math.max(Math.round(ys.length * 0.1), 2);
let defaults = {
window,
padding: {
size: window - 1,
algorithm: 'duplicate',
value: 0,
},
};
let actualOptions = { ...defaults, ...options };
let baseline = xRollingMedian(ys, actualOptions);
let corrected = new Float64Array(ys.length);
for (let i = 0; i < corrected.length; i++) {
corrected[i] = ys[i] - baseline[i];
}
return { baseline, correctedSpectrum: corrected };
}