annotate src/app/spectrogram/MatrixUtils.ts @ 349:bf038a51f7e3

Restore some of the feature related logic from waveform.component into a utilities module. Introduce some additional types for representing reshaped features. A work in progress.
author Lucas Thompson <dev@lucas.im>
date Thu, 25 May 2017 17:57:03 +0100
parents 8bfd9586c78a
children
rev   line source
dev@343 1 /**
dev@343 2 * Created by lucast on 23/05/2017.
dev@343 3 */
dev@343 4
dev@343 5 export function estimatePercentile(matrix, percentile) {
dev@343 6 // our sample is not evenly distributed across the whole data set:
dev@343 7 // it is guaranteed to include at least one sample from every
dev@343 8 // column, and could sample some values more than once. But it
dev@343 9 // should be good enough in most cases (todo: show this)
dev@343 10 if (matrix.length === 0) {
dev@343 11 return 0.0;
dev@343 12 }
dev@343 13 const w = matrix.length;
dev@343 14 const h = matrix[0].length;
dev@343 15 const n = w * h;
dev@343 16 const m = (n > 50000 ? 50000 : n); // should base that on the %ile
dev@343 17 let m_per = Math.floor(m / w);
dev@343 18 if (m_per < 1) {
dev@343 19 m_per = 1;
dev@343 20 }
dev@343 21
dev@343 22 const sample = [];
dev@343 23 for (let x = 0; x < w; ++x) {
dev@343 24 for (let i = 0; i < m_per; ++i) {
dev@343 25 const y = Math.floor(Math.random() * h);
dev@343 26 const value = matrix[x][y];
dev@343 27 if (!isNaN(value) && value !== Infinity) {
dev@343 28 sample.push(value);
dev@343 29 }
dev@343 30 }
dev@343 31 }
dev@343 32 if (sample.length === 0) {
dev@343 33 return 0.0;
dev@343 34 }
dev@343 35 sample.sort((a, b) => { return a - b; });
dev@343 36 const ix = Math.floor((sample.length * percentile) / 100);
dev@343 37 const estimate = sample[ix];
dev@343 38 return estimate;
dev@343 39 }