velo-plot 2.20.0 → 3.1.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.
- package/README.md +26 -12
- package/dist/ChartCore-AnR_3Xkb.js +7338 -0
- package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
- package/dist/{index.core-COREBDNq.js → PluginRegistry-CzMHebYP.js} +24 -38
- package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
- package/dist/a11y-Bw6urYpr.js +105 -0
- package/dist/a11y-Bw6urYpr.js.map +1 -0
- package/dist/angular/hooks-entry.d.ts +1 -0
- package/dist/angular/hooks.d.ts +26 -0
- package/dist/angular/index.d.ts +8 -0
- package/dist/angular/velo-plot.component.d.ts +46 -0
- package/dist/angular-hooks.d.ts +1 -0
- package/dist/angular-hooks.js +9 -0
- package/dist/angular-hooks.js.map +1 -0
- package/dist/angular.d.ts +1 -0
- package/dist/angular.js +166 -0
- package/dist/angular.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
- package/dist/astro/StackedPlot.astro +19 -0
- package/dist/astro/VeloPlot.astro +23 -0
- package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
- package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
- package/dist/bindings/shared/a11y.d.ts +26 -0
- package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
- package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
- package/dist/bindings/shared/dimensions.d.ts +1 -0
- package/dist/bindings/shared/index.d.ts +9 -0
- package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
- package/dist/bindings/shared/optionsSync.d.ts +7 -0
- package/dist/bindings/shared/seriesDiff.d.ts +8 -0
- package/dist/bindings/shared/stackedSync.d.ts +9 -0
- package/dist/bindings/shared/types.d.ts +46 -0
- package/dist/bindings/test-utils/index.d.ts +35 -0
- package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
- package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
- package/dist/chartSyncBridge-D_rCtbFq.js +58 -0
- package/dist/chartSyncBridge-D_rCtbFq.js.map +1 -0
- package/dist/core/Chart.d.ts +1 -1
- package/dist/core/ChartStatistics.d.ts +1 -1
- package/dist/core/InteractionManager.d.ts +7 -1
- package/dist/core/OverlayRenderer.d.ts +5 -0
- package/dist/core/annotations/types.d.ts +1 -1
- package/dist/core/chart/ChartCore.d.ts +14 -19
- package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
- package/dist/core/chart/chartExportPatch.d.ts +2 -0
- package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
- package/dist/core/chart/series/SeriesActions.d.ts +1 -0
- package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
- package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
- package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
- package/dist/core/chart/types.d.ts +1 -1
- package/dist/core/clipboard/index.d.ts +1 -1
- package/dist/core/debug/index.d.ts +1 -1
- package/dist/core/keybindings/index.d.ts +1 -1
- package/dist/core/loading/index.d.ts +1 -1
- package/dist/core/locale/index.d.ts +1 -1
- package/dist/core/stacked/paneResize.d.ts +3 -0
- package/dist/core/stacked/types.d.ts +10 -0
- package/dist/core/theme-editor/index.d.ts +1 -1
- package/dist/createStackedChart-DqcLCFGS.js +1338 -0
- package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
- package/dist/examples/PluginDemonstration.d.ts +1 -1
- package/dist/hooks-DH-3bewj.js +69 -0
- package/dist/hooks-DH-3bewj.js.map +1 -0
- package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
- package/dist/index-0InEyj0q.js.map +1 -0
- package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
- package/dist/index-B7PTX94B.js.map +1 -0
- package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
- package/dist/index-BgrvqltV.js.map +1 -0
- package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
- package/dist/index-CWxIHdwX.js.map +1 -0
- package/dist/index-CaXWSOTk.js.map +1 -1
- package/dist/{mockDatafeed-927foCM4.js → index-Cv6ZDLWf.js} +227 -217
- package/dist/index-Cv6ZDLWf.js.map +1 -0
- package/dist/index-Dag88bW4.js.map +1 -1
- package/dist/index-qhscKTDy.js.map +1 -1
- package/dist/index.core.d.ts +9 -7
- package/dist/index.d.ts +2 -15
- package/dist/indicators--eJGmVox.js.map +1 -1
- package/dist/optionsSync-QUiN4Inw.js +119 -0
- package/dist/optionsSync-QUiN4Inw.js.map +1 -0
- package/dist/plugins/3d/index.d.ts +2 -2
- package/dist/plugins/3d.d.ts +2 -2
- package/dist/plugins/3d.js +3 -1
- package/dist/plugins/3d.js.map +1 -1
- package/dist/plugins/analysis/index.d.ts +1 -1
- package/dist/plugins/analysis/indicators.d.ts +1 -1
- package/dist/plugins/analysis.d.ts +2 -2
- package/dist/plugins/analysis.js +2 -2
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/annotations/index.d.ts +1 -1
- package/dist/plugins/annotations.d.ts +2 -2
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/anomaly-detection.js +1 -1
- package/dist/plugins/anomaly-detection.js.map +1 -1
- package/dist/plugins/broken-axis.d.ts +2 -2
- package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
- package/dist/plugins/builtins/index.d.ts +1 -1
- package/dist/plugins/caching.d.ts +2 -2
- package/dist/plugins/clipboard/index.d.ts +2 -2
- package/dist/plugins/clipboard.d.ts +2 -2
- package/dist/plugins/clipboard.js.map +1 -1
- package/dist/plugins/context-menu/index.d.ts +1 -1
- package/dist/plugins/context-menu.d.ts +2 -2
- package/dist/plugins/context-menu.js +1 -1
- package/dist/plugins/context-menu.js.map +1 -1
- package/dist/plugins/createPlugin.d.ts +8 -0
- package/dist/plugins/data-export/index.d.ts +1 -1
- package/dist/plugins/data-export.d.ts +2 -2
- package/dist/plugins/data-export.js +2 -2
- package/dist/plugins/data-export.js.map +1 -1
- package/dist/plugins/data-transform.d.ts +2 -2
- package/dist/plugins/data-transform.js +19 -19
- package/dist/plugins/data-transform.js.map +1 -1
- package/dist/plugins/debug/index.d.ts +2 -2
- package/dist/plugins/debug.d.ts +2 -2
- package/dist/plugins/debug.js +33 -33
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/forecasting/index.d.ts +1 -1
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/gpu/index.d.ts +2 -2
- package/dist/plugins/gpu.d.ts +2 -2
- package/dist/plugins/gpu.js +2033 -209
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/i18n/index.d.ts +2 -2
- package/dist/plugins/i18n.d.ts +2 -2
- package/dist/plugins/i18n.js +286 -23
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/keyboard.d.ts +2 -2
- package/dist/plugins/keyboard.js +65 -5
- package/dist/plugins/keyboard.js.map +1 -1
- package/dist/plugins/latex.js +766 -207
- package/dist/plugins/latex.js.map +1 -1
- package/dist/plugins/lazy-load.d.ts +2 -2
- package/dist/plugins/loading/index.d.ts +2 -3
- package/dist/plugins/loading.d.ts +2 -2
- package/dist/plugins/loading.js +3 -4
- package/dist/plugins/ml-integration.d.ts +2 -2
- package/dist/plugins/ml-integration.js +5 -5
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/offscreen.d.ts +2 -2
- package/dist/plugins/offscreen.js +11 -10
- package/dist/plugins/offscreen.js.map +1 -1
- package/dist/plugins/pattern-recognition.d.ts +2 -2
- package/dist/plugins/pattern-recognition.js +1 -1
- package/dist/plugins/pattern-recognition.js.map +1 -1
- package/dist/plugins/radar.d.ts +2 -2
- package/dist/plugins/regression.d.ts +2 -2
- package/dist/plugins/regression.js +255 -257
- package/dist/plugins/regression.js.map +1 -1
- package/dist/plugins/roi.js +9 -9
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot/index.d.ts +1 -1
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +2 -2
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/streaming/index.d.ts +2 -2
- package/dist/plugins/streaming.d.ts +2 -2
- package/dist/plugins/streaming.js +1 -1
- package/dist/plugins/sync/index.d.ts +3 -2
- package/dist/plugins/sync.d.ts +2 -2
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/theme-editor/index.d.ts +1 -1
- package/dist/plugins/theme-editor.d.ts +2 -2
- package/dist/plugins/tools/index.d.ts +1 -1
- package/dist/plugins/tools/tooltip/index.d.ts +1 -1
- package/dist/plugins/tools.d.ts +2 -2
- package/dist/plugins/tools.js +1 -1
- package/dist/plugins/types.d.ts +1 -1
- package/dist/plugins/video-recorder.d.ts +2 -2
- package/dist/plugins/virtualization.d.ts +2 -2
- package/dist/plugins/virtualization.js +1 -1
- package/dist/pool-DZ8shSqv.js +109 -0
- package/dist/pool-DZ8shSqv.js.map +1 -0
- package/dist/react/StackedPlot.d.ts +31 -0
- package/dist/react/VeloPlot.d.ts +29 -0
- package/dist/react/index.d.ts +25 -3
- package/dist/react/useChartSync.d.ts +8 -0
- package/dist/react/useIndicator.d.ts +12 -0
- package/dist/react/useVeloPlot.d.ts +19 -0
- package/dist/react.js +325 -24
- package/dist/react.js.map +1 -1
- package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
- package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
- package/dist/renderer/native/draw.d.ts +2 -47
- package/dist/renderer/native/drawCore.d.ts +27 -0
- package/dist/renderer/native/drawExtended.d.ts +29 -0
- package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
- package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
- package/dist/renderer/native/programFactoryCore.d.ts +6 -0
- package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
- package/dist/renderer/native/utils.d.ts +3 -29
- package/dist/renderer/native/utilsCore.d.ts +14 -0
- package/dist/renderer/native/utilsExtended.d.ts +17 -0
- package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
- package/dist/renderer/registerExtendedSeries.d.ts +1 -0
- package/dist/renderer/registerWebGPU.d.ts +2 -0
- package/dist/renderer/seriesBufferExtended.d.ts +4 -0
- package/dist/scientific/index.d.ts +44 -0
- package/dist/scientific/registerScientific.d.ts +1 -0
- package/dist/scientific.d.ts +1 -0
- package/dist/scientific.js +91 -0
- package/dist/scientific.js.map +1 -0
- package/dist/solid/VeloPlot.d.ts +16 -0
- package/dist/solid/index.d.ts +13 -0
- package/dist/solid/useChartSync.d.ts +6 -0
- package/dist/solid/useIndicator.d.ts +11 -0
- package/dist/solid/useStackedPlot.d.ts +14 -0
- package/dist/solid/useVeloPlot.d.ts +18 -0
- package/dist/solid.d.ts +1 -0
- package/dist/solid.js +169 -0
- package/dist/solid.js.map +1 -0
- package/dist/stackedSync-tnrunZMt.js +100 -0
- package/dist/stackedSync-tnrunZMt.js.map +1 -0
- package/dist/svelte/StackedPlot.svelte +29 -0
- package/dist/svelte/StackedPlot.test.ts +114 -0
- package/dist/svelte/VeloPlot.svelte +44 -0
- package/dist/svelte/VeloPlot.test.ts +105 -0
- package/dist/svelte/index.d.ts +11 -0
- package/dist/svelte/index.test.ts +20 -0
- package/dist/svelte/index.ts +15 -0
- package/dist/svelte/useChartSync.d.ts +8 -0
- package/dist/svelte/useChartSync.test.ts +49 -0
- package/dist/svelte/useChartSync.ts +29 -0
- package/dist/svelte/useIndicator.d.ts +13 -0
- package/dist/svelte/useIndicator.test.ts +67 -0
- package/dist/svelte/useIndicator.ts +43 -0
- package/dist/svelte/useStackedPlot.d.ts +16 -0
- package/dist/svelte/useStackedPlot.test.ts +76 -0
- package/dist/svelte/useStackedPlot.ts +54 -0
- package/dist/svelte/useVeloPlot.d.ts +21 -0
- package/dist/svelte/useVeloPlot.test.ts +100 -0
- package/dist/svelte/useVeloPlot.ts +81 -0
- package/dist/svelte.d.ts +1 -0
- package/dist/svelte.js +140 -0
- package/dist/svelte.js.map +1 -0
- package/dist/testing/index.d.ts +1 -1
- package/dist/theme/index.d.ts +2 -1
- package/dist/trading/index.d.ts +1 -4
- package/dist/trading/registerTrading.d.ts +3 -0
- package/dist/trading.js +42 -42
- package/dist/types.d.ts +4 -4
- package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
- package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
- package/dist/velo-plot.full.js +2216 -1346
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +33 -28
- package/dist/velo-plot.js.map +1 -1
- package/dist/vue/StackedPlot.vue.d.ts +48 -0
- package/dist/vue/VeloPlot.vue.d.ts +64 -0
- package/dist/vue/index.d.ts +250 -0
- package/dist/vue/useChartSync.d.ts +52 -0
- package/dist/vue/useIndicator.d.ts +23 -0
- package/dist/vue/useStackedPlot.d.ts +15 -0
- package/dist/vue/useVeloPlot.d.ts +20 -0
- package/dist/vue.d.ts +1 -0
- package/dist/vue.js +309 -0
- package/dist/vue.js.map +1 -0
- package/dist/workers/indicatorsAsync.d.ts +2 -0
- package/dist/workers/pool.d.ts +9 -0
- package/package.json +96 -10
- package/dist/ChartCore-ivzLqxVb.js +0 -8350
- package/dist/ChartCore-ivzLqxVb.js.map +0 -1
- package/dist/SciPlot-CEU4ApgD.js +0 -463
- package/dist/SciPlot-CEU4ApgD.js.map +0 -1
- package/dist/createStackedChart-DxNW0VkF.js +0 -705
- package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
- package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
- package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
- package/dist/index-BBpJwOct.js.map +0 -1
- package/dist/index-BMiZoKmm.js.map +0 -1
- package/dist/index-DoYxf1cV.js.map +0 -1
- package/dist/index-qunX30Xu.js.map +0 -1
- package/dist/index-x4stH3jD.js +0 -282
- package/dist/index-x4stH3jD.js.map +0 -1
- package/dist/index.core-COREBDNq.js.map +0 -1
- package/dist/mockDatafeed-927foCM4.js.map +0 -1
- package/dist/pool-15HMCNv8.js +0 -88
- package/dist/pool-15HMCNv8.js.map +0 -1
- package/dist/react/SciPlot.d.ts +0 -60
- package/dist/react/useSciPlot.d.ts +0 -56
- package/dist/symbols-DT0eLlpW.js +0 -568
- package/dist/symbols-DT0eLlpW.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './analysis/index'
|
|
2
|
-
import
|
|
3
|
-
export default
|
|
2
|
+
import VeloPlot from './analysis/index'
|
|
3
|
+
export default VeloPlot
|
package/dist/plugins/analysis.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as F, s as W, d as _, i as z } from "../math-Ddm2EZjj.js";
|
|
2
2
|
import { c as cn } from "../math-Ddm2EZjj.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { c as E, f as T, i as H, s as X, m as Y, d as N, e as O, v as Z, h as G } from "../utils-Dx0h0bgQ.js";
|
|
4
|
+
import { b as ln, a as fn, g as un } from "../utils-Dx0h0bgQ.js";
|
|
5
5
|
import { r as K, e as Q, s as U } from "../indicators--eJGmVox.js";
|
|
6
6
|
import { i as mn, j as gn, g as dn, f as Mn, k as wn, d as pn, m as yn, c as bn, n as Fn, o as An, p as xn, b as In, h as qn, a as Pn, t as vn, v as kn, w as $n } from "../indicators--eJGmVox.js";
|
|
7
7
|
function J(e, r, o, t = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","sources":["../../src/plugins/analysis/SeriesFit.ts","../../src/plugins/analysis/fft.ts","../../src/plugins/analysis/fitting.ts","../../src/plugins/analysis/filters.ts","../../src/plugins/analysis/contours.ts","../../src/plugins/analysis/statistics.ts","../../src/plugins/analysis/index.ts"],"sourcesContent":["/**\n * Series Curve Fitting Support\n */\nimport { fitData, type FitType, type FitOptions } from \"./index\";\n\nexport function addFitLine(\n ctx: any,\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n): string {\n const s = ctx.series.get(seriesId);\n if (!s) throw new Error(`Series ${seriesId} not found`);\n\n const data = s.getData();\n if (!data || data.x.length < 2) return \"\";\n\n const result = fitData(data.x as any, data.y as any, type, options);\n const bounds = s.getBounds();\n const xMin = bounds?.xMin ?? 0;\n const xMax = bounds?.xMax ?? 1;\n const dataWidth = xMax - xMin;\n const fitResolution = 200;\n const fitX = new Float32Array(fitResolution);\n const fitY = new Float32Array(fitResolution);\n\n for (let i = 0; i < fitResolution; i++) {\n const x = xMin + (i / (fitResolution - 1)) * dataWidth;\n fitX[i] = x;\n fitY[i] = result.predict(x);\n }\n\n const fitId = `${seriesId}-fit-${Date.now()}`;\n const sourceStyle = s.getStyle();\n\n ctx.addSeries({\n id: fitId,\n type: 'line',\n yAxisId: s.getYAxisId(),\n data: { x: fitX, y: fitY },\n style: {\n color: sourceStyle.color,\n width: (sourceStyle.width || 1) * 1.5,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n\n ctx.addAnnotation({\n type: 'text',\n x: xMin + dataWidth * 0.05,\n y: result.predict(xMin + dataWidth * 0.05),\n text: `${result.equation}\\n(R² = ${result.rSquared.toFixed(4)})`,\n fontSize: 12,\n backgroundColor: 'rgba(0,0,0,0.7)',\n color: sourceStyle.color || '#ffffff',\n padding: 4,\n anchor: 'bottom-left',\n interactive: true\n });\n\n return fitId;\n}\n","/**\n * Fast Fourier Transform (FFT) Implementation\n * \n * Provides:\n * - FFT for spectral analysis\n * - Inverse FFT\n * - Power spectrum\n * - Frequency bins calculation\n */\n\n// ============================================\n// Complex Number Type\n// ============================================\n\n/** Complex number representation */\nexport interface Complex {\n re: number;\n im: number;\n}\n\n/** FFT Result */\nexport interface FFTResult {\n /** Frequency bins in Hz (if sample rate provided) or normalized */\n frequency: Float32Array;\n /** Magnitude spectrum */\n magnitude: Float32Array;\n /** Phase spectrum in radians */\n phase: Float32Array;\n /** Full complex spectrum as Complex[] array */\n complex: Complex[];\n /** Real part of full spectrum as Float32Array */\n real: Float32Array;\n /** Imaginary part of full spectrum as Float32Array */\n imag: Float32Array;\n}\n\n/** Complex FFT Result - full spectrum with separate real/imag arrays */\nexport interface ComplexFFTResult {\n /** Real part of spectrum */\n real: Float32Array;\n /** Imaginary part of spectrum */\n imag: Float32Array;\n /** Frequency bins in Hz (if sample rate provided) */\n frequency: Float32Array;\n /** Magnitude spectrum (sqrt(real² + imag²)) */\n magnitude: Float32Array;\n /** Phase spectrum in radians (atan2(imag, real)) */\n phase: Float32Array;\n /** Original spectrum length (power of 2) */\n length: number;\n /** Nyquist index (length / 2) */\n nyquist: number;\n}\n\n/** Power spectrum result */\nexport interface PowerSpectrumResult {\n /** Frequency bins */\n frequency: Float32Array;\n /** Power values (magnitude squared) */\n power: Float32Array;\n /** Power in dB */\n powerDb: Float32Array;\n}\n\n// ============================================\n// FFT Implementation (Cooley-Tukey)\n// ============================================\n\n/**\n * Compute FFT using Cooley-Tukey algorithm\n * Input length must be a power of 2\n */\nexport function fft(input: Float32Array | Float64Array | number[]): Complex[] {\n const n = input.length;\n\n // Pad to power of 2 if necessary\n const paddedLength = nextPowerOf2(n);\n const padded = new Float64Array(paddedLength);\n for (let i = 0; i < n; i++) {\n padded[i] = input[i];\n }\n\n // Convert to complex\n const data: Complex[] = new Array(paddedLength);\n for (let i = 0; i < paddedLength; i++) {\n data[i] = { re: padded[i], im: 0 };\n }\n\n // Bit-reversal permutation\n bitReversePermutation(data);\n\n // Cooley-Tukey iterative FFT\n for (let size = 2; size <= paddedLength; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < paddedLength; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n return data;\n}\n\n/**\n * Compute inverse FFT\n */\nexport function ifft(spectrum: Complex[]): Float32Array {\n const n = spectrum.length;\n\n // Conjugate\n const conjugated = spectrum.map(c => ({ re: c.re, im: -c.im }));\n\n // Forward FFT\n const transformed = fftComplex(conjugated);\n\n // Conjugate and scale\n const result = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n result[i] = transformed[i].re / n;\n }\n\n return result;\n}\n\n/**\n * FFT on complex input\n */\nfunction fftComplex(input: Complex[]): Complex[] {\n const n = input.length;\n const data = input.map(c => ({ ...c }));\n\n bitReversePermutation(data);\n\n for (let size = 2; size <= n; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < n; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n return data;\n}\n\n/**\n * Bit-reversal permutation in-place\n */\nfunction bitReversePermutation(data: Complex[]): void {\n const n = data.length;\n const bits = Math.log2(n);\n\n for (let i = 0; i < n; i++) {\n const reversed = reverseBits(i, bits);\n if (reversed > i) {\n const temp = data[i];\n data[i] = data[reversed];\n data[reversed] = temp;\n }\n }\n}\n\n/**\n * Reverse bits of a number\n */\nfunction reverseBits(num: number, bits: number): number {\n let result = 0;\n for (let i = 0; i < bits; i++) {\n result = (result << 1) | (num & 1);\n num >>= 1;\n }\n return result;\n}\n\n/**\n * Find next power of 2\n */\nexport function nextPowerOf2(n: number): number {\n let p = 1;\n while (p < n) p *= 2;\n return p;\n}\n\n// ============================================\n// High-Level Analysis Functions\n// ============================================\n\n/**\n * Compute full FFT analysis with frequencies and magnitudes\n */\nexport function analyzeSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): FFTResult {\n const spectrum = fft(data);\n const n = spectrum.length;\n const nyquist = n / 2;\n\n const frequency = new Float32Array(nyquist);\n const magnitude = new Float32Array(nyquist);\n const phase = new Float32Array(nyquist);\n\n // Full spectrum real and imaginary parts\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n\n // Extract real and imaginary for full spectrum\n for (let i = 0; i < n; i++) {\n real[i] = spectrum[i].re;\n imag[i] = spectrum[i].im;\n }\n\n // Compute only positive frequencies (up to Nyquist)\n for (let i = 0; i < nyquist; i++) {\n frequency[i] = (i * sampleRate) / n;\n magnitude[i] = Math.sqrt(spectrum[i].re * spectrum[i].re + spectrum[i].im * spectrum[i].im) / n;\n phase[i] = Math.atan2(spectrum[i].im, spectrum[i].re);\n }\n\n // Normalize (except DC)\n for (let i = 1; i < nyquist; i++) {\n magnitude[i] *= 2;\n }\n\n return {\n frequency,\n magnitude,\n phase,\n complex: spectrum,\n real,\n imag,\n };\n}\n\n/**\n * Compute power spectrum\n */\nexport function powerSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): PowerSpectrumResult {\n const result = analyzeSpectrum(data, sampleRate);\n const n = result.frequency.length;\n\n const power = new Float32Array(n);\n const powerDb = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n power[i] = result.magnitude[i] * result.magnitude[i];\n powerDb[i] = 10 * Math.log10(Math.max(power[i], 1e-20));\n }\n\n return {\n frequency: result.frequency,\n power,\n powerDb,\n };\n}\n\n/**\n * Find dominant frequency in signal\n */\nexport function dominantFrequency(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0,\n minFrequency: number = 0\n): { frequency: number; magnitude: number } {\n const result = analyzeSpectrum(data, sampleRate);\n\n let maxMag = 0;\n let maxIdx = 0;\n\n for (let i = 0; i < result.magnitude.length; i++) {\n if (result.frequency[i] >= minFrequency && result.magnitude[i] > maxMag) {\n maxMag = result.magnitude[i];\n maxIdx = i;\n }\n }\n\n return {\n frequency: result.frequency[maxIdx],\n magnitude: maxMag,\n };\n}\n\n/**\n * Apply Hanning window to data\n */\nexport function hanningWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n const window = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n/**\n * Apply Hamming window to data\n */\nexport function hammingWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n const window = 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n/**\n * Apply Blackman window to data\n */\nexport function blackmanWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const a0 = 0.42;\n const a1 = 0.5;\n const a2 = 0.08;\n\n for (let i = 0; i < n; i++) {\n const window = a0 - a1 * Math.cos(2 * Math.PI * i / (n - 1))\n + a2 * Math.cos(4 * Math.PI * i / (n - 1));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n// ============================================\n// Complex FFT Functions\n// ============================================\n\n/**\n * Compute full complex FFT analysis with separate real and imaginary arrays\n * This is useful when you need direct access to real/imag components\n */\nexport function analyzeComplexSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): ComplexFFTResult {\n const spectrum = fft(data);\n const n = spectrum.length;\n const nyquist = n / 2;\n\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n const frequency = new Float32Array(n);\n const magnitude = new Float32Array(n);\n const phase = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n real[i] = spectrum[i].re;\n imag[i] = spectrum[i].im;\n frequency[i] = (i * sampleRate) / n;\n magnitude[i] = Math.sqrt(spectrum[i].re * spectrum[i].re + spectrum[i].im * spectrum[i].im);\n phase[i] = Math.atan2(spectrum[i].im, spectrum[i].re);\n }\n\n return {\n real,\n imag,\n frequency,\n magnitude,\n phase,\n length: n,\n nyquist,\n };\n}\n\n/**\n * Compute FFT from complex input (real + imaginary arrays)\n * Useful for processing complex signals or chaining FFT operations\n */\nexport function fftFromComplexInput(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): ComplexFFTResult {\n const n = real.length;\n if (imag.length !== n) {\n throw new Error('Real and imaginary arrays must have the same length');\n }\n\n const paddedLength = nextPowerOf2(n);\n const data: Complex[] = new Array(paddedLength);\n\n for (let i = 0; i < paddedLength; i++) {\n data[i] = {\n re: i < n ? real[i] : 0,\n im: i < n ? imag[i] : 0,\n };\n }\n\n // Use internal fftComplex\n bitReversePermutation(data);\n\n for (let size = 2; size <= paddedLength; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < paddedLength; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n const resultReal = new Float32Array(paddedLength);\n const resultImag = new Float32Array(paddedLength);\n const frequency = new Float32Array(paddedLength);\n const magnitude = new Float32Array(paddedLength);\n const phase = new Float32Array(paddedLength);\n\n for (let i = 0; i < paddedLength; i++) {\n resultReal[i] = data[i].re;\n resultImag[i] = data[i].im;\n frequency[i] = i / paddedLength; // Normalized frequency\n magnitude[i] = Math.sqrt(data[i].re * data[i].re + data[i].im * data[i].im);\n phase[i] = Math.atan2(data[i].im, data[i].re);\n }\n\n return {\n real: resultReal,\n imag: resultImag,\n frequency,\n magnitude,\n phase,\n length: paddedLength,\n nyquist: paddedLength / 2,\n };\n}\n\n/**\n * Convert Complex[] array to separate real and imaginary Float32Arrays\n */\nexport function complexToArrays(complex: Complex[]): { real: Float32Array; imag: Float32Array } {\n const n = complex.length;\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n real[i] = complex[i].re;\n imag[i] = complex[i].im;\n }\n\n return { real, imag };\n}\n\n/**\n * Convert separate real and imaginary arrays to Complex[] array\n */\nexport function arraysToComplex(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): Complex[] {\n const n = real.length;\n if (imag.length !== n) {\n throw new Error('Real and imaginary arrays must have the same length');\n }\n\n const result: Complex[] = new Array(n);\n for (let i = 0; i < n; i++) {\n result[i] = { re: real[i], im: imag[i] };\n }\n\n return result;\n}\n\n/**\n * Compute inverse FFT from separate real and imaginary arrays\n * Returns the real part of the inverse transform\n */\nexport function ifftFromArrays(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): Float32Array {\n const complex = arraysToComplex(real, imag);\n return ifft(complex);\n}\n\n/**\n * Compute inverse FFT returning complex result (both real and imaginary parts)\n */\nexport function ifftComplex(spectrum: Complex[]): { real: Float32Array; imag: Float32Array } {\n const n = spectrum.length;\n\n // Conjugate\n const conjugated = spectrum.map(c => ({ re: c.re, im: -c.im }));\n\n // Forward FFT on conjugated\n const data = conjugated.map(c => ({ ...c }));\n bitReversePermutation(data);\n\n for (let size = 2; size <= n; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < n; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n // Conjugate and scale\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n real[i] = data[i].re / n;\n imag[i] = -data[i].im / n;\n }\n\n return { real, imag };\n}\n\n/**\n * Get only positive frequencies (up to Nyquist) from complex spectrum\n */\nexport function getPositiveFrequencies(\n result: ComplexFFTResult\n): { real: Float32Array; imag: Float32Array; frequency: Float32Array; magnitude: Float32Array; phase: Float32Array } {\n const nyquist = result.nyquist;\n\n return {\n real: result.real.slice(0, nyquist),\n imag: result.imag.slice(0, nyquist),\n frequency: result.frequency.slice(0, nyquist),\n magnitude: result.magnitude.slice(0, nyquist),\n phase: result.phase.slice(0, nyquist),\n };\n}\n\n","/**\n * Curve Fitting and Regression Analysis\n */\nimport { solveLinearSystem, calculateR2 } from './math';\n\nexport type FitType = 'linear' | 'polynomial' | 'exponential' | 'logarithmic' | 'power';\n\nexport interface FitOptions {\n /** Degree for polynomial fit (default: 2) */\n degree?: number;\n /** Custom label for the equation */\n label?: string;\n /** Number of decimals in equation string */\n precision?: number;\n}\n\nexport interface FitResult {\n type: FitType;\n /** Coefficients (a, b, c...) */\n coefficients: number[];\n /** Formatted equation string */\n equation: string;\n /** Coefficient of determination */\n rSquared: number;\n /** Function to calculate value at X */\n predict: (x: number) => number;\n}\n\n/**\n * Perform regression on a dataset\n */\nexport function fitData(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n type: FitType,\n options: FitOptions = {}\n): FitResult {\n const n = x.length;\n if (n < 2) throw new Error(\"At least 2 points are required for fitting\");\n\n switch (type) {\n case 'linear':\n return fitLinear(x, y, options);\n case 'polynomial':\n return fitPolynomial(x, y, options.degree ?? 2, options);\n case 'exponential':\n return fitExponential(x, y, options);\n case 'logarithmic':\n return fitLogarithmic(x, y, options);\n case 'power':\n return fitPower(x, y, options);\n default:\n throw new Error(`Unsupported fit type: ${type}`);\n }\n}\n\nfunction fitLinear(x: any, y: any, opts: FitOptions): FitResult {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;\n\n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumX2 += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const predict = (v: number) => slope * v + intercept;\n const prec = opts.precision ?? 4;\n \n const label = opts.label || \"y\";\n return {\n type: 'linear',\n coefficients: [slope, intercept],\n equation: `${label} = ${slope.toFixed(prec)}x ${intercept >= 0 ? '+' : '-'} ${Math.abs(intercept).toFixed(prec)}`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPolynomial(x: any, y: any, degree: number, opts: FitOptions): FitResult {\n const n = x.length;\n const m = degree + 1;\n const A: number[][] = Array.from({ length: m }, () => new Array(m).fill(0));\n const B: number[] = new Array(m).fill(0);\n\n // Normal equations for least squares polynomial fit\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < m; j++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += Math.pow(x[k], i + j);\n }\n A[i][j] = sum;\n }\n\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += y[k] * Math.pow(x[k], i);\n }\n B[i] = sum;\n }\n\n const coeffs = solveLinearSystem(A, B); // c0, c1, c2...\n\n const predict = (v: number) => {\n let res = 0;\n for (let i = 0; i < coeffs.length; i++) {\n res += coeffs[i] * Math.pow(v, i);\n }\n return res;\n };\n\n const prec = opts.precision ?? 4;\n let equation = \"y = \";\n for (let i = coeffs.length - 1; i >= 0; i--) {\n const c = coeffs[i];\n if (i < coeffs.length - 1) equation += c >= 0 ? \" + \" : \" - \";\n else if (c < 0) equation += \"-\";\n \n equation += `${Math.abs(c).toFixed(prec)}${i > 0 ? (i > 1 ? `x^${i}` : 'x') : ''}`;\n }\n\n const label = opts.label || \"y\";\n return {\n type: 'polynomial',\n coefficients: coeffs,\n equation: `${label} = ${equation.substring(4)}`, // replace \"y = \" with custom label\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitExponential(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * e^(bx) => ln(y) = ln(a) + bx\n // Use linear fit on (x, ln(y))\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (y[i] > 0) {\n xPrime.push(x[i]);\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.exp(b * v);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'exponential',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} * e^(${b.toFixed(prec)}x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitLogarithmic(x: any, y: any, opts: FitOptions): FitResult {\n // y = a + b * ln(x)\n // Use linear fit on (ln(x), y)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(y[i]);\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = result.coefficients[1];\n\n const predict = (v: number) => a + b * Math.log(v);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'logarithmic',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} ${b >= 0 ? '+' : '-'} ${Math.abs(b).toFixed(prec)} * ln(x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPower(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * x^b => ln(y) = ln(a) + b * ln(x)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0 && y[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.pow(v, b);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'power',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} * x^(${b.toFixed(prec)})`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n","/**\n * Digital Filters Implementation\n * \n * Provides:\n * - Low-pass filter\n * - High-pass filter\n * - Band-pass filter\n * - Band-stop (notch) filter\n * - Butterworth filter\n * - Moving average (for smoothing)\n * - Savitzky-Golay filter\n */\n\n// ============================================\n// Filter Types\n// ============================================\n\nexport type FilterType = 'lowpass' | 'highpass' | 'bandpass' | 'bandstop';\n\nexport interface FilterOptions {\n /** Cutoff frequency in Hz (or normalized 0-1) */\n cutoff: number;\n /** Second cutoff for bandpass/bandstop filters */\n cutoffHigh?: number;\n /** Sample rate in Hz (default: 1.0 for normalized) */\n sampleRate?: number;\n /** Filter order (default: 2) */\n order?: number;\n}\n\nexport interface ButterworthOptions extends FilterOptions {\n /** Filter type */\n type: FilterType;\n}\n\nexport interface SingleFrequencyFilterOptions {\n /** Frequency to remove in Hz */\n frequency: number;\n /** Sampling rate in Hz */\n sampleRate: number;\n /** Bandwidth of the notch in Hz (default: 1.0) */\n bandwidth?: number;\n}\n\n// ============================================\n// Simple FIR Filters\n// ============================================\n\n/**\n * Apply a simple low-pass FIR filter\n */\nexport function lowPassFilter(\n data: Float32Array | Float64Array,\n cutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normalized = cutoffHz / (sampleRate / 2);\n const coefficients = designFIRLowPass(Math.min(normalized, 0.99), order);\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a simple high-pass FIR filter\n */\nexport function highPassFilter(\n data: Float32Array | Float64Array,\n cutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normalized = cutoffHz / (sampleRate / 2);\n const coefficients = designFIRHighPass(Math.min(normalized, 0.99), order);\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a band-pass FIR filter\n */\nexport function bandPassFilter(\n data: Float32Array | Float64Array,\n lowCutoffHz: number,\n highCutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normLow = lowCutoffHz / (sampleRate / 2);\n const normHigh = highCutoffHz / (sampleRate / 2);\n const coefficients = designFIRBandPass(\n Math.max(normLow, 0.01), \n Math.min(normHigh, 0.99), \n order\n );\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a band-stop (notch) FIR filter\n */\nexport function bandStopFilter(\n data: Float32Array | Float64Array,\n lowCutoffHz: number,\n highCutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normLow = lowCutoffHz / (sampleRate / 2);\n const normHigh = highCutoffHz / (sampleRate / 2);\n const coefficients = designFIRBandStop(\n Math.max(normLow, 0.01), \n Math.min(normHigh, 0.99), \n order\n );\n return applyFIRFilter(data, coefficients);\n}\n\n// ============================================\n// FIR Filter Design (Windowed Sinc)\n// ============================================\n\n/**\n * Design FIR low-pass filter coefficients\n */\nfunction designFIRLowPass(normalizedCutoff: number, order: number): Float32Array {\n const n = 2 * order + 1;\n const coeffs = new Float32Array(n);\n const fc = normalizedCutoff;\n \n for (let i = 0; i < n; i++) {\n const m = i - order;\n if (m === 0) {\n coeffs[i] = 2 * fc;\n } else {\n coeffs[i] = Math.sin(2 * Math.PI * fc * m) / (Math.PI * m);\n }\n // Apply Hamming window\n coeffs[i] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n }\n \n // Normalize\n let sum = 0;\n for (let i = 0; i < n; i++) sum += coeffs[i];\n for (let i = 0; i < n; i++) coeffs[i] /= sum;\n \n return coeffs;\n}\n\n/**\n * Design FIR high-pass filter coefficients\n */\nfunction designFIRHighPass(normalizedCutoff: number, order: number): Float32Array {\n const lowPass = designFIRLowPass(normalizedCutoff, order);\n const n = lowPass.length;\n const coeffs = new Float32Array(n);\n \n // Spectral inversion\n for (let i = 0; i < n; i++) {\n coeffs[i] = -lowPass[i];\n }\n coeffs[order] += 1;\n \n return coeffs;\n}\n\n/**\n * Design FIR band-pass filter coefficients\n */\nfunction designFIRBandPass(\n normalizedLow: number, \n normalizedHigh: number, \n order: number\n): Float32Array {\n const n = 2 * order + 1;\n const coeffs = new Float32Array(n);\n const fcLow = normalizedLow;\n const fcHigh = normalizedHigh;\n \n for (let i = 0; i < n; i++) {\n const m = i - order;\n if (m === 0) {\n coeffs[i] = 2 * (fcHigh - fcLow);\n } else {\n coeffs[i] = (Math.sin(2 * Math.PI * fcHigh * m) - Math.sin(2 * Math.PI * fcLow * m)) \n / (Math.PI * m);\n }\n // Apply Hamming window\n coeffs[i] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n }\n \n return coeffs;\n}\n\n/**\n * Design FIR band-stop filter coefficients\n */\nfunction designFIRBandStop(\n normalizedLow: number, \n normalizedHigh: number, \n order: number\n): Float32Array {\n const bandPass = designFIRBandPass(normalizedLow, normalizedHigh, order);\n const n = bandPass.length;\n const coeffs = new Float32Array(n);\n \n // Spectral inversion\n for (let i = 0; i < n; i++) {\n coeffs[i] = -bandPass[i];\n }\n coeffs[order] += 1;\n \n return coeffs;\n}\n\n/**\n * Apply FIR filter to data\n */\nfunction applyFIRFilter(data: Float32Array | Float64Array, coeffs: Float32Array): Float32Array {\n const n = data.length;\n const m = coeffs.length;\n const halfM = Math.floor(m / 2);\n const result = new Float32Array(n);\n \n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (let j = 0; j < m; j++) {\n const idx = i - halfM + j;\n if (idx >= 0 && idx < n) {\n sum += data[idx] * coeffs[j];\n }\n }\n result[i] = sum;\n }\n \n return result;\n}\n\n// ============================================\n// IIR Butterworth Filter\n// ============================================\n\n/**\n * Apply Butterworth filter (IIR)\n */\nexport function butterworth(\n data: Float32Array | Float64Array,\n options: ButterworthOptions\n): Float32Array {\n const { type, cutoff, cutoffHigh, sampleRate = 1.0, order = 2 } = options;\n const wc = (2 * cutoff) / sampleRate; // Normalized frequency (0-1)\n const wc2 = cutoffHigh ? (2 * cutoffHigh) / sampleRate : undefined;\n \n // Design filter coefficients\n const { b, a } = designButterworth(type, wc, wc2, order);\n \n // Apply filter (forward-backward for zero phase)\n return filtfilt(data, b, a);\n}\n\n/**\n * Apply a single frequency notch filter to remove periodic noise.\n * Implementing a 2nd order IIR notch filter.\n */\nexport function singleFrequencyFilter(\n data: Float32Array | Float64Array,\n options: SingleFrequencyFilterOptions\n): Float32Array {\n const { frequency, sampleRate, bandwidth = 1.0 } = options;\n const { b, a } = designNotchFilter(frequency, sampleRate, bandwidth);\n \n // Apply zero-phase filtering\n return filtfilt(data, b, a);\n}\n\n/**\n * Design 2nd order IIR Notch Filter coefficients.\n * H(z) = (1 - 2*cos(w0)*z^-1 + z^-2) / (1 - 2*r*cos(w0)*z^-1 + r^2*z^-2)\n */\nfunction designNotchFilter(\n frequency: number,\n sampleRate: number,\n bandwidth: number\n): { b: number[]; a: number[] } {\n const w0 = (2 * Math.PI * frequency) / sampleRate;\n const bw = (2 * Math.PI * bandwidth) / sampleRate;\n \n // r is the pole radius, related to bandwidth\n const r = 1 - (bw / 2);\n \n const cosW0 = Math.cos(w0);\n \n const b = [1, -2 * cosW0, 1];\n const a = [1, -2 * r * cosW0, r * r];\n \n return { b, a };\n}\n\n/**\n * Design Butterworth filter coefficients\n */\nfunction designButterworth(\n type: FilterType,\n wc: number,\n wc2: number | undefined,\n order: number\n): { b: number[]; a: number[] } {\n // Pre-warp for bilinear transform\n const wa = Math.tan(Math.PI * wc / 2);\n \n // Simple 2nd order Butterworth for now\n // Extended implementation would support higher orders\n const effectiveOrder = Math.min(order, 4);\n \n if (type === 'lowpass') {\n return butterLowPass(wa, effectiveOrder);\n } else if (type === 'highpass') {\n return butterHighPass(wa, effectiveOrder);\n } else if (type === 'bandpass' && wc2) {\n const wa2 = Math.tan(Math.PI * wc2 / 2);\n return butterBandPass(wa, wa2, effectiveOrder);\n } else if (type === 'bandstop' && wc2) {\n const wa2 = Math.tan(Math.PI * wc2 / 2);\n return butterBandStop(wa, wa2, effectiveOrder);\n }\n \n // Default to lowpass\n return butterLowPass(wa, effectiveOrder);\n}\n\n/**\n * 2nd order Butterworth low-pass coefficients\n */\nfunction butterLowPass(wa: number, _order: number): { b: number[]; a: number[] } {\n const k = wa;\n const k2 = k * k;\n const sqrt2 = Math.sqrt(2);\n \n const norm = 1 / (1 + sqrt2 * k + k2);\n \n return {\n b: [k2 * norm, 2 * k2 * norm, k2 * norm],\n a: [1, 2 * (k2 - 1) * norm, (1 - sqrt2 * k + k2) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth high-pass coefficients\n */\nfunction butterHighPass(wa: number, _order: number): { b: number[]; a: number[] } {\n const k = wa;\n const k2 = k * k;\n const sqrt2 = Math.sqrt(2);\n \n const norm = 1 / (1 + sqrt2 * k + k2);\n \n return {\n b: [norm, -2 * norm, norm],\n a: [1, 2 * (k2 - 1) * norm, (1 - sqrt2 * k + k2) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth band-pass coefficients\n */\nfunction butterBandPass(waLow: number, waHigh: number, _order: number): { b: number[]; a: number[] } {\n const w0 = Math.sqrt(waLow * waHigh);\n const bw = waHigh - waLow;\n const q = w0 / bw;\n \n const norm = 1 / (1 + w0 / q + w0 * w0);\n \n return {\n b: [w0 / q * norm, 0, -w0 / q * norm],\n a: [1, 2 * (w0 * w0 - 1) * norm, (1 - w0 / q + w0 * w0) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth band-stop coefficients\n */\nfunction butterBandStop(waLow: number, waHigh: number, _order: number): { b: number[]; a: number[] } {\n const w0 = Math.sqrt(waLow * waHigh);\n const bw = waHigh - waLow;\n const q = w0 / bw;\n \n const norm = 1 / (1 + w0 / q + w0 * w0);\n \n return {\n b: [(1 + w0 * w0) * norm, 2 * (w0 * w0 - 1) * norm, (1 + w0 * w0) * norm],\n a: [1, 2 * (w0 * w0 - 1) * norm, (1 - w0 / q + w0 * w0) * norm],\n };\n}\n\n/**\n * Apply IIR filter (single direction)\n */\nfunction iirFilter(data: Float32Array | Float64Array, b: number[], a: number[]): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n for (let i = 0; i < n; i++) {\n result[i] = b[0] * data[i];\n \n for (let j = 1; j < b.length; j++) {\n if (i - j >= 0) {\n result[i] += b[j] * data[i - j];\n result[i] -= a[j] * result[i - j];\n }\n }\n }\n \n return result;\n}\n\n/**\n * Forward-backward filtering for zero-phase response\n */\nfunction filtfilt(data: Float32Array | Float64Array, b: number[], a: number[]): Float32Array {\n // Forward pass\n const forward = iirFilter(data, b, a);\n \n // Reverse\n const reversed = new Float32Array(forward.length);\n for (let i = 0; i < forward.length; i++) {\n reversed[i] = forward[forward.length - 1 - i];\n }\n \n // Backward pass\n const backward = iirFilter(reversed, b, a);\n \n // Reverse again\n const result = new Float32Array(backward.length);\n for (let i = 0; i < backward.length; i++) {\n result[i] = backward[backward.length - 1 - i];\n }\n \n return result;\n}\n\n// ============================================\n// Smoothing Filters\n// ============================================\n\n/**\n * Exponential moving average filter\n */\nexport function exponentialMovingAverage(\n data: Float32Array | Float64Array,\n alpha: number = 0.3\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n result[0] = data[0];\n for (let i = 1; i < n; i++) {\n result[i] = alpha * data[i] + (1 - alpha) * result[i - 1];\n }\n \n return result;\n}\n\n/**\n * Gaussian smoothing filter\n */\nexport function gaussianSmooth(\n data: Float32Array | Float64Array,\n sigma: number = 2\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n // Generate Gaussian kernel\n const kernelSize = Math.ceil(sigma * 3) * 2 + 1;\n const halfKernel = Math.floor(kernelSize / 2);\n const kernel = new Float32Array(kernelSize);\n \n let sum = 0;\n for (let i = 0; i < kernelSize; i++) {\n const x = i - halfKernel;\n kernel[i] = Math.exp(-(x * x) / (2 * sigma * sigma));\n sum += kernel[i];\n }\n \n // Normalize\n for (let i = 0; i < kernelSize; i++) {\n kernel[i] /= sum;\n }\n \n // Convolve\n for (let i = 0; i < n; i++) {\n let acc = 0;\n for (let j = 0; j < kernelSize; j++) {\n const idx = i - halfKernel + j;\n if (idx >= 0 && idx < n) {\n acc += data[idx] * kernel[j];\n }\n }\n result[i] = acc;\n }\n \n return result;\n}\n\n/**\n * Savitzky-Golay smoothing filter\n */\nexport function savitzkyGolay(\n data: Float32Array | Float64Array,\n windowSize: number = 5,\n polynomialOrder: number = 2\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const halfWindow = Math.floor(windowSize / 2);\n \n // Pre-compute coefficients for polynomial fitting\n const coeffs = computeSGCoefficients(windowSize, polynomialOrder);\n \n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (let j = -halfWindow; j <= halfWindow; j++) {\n const idx = i + j;\n if (idx >= 0 && idx < n) {\n sum += data[idx] * coeffs[j + halfWindow];\n } else if (idx < 0) {\n sum += data[0] * coeffs[j + halfWindow];\n } else {\n sum += data[n - 1] * coeffs[j + halfWindow];\n }\n }\n result[i] = sum;\n }\n \n return result;\n}\n\n/**\n * Compute Savitzky-Golay coefficients\n */\nfunction computeSGCoefficients(windowSize: number, _order: number): Float32Array {\n const halfWindow = Math.floor(windowSize / 2);\n const coeffs = new Float32Array(windowSize);\n \n // Simple approximation for smoothing (order 0)\n // For full SG, would need matrix inversion\n const weight = 1 / windowSize;\n for (let i = 0; i < windowSize; i++) {\n // Quadratic weighting for better smoothing\n const x = i - halfWindow;\n coeffs[i] = weight * (1 - (x * x) / ((halfWindow + 1) * (halfWindow + 1)));\n }\n \n // Normalize\n let sum = 0;\n for (let i = 0; i < windowSize; i++) sum += coeffs[i];\n for (let i = 0; i < windowSize; i++) coeffs[i] /= sum;\n \n return coeffs;\n}\n\n// ============================================\n// Median Filter\n// ============================================\n\n/**\n * Median filter (good for spike removal)\n */\nexport function medianFilter(\n data: Float32Array | Float64Array,\n windowSize: number = 5\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const halfWindow = Math.floor(windowSize / 2);\n \n for (let i = 0; i < n; i++) {\n const window: number[] = [];\n \n for (let j = -halfWindow; j <= halfWindow; j++) {\n const idx = i + j;\n if (idx >= 0 && idx < n) {\n window.push(data[idx]);\n }\n }\n \n window.sort((a, b) => a - b);\n result[i] = window[Math.floor(window.length / 2)];\n }\n \n return result;\n}\n","/**\n * Contour Plot Generation (Marching Squares)\n */\n\nexport interface ContourPoint {\n x: number;\n y: number;\n}\n\nexport interface ContourLine {\n level: number;\n points: ContourPoint[];\n /** Joined polylines (populated when `joinPaths` is enabled). */\n polylines?: ContourPoint[][];\n /** Suggested isoline label placements (populated when `labels` is enabled). */\n labels?: ContourLabel[];\n}\n\n/** A placed label for an isoline, including rotation to follow the line. */\nexport interface ContourLabel {\n x: number;\n y: number;\n level: number;\n /** Text of the label (formatted level value). */\n text: string;\n /** Rotation angle in radians so the label follows the contour direction. */\n angle: number;\n}\n\nexport interface ContourOptions {\n levels?: number[];\n numLevels?: number;\n /** Join marching-squares segments into continuous polylines. */\n joinPaths?: boolean;\n /** Compute isoline label placements (implies `joinPaths`). */\n labels?: boolean;\n /**\n * Minimum polyline length (in polyline vertices) required to receive a label.\n * Prevents cluttering short/noisy isolines. Default: 6.\n */\n minLabelLength?: number;\n /** Formatter for label text. Default: fixed to 2 significant decimals. */\n labelFormatter?: (level: number) => string;\n}\n\n/**\n * Generate contour lines from a 2D grid of values\n * Values are assumed to be in row-major order: z = values[y * width + x]\n */\nexport function generateContours(\n z: Float32Array | number[],\n xValues: Float32Array | number[],\n yValues: Float32Array | number[],\n options: ContourOptions = {}\n): ContourLine[] {\n const width = xValues.length;\n const height = yValues.length;\n \n const minZ = Math.min(...z);\n const maxZ = Math.max(...z);\n \n const levels = options.levels || calculateLevels(minZ, maxZ, options.numLevels || 10);\n const result: ContourLine[] = [];\n\n for (const level of levels) {\n const segments: Array<[number, number, number, number]> = [];\n \n // Process each cell\n for (let y = 0; y < height - 1; y++) {\n for (let x = 0; x < width - 1; x++) {\n const v0 = z[y * width + x];\n const v1 = z[y * width + (x + 1)];\n const v2 = z[(y + 1) * width + (x + 1)];\n const v3 = z[(y + 1) * width + x];\n \n processCell(x, y, v0, v1, v2, v3, level, xValues, yValues, segments);\n }\n }\n \n if (segments.length > 0) {\n // Flat segment list (backwards-compatible: pairs of points).\n const points: ContourPoint[] = [];\n for (const seg of segments) {\n points.push({ x: seg[0], y: seg[1] });\n points.push({ x: seg[2], y: seg[3] });\n }\n\n const line: ContourLine = { level, points };\n\n if (options.joinPaths || options.labels) {\n const polylines = joinSegments(segments);\n line.polylines = polylines;\n\n if (options.labels) {\n line.labels = placeLabels(\n polylines,\n level,\n options.minLabelLength ?? 6,\n options.labelFormatter ?? defaultLabelFormatter\n );\n }\n }\n\n result.push(line);\n }\n }\n\n return result;\n}\n\n/**\n * Join disjoint marching-squares segments into continuous polylines by\n * chaining segments whose endpoints coincide (within a tolerance). This yields\n * smooth isolines suitable for labeling (task 3.13).\n */\nexport function joinSegments(\n segments: Array<[number, number, number, number]>,\n tolerance = 1e-6\n): ContourPoint[][] {\n const remaining = segments.map((s) => ({\n a: { x: s[0], y: s[1] },\n b: { x: s[2], y: s[3] },\n used: false,\n }));\n\n const key = (p: ContourPoint) => `${Math.round(p.x / tolerance)}:${Math.round(p.y / tolerance)}`;\n const close = (p: ContourPoint, q: ContourPoint) =>\n Math.abs(p.x - q.x) <= tolerance && Math.abs(p.y - q.y) <= tolerance;\n\n // Index segment endpoints for O(1)-ish lookup.\n const index = new Map<string, number[]>();\n remaining.forEach((seg, i) => {\n for (const p of [seg.a, seg.b]) {\n const k = key(p);\n if (!index.has(k)) index.set(k, []);\n index.get(k)!.push(i);\n }\n });\n\n const polylines: ContourPoint[][] = [];\n\n for (let i = 0; i < remaining.length; i++) {\n if (remaining[i].used) continue;\n remaining[i].used = true;\n const path: ContourPoint[] = [remaining[i].a, remaining[i].b];\n\n // Extend forward from the tail.\n let extended = true;\n while (extended) {\n extended = false;\n const tail = path[path.length - 1];\n const candidates = index.get(key(tail)) ?? [];\n for (const j of candidates) {\n if (remaining[j].used) continue;\n const seg = remaining[j];\n if (close(seg.a, tail)) {\n path.push(seg.b);\n seg.used = true;\n extended = true;\n break;\n } else if (close(seg.b, tail)) {\n path.push(seg.a);\n seg.used = true;\n extended = true;\n break;\n }\n }\n }\n\n // Extend backward from the head.\n extended = true;\n while (extended) {\n extended = false;\n const head = path[0];\n const candidates = index.get(key(head)) ?? [];\n for (const j of candidates) {\n if (remaining[j].used) continue;\n const seg = remaining[j];\n if (close(seg.b, head)) {\n path.unshift(seg.a);\n seg.used = true;\n extended = true;\n break;\n } else if (close(seg.a, head)) {\n path.unshift(seg.b);\n seg.used = true;\n extended = true;\n break;\n }\n }\n }\n\n polylines.push(path);\n }\n\n return polylines;\n}\n\nfunction defaultLabelFormatter(level: number): string {\n const abs = Math.abs(level);\n if (abs !== 0 && (abs < 0.01 || abs >= 1e5)) return level.toExponential(1);\n return level.toFixed(2).replace(/\\.00$/, '');\n}\n\n/**\n * Place one label near the arc-length midpoint of each sufficiently long\n * polyline, rotated to follow the local isoline direction so it reads naturally\n * at different zoom levels. The tangent is estimated over a small window of\n * neighbouring vertices (rather than the two immediate neighbours) so the angle\n * is smooth and the label doesn't jitter on wiggly isolines.\n */\nfunction placeLabels(\n polylines: ContourPoint[][],\n level: number,\n minLength: number,\n formatter: (level: number) => string\n): ContourLabel[] {\n const labels: ContourLabel[] = [];\n const text = formatter(level);\n\n for (const line of polylines) {\n if (line.length < minLength) continue;\n\n // Find the vertex closest to the polyline's arc-length midpoint so the label\n // sits on the visual middle of the isoline even when vertices are unevenly\n // spaced (marching-squares output clusters points near saddles).\n let total = 0;\n for (let i = 1; i < line.length; i++) {\n total += Math.hypot(line[i].x - line[i - 1].x, line[i].y - line[i - 1].y);\n }\n const half = total / 2;\n let acc = 0;\n let midIdx = Math.floor(line.length / 2);\n for (let i = 1; i < line.length; i++) {\n acc += Math.hypot(line[i].x - line[i - 1].x, line[i].y - line[i - 1].y);\n if (acc >= half) {\n midIdx = i;\n break;\n }\n }\n\n const p = line[midIdx];\n // Smooth tangent over a window of ±win vertices.\n const win = Math.min(3, Math.floor(line.length / 4)) || 1;\n const prev = line[Math.max(0, midIdx - win)];\n const next = line[Math.min(line.length - 1, midIdx + win)];\n\n let angle = Math.atan2(next.y - prev.y, next.x - prev.x);\n // Keep text upright (avoid upside-down labels).\n if (angle > Math.PI / 2) angle -= Math.PI;\n if (angle < -Math.PI / 2) angle += Math.PI;\n\n labels.push({ x: p.x, y: p.y, level, text, angle });\n }\n\n return labels;\n}\n\nfunction calculateLevels(min: number, max: number, n: number): number[] {\n const levels = [];\n const step = (max - min) / (n + 1);\n for (let i = 1; i <= n; i++) {\n levels.push(min + i * step);\n }\n return levels;\n}\n\n/**\n * Process a single cell using Marching Squares\n */\nfunction processCell(\n x: number, y: number,\n v0: number, v1: number, v2: number, v3: number,\n level: number,\n xScale: any, yScale: any,\n segments: Array<[number, number, number, number]>\n) {\n let caseIndex = 0;\n if (v0 >= level) caseIndex |= 1;\n if (v1 >= level) caseIndex |= 2;\n if (v2 >= level) caseIndex |= 4;\n if (v3 >= level) caseIndex |= 8;\n\n if (caseIndex === 0 || caseIndex === 15) return;\n\n // Interpolation helpers\n const lerp = (v0: number, v1: number, t: number) => v0 + (v1 - v0) * t;\n const getT = (v0: number, v1: number) => (level - v0) / (v1 - v0);\n\n // Edges: 0 (top), 1 (right), 2 (bottom), 3 (left)\n const getPoint = (edge: number): [number, number] => {\n switch (edge) {\n case 0: return [lerp(xScale[x], xScale[x + 1], getT(v0, v1)), yScale[y]];\n case 1: return [xScale[x + 1], lerp(yScale[y], yScale[y + 1], getT(v1, v2))];\n case 2: return [lerp(xScale[x], xScale[x + 1], getT(v3, v2)), yScale[y + 1]];\n case 3: return [xScale[x], lerp(yScale[y], yScale[y + 1], getT(v0, v3))];\n default: return [0, 0];\n }\n };\n\n const addSeg = (e1: number, e2: number) => {\n const p1 = getPoint(e1);\n const p2 = getPoint(e2);\n segments.push([p1[0], p1[1], p2[0], p2[1]]);\n };\n\n // Case table\n switch (caseIndex) {\n case 1: case 14: addSeg(0, 3); break;\n case 2: case 13: addSeg(0, 1); break;\n case 3: case 12: addSeg(1, 3); break;\n case 4: case 11: addSeg(1, 2); break;\n case 5: addSeg(0, 1); addSeg(2, 3); break; // Ambiguous\n case 6: case 9: addSeg(0, 2); break;\n case 7: case 8: addSeg(2, 3); break;\n case 10: addSeg(0, 3); addSeg(1, 2); break; // Ambiguous\n }\n}\n","/**\n * Advanced Statistical Analysis\n * \n * Provides:\n * - Cross-correlation\n * - Auto-correlation\n * - Anomaly detection\n * - Statistical tests\n * - Numerical integration (Simpson, trapezoidal)\n */\n\n// ============================================\n// Correlation Analysis\n// ============================================\n\n/** Cross-correlation result */\nexport interface CorrelationResult {\n /** Correlation values at each lag */\n correlation: Float32Array;\n /** Lag values */\n lags: Float32Array;\n /** Maximum correlation value */\n maxCorrelation: number;\n /** Lag at maximum correlation */\n lagAtMax: number;\n}\n\n/**\n * Compute cross-correlation between two signals\n */\nexport function crossCorrelation(\n signal1: Float32Array | Float64Array,\n signal2: Float32Array | Float64Array,\n maxLag?: number\n): CorrelationResult {\n const n1 = signal1.length;\n const n2 = signal2.length;\n const effectiveMaxLag = maxLag ?? Math.min(n1, n2) - 1;\n const numLags = 2 * effectiveMaxLag + 1;\n \n const correlation = new Float32Array(numLags);\n const lags = new Float32Array(numLags);\n \n // Compute means\n let mean1 = 0, mean2 = 0;\n for (let i = 0; i < n1; i++) mean1 += signal1[i];\n for (let i = 0; i < n2; i++) mean2 += signal2[i];\n mean1 /= n1;\n mean2 /= n2;\n \n // Compute standard deviations\n let std1 = 0, std2 = 0;\n for (let i = 0; i < n1; i++) std1 += (signal1[i] - mean1) ** 2;\n for (let i = 0; i < n2; i++) std2 += (signal2[i] - mean2) ** 2;\n std1 = Math.sqrt(std1 / n1);\n std2 = Math.sqrt(std2 / n2);\n \n const normFactor = std1 * std2 * Math.min(n1, n2);\n \n let maxCorr = -Infinity;\n let maxLagIdx = 0;\n \n for (let lagIdx = 0; lagIdx < numLags; lagIdx++) {\n const lag = lagIdx - effectiveMaxLag;\n lags[lagIdx] = lag;\n \n let sum = 0;\n let count = 0;\n \n for (let i = 0; i < n1; i++) {\n const j = i + lag;\n if (j >= 0 && j < n2) {\n sum += (signal1[i] - mean1) * (signal2[j] - mean2);\n count++;\n }\n }\n \n correlation[lagIdx] = normFactor > 0 ? sum / normFactor : 0;\n \n if (correlation[lagIdx] > maxCorr) {\n maxCorr = correlation[lagIdx];\n maxLagIdx = lagIdx;\n }\n }\n \n return {\n correlation,\n lags,\n maxCorrelation: maxCorr,\n lagAtMax: lags[maxLagIdx],\n };\n}\n\n/**\n * Compute auto-correlation of a signal\n */\nexport function autoCorrelation(\n signal: Float32Array | Float64Array,\n maxLag?: number\n): CorrelationResult {\n return crossCorrelation(signal, signal, maxLag);\n}\n\n// ============================================\n// Anomaly Detection\n// ============================================\n\n/** Anomaly detection result */\nexport interface AnomalyResult {\n /** Indices of anomalous points */\n indices: number[];\n /** Anomaly scores for all points */\n scores: Float32Array;\n /** Threshold used for detection */\n threshold: number;\n}\n\n/** Anomaly detection options */\nexport interface AnomalyOptions {\n /** Detection method */\n method?: 'zscore' | 'mad' | 'iqr' | 'isolation';\n /** Threshold multiplier (default: 3 for zscore, 2.5 for mad, 1.5 for iqr) */\n threshold?: number;\n /** Window size for local anomaly detection (default: use global) */\n windowSize?: number;\n}\n\n/**\n * Detect anomalies in a signal\n */\nexport function detectAnomalies(\n data: Float32Array | Float64Array,\n options: AnomalyOptions = {}\n): AnomalyResult {\n const { method = 'zscore', windowSize } = options;\n \n switch (method) {\n case 'zscore':\n return detectAnomaliesZScore(data, options.threshold ?? 3, windowSize);\n case 'mad':\n return detectAnomaliesMAD(data, options.threshold ?? 2.5, windowSize);\n case 'iqr':\n return detectAnomaliesIQR(data, options.threshold ?? 1.5);\n case 'isolation':\n return detectAnomaliesIsolation(data, options.threshold ?? 0.5);\n default:\n return detectAnomaliesZScore(data, 3, windowSize);\n }\n}\n\n/**\n * Z-score based anomaly detection\n */\nfunction detectAnomaliesZScore(\n data: Float32Array | Float64Array,\n threshold: number,\n windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n if (windowSize && windowSize < n) {\n // Local anomaly detection\n const halfWindow = Math.floor(windowSize / 2);\n \n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(n, i + halfWindow + 1);\n \n let mean = 0;\n for (let j = start; j < end; j++) mean += data[j];\n mean /= (end - start);\n \n let std = 0;\n for (let j = start; j < end; j++) std += (data[j] - mean) ** 2;\n std = Math.sqrt(std / (end - start));\n \n scores[i] = std > 0 ? Math.abs(data[i] - mean) / std : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n } else {\n // Global anomaly detection\n let mean = 0;\n for (let i = 0; i < n; i++) mean += data[i];\n mean /= n;\n \n let std = 0;\n for (let i = 0; i < n; i++) std += (data[i] - mean) ** 2;\n std = Math.sqrt(std / n);\n \n for (let i = 0; i < n; i++) {\n scores[i] = std > 0 ? Math.abs(data[i] - mean) / std : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Median Absolute Deviation (MAD) based anomaly detection\n */\nfunction detectAnomaliesMAD(\n data: Float32Array | Float64Array,\n threshold: number,\n _windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n // Compute median\n const sorted = Array.from(data).sort((a, b) => a - b);\n const median = sorted[Math.floor(n / 2)];\n \n // Compute MAD\n const absDeviations = sorted.map(x => Math.abs(x - median)).sort((a, b) => a - b);\n const mad = absDeviations[Math.floor(n / 2)];\n const scaledMad = 1.4826 * mad; // Scale factor for normal distribution\n \n for (let i = 0; i < n; i++) {\n scores[i] = scaledMad > 0 ? Math.abs(data[i] - median) / scaledMad : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * IQR (Interquartile Range) based anomaly detection\n */\nfunction detectAnomaliesIQR(\n data: Float32Array | Float64Array,\n threshold: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n const sorted = Array.from(data).sort((a, b) => a - b);\n const q1 = sorted[Math.floor(n * 0.25)];\n const q3 = sorted[Math.floor(n * 0.75)];\n const iqr = q3 - q1;\n \n const lowerBound = q1 - threshold * iqr;\n const upperBound = q3 + threshold * iqr;\n \n for (let i = 0; i < n; i++) {\n if (data[i] < lowerBound) {\n scores[i] = (lowerBound - data[i]) / iqr;\n indices.push(i);\n } else if (data[i] > upperBound) {\n scores[i] = (data[i] - upperBound) / iqr;\n indices.push(i);\n } else {\n scores[i] = 0;\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Simplified isolation-based anomaly detection\n */\nfunction detectAnomaliesIsolation(\n data: Float32Array | Float64Array,\n threshold: number,\n _windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n // For each point, count how many neighbors are close\n const neighborRadius = calculateNeighborRadius(data);\n \n for (let i = 0; i < n; i++) {\n let neighborCount = 0;\n \n for (let j = 0; j < n; j++) {\n if (i !== j && Math.abs(data[i] - data[j]) < neighborRadius) {\n neighborCount++;\n }\n }\n \n // Isolation score: fewer neighbors = more isolated = higher score\n scores[i] = 1 - (neighborCount / n);\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Calculate neighbor radius for isolation detection\n */\nfunction calculateNeighborRadius(data: Float32Array | Float64Array): number {\n let min = Infinity;\n let max = -Infinity;\n \n for (let i = 0; i < data.length; i++) {\n if (data[i] < min) min = data[i];\n if (data[i] > max) max = data[i];\n }\n \n return (max - min) * 0.1; // 10% of range\n}\n\n// ============================================\n// Numerical Integration\n// ============================================\n\n/**\n * Trapezoidal integration\n */\nexport function trapezoidalIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): number {\n const n = y.length;\n if (n < 2) return 0;\n \n let sum = 0;\n \n if (typeof x === 'number') {\n // Uniform spacing\n const dx = x;\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) * dx / 2;\n }\n } else if (x) {\n // Non-uniform spacing\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) * (x[i] - x[i - 1]) / 2;\n }\n } else {\n // Assume unit spacing\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) / 2;\n }\n }\n \n return sum;\n}\n\n/**\n * Simpson's rule integration (requires odd number of points)\n */\nexport function simpsonsIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): number {\n const n = y.length;\n if (n < 3) return trapezoidalIntegration(y, x);\n \n // Ensure odd number of points\n const useN = n % 2 === 0 ? n - 1 : n;\n \n let sum = 0;\n \n if (typeof x === 'number') {\n // Uniform spacing\n const dx = x;\n \n sum = y[0] + y[useN - 1];\n \n for (let i = 1; i < useN - 1; i++) {\n sum += (i % 2 === 0 ? 2 : 4) * y[i];\n }\n \n sum *= dx / 3;\n \n // Add last interval if we had to skip a point\n if (n !== useN) {\n sum += (y[n - 2] + y[n - 1]) * dx / 2;\n }\n } else if (x) {\n // Non-uniform spacing - use trapezoidal as fallback\n return trapezoidalIntegration(y, x);\n } else {\n // Assume unit spacing\n return simpsonsIntegration(y, 1.0);\n }\n \n return sum;\n}\n\n/**\n * Cumulative integration (returns running integral)\n */\nexport function cumulativeIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): Float32Array {\n const n = y.length;\n const result = new Float32Array(n);\n \n if (n < 2) {\n result[0] = 0;\n return result;\n }\n \n result[0] = 0;\n \n if (typeof x === 'number') {\n const dx = x;\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) * dx / 2;\n }\n } else if (x) {\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) * (x[i] - x[i - 1]) / 2;\n }\n } else {\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) / 2;\n }\n }\n \n return result;\n}\n\n// ============================================\n// Statistical Tests\n// ============================================\n\n/** T-test result */\nexport interface TTestResult {\n /** T-statistic */\n tStatistic: number;\n /** Degrees of freedom */\n degreesOfFreedom: number;\n /** Approximate p-value (two-tailed) */\n pValue: number;\n /** Whether the difference is significant at 0.05 level */\n significant: boolean;\n}\n\n/**\n * Two-sample t-test (Welch's t-test)\n */\nexport function tTest(\n sample1: Float32Array | Float64Array | number[],\n sample2: Float32Array | Float64Array | number[]\n): TTestResult {\n const n1 = sample1.length;\n const n2 = sample2.length;\n \n // Calculate means\n let mean1 = 0, mean2 = 0;\n for (let i = 0; i < n1; i++) mean1 += sample1[i];\n for (let i = 0; i < n2; i++) mean2 += sample2[i];\n mean1 /= n1;\n mean2 /= n2;\n \n // Calculate variances\n let var1 = 0, var2 = 0;\n for (let i = 0; i < n1; i++) var1 += (sample1[i] - mean1) ** 2;\n for (let i = 0; i < n2; i++) var2 += (sample2[i] - mean2) ** 2;\n var1 /= (n1 - 1);\n var2 /= (n2 - 1);\n \n // Calculate t-statistic\n const se = Math.sqrt(var1 / n1 + var2 / n2);\n const tStatistic = (mean1 - mean2) / se;\n \n // Welch-Satterthwaite degrees of freedom\n const num = (var1 / n1 + var2 / n2) ** 2;\n const denom = (var1 / n1) ** 2 / (n1 - 1) + (var2 / n2) ** 2 / (n2 - 1);\n const degreesOfFreedom = num / denom;\n \n // Approximate p-value using normal distribution for large df\n const pValue = 2 * (1 - normalCDF(Math.abs(tStatistic)));\n \n return {\n tStatistic,\n degreesOfFreedom,\n pValue,\n significant: pValue < 0.05,\n };\n}\n\n/**\n * Approximate normal CDF\n */\nfunction normalCDF(x: number): number {\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n \n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x) / Math.sqrt(2);\n \n const t = 1 / (1 + p * x);\n const y = 1 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);\n \n return 0.5 * (1 + sign * y);\n}\n","/**\n * SciPlot Engine - Data Analysis Plugin\n * \n * Provides mathematical and statistical tools including:\n * - FFT (Fast Fourier Transform)\n * - Digital Filters (Kalman, Low-pass, etc.)\n * - Curve Fitting and Regression\n * - Peak and Contour Detection\n * - Financial Indicators (SMA, EMA, RSI, etc.)\n * \n * @module plugins/analysis\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport { addFitLine } from \"./SeriesFit\";\nimport { fft } from \"./fft\";\nimport { integrate, derivative } from \"./math\";\nimport { fitData } from \"./fitting\";\nimport { \n calculateStats, validateData, detectPeaks, detectCycles, \n movingAverage, subtractBaseline, downsampleLTTB, \n formatWithPrefix, generateCycleColors \n} from \"./utils\";\nimport { sma, ema, rsi } from \"./indicators\";\nimport { singleFrequencyFilter } from \"./filters\";\n\n// ============================================\n// Core Exports (Utilities)\n// ============================================\n\nexport {\n formatWithPrefix,\n formatValue,\n formatScientific,\n getBestPrefix,\n detectCycles,\n generateCycleColors,\n detectPeaks,\n validateData,\n calculateStats,\n movingAverage,\n downsampleLTTB,\n subtractBaseline,\n} from './utils';\n\nexport {\n solveLinearSystem,\n calculateR2,\n integrate,\n derivative,\n cumulativeIntegral,\n} from './math';\n\nexport {\n fitData,\n} from './fitting';\n\nexport type {\n CycleInfo,\n Peak,\n PrefixInfo,\n ValidationResult,\n DataStats,\n} from './utils';\n\nexport type {\n FitType,\n FitOptions,\n FitResult,\n} from './fitting';\n\nexport * from './contours';\n\n// ============================================\n// Advanced Analysis (FFT, Filters, Statistics)\n// ============================================\n\nexport {\n fft,\n ifft,\n analyzeSpectrum,\n powerSpectrum,\n dominantFrequency,\n hanningWindow,\n hammingWindow,\n blackmanWindow,\n nextPowerOf2,\n analyzeComplexSpectrum,\n fftFromComplexInput,\n complexToArrays,\n arraysToComplex,\n ifftFromArrays,\n ifftComplex,\n getPositiveFrequencies,\n} from './fft';\n\nexport type {\n Complex,\n FFTResult,\n ComplexFFTResult,\n PowerSpectrumResult,\n} from './fft';\n\nexport {\n lowPassFilter,\n highPassFilter,\n bandPassFilter,\n bandStopFilter,\n butterworth,\n exponentialMovingAverage,\n gaussianSmooth,\n savitzkyGolay,\n medianFilter,\n singleFrequencyFilter,\n} from './filters';\n\nexport type {\n FilterType,\n FilterOptions,\n ButterworthOptions,\n SingleFrequencyFilterOptions,\n} from './filters';\n\nexport {\n crossCorrelation,\n autoCorrelation,\n detectAnomalies,\n trapezoidalIntegration,\n simpsonsIntegration,\n cumulativeIntegration as cumulativeIntegral2,\n tTest,\n} from './statistics';\n\nexport type {\n CorrelationResult,\n AnomalyResult,\n AnomalyOptions,\n TTestResult,\n} from './statistics';\n\n// ============================================\n// Technical/Financial Indicators\n// ============================================\n\nexport {\n sma,\n ema,\n wma,\n dema,\n tema,\n rsi,\n macd,\n stochastic,\n roc,\n momentum,\n bollingerBands,\n atr,\n standardDeviation,\n vwap,\n obv,\n adx,\n aroon,\n percentChange,\n cumsum,\n normalize,\n} from './indicators';\n\nexport type {\n IndicatorResult,\n OHLCData,\n} from './indicators';\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nexport interface PluginAnalysisConfig {\n /** Enable worker-based off-main-thread processing */\n useWorkers?: boolean;\n /** Precision for statistical calculations */\n precision?: number;\n}\n\nconst manifestAnalysis: PluginManifest = {\n name: \"velo-plot-analysis\",\n version: \"1.0.0\",\n description: \"Data analysis and signal processing for velo-plot\",\n provides: [\"analysis\"],\n tags: [\"fft\", \"filters\", \"statistics\", \"math\"],\n};\n\n/**\n * SciPlot Analysis Plugin\n * \n * Adds comprehensive data analysis capabilities to the chart.\n */\nexport function PluginAnalysis(_config: PluginAnalysisConfig = {}): ChartPlugin<PluginAnalysisConfig> {\n let _ctx: PluginContext;\n\n return {\n manifest: manifestAnalysis,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx; \n },\n\n onDestroy(_ctx: PluginContext) {\n },\n\n api: {\n addFitLine(seriesId: string, type: any, options?: any) {\n return addFitLine(_ctx.chart, seriesId, type, options);\n },\n // Math & Stats\n integrate,\n derivative,\n calculateStats,\n validateData,\n \n // Signal Processing\n fft: (data: any) => fft(data),\n detectPeaks,\n detectCycles,\n movingAverage,\n subtractBaseline,\n downsampleLTTB,\n singleFrequencyFilter,\n \n // Fitting\n fitData,\n \n // Indicators\n sma,\n ema,\n rsi,\n \n // Utils\n formatWithPrefix,\n generateCycleColors\n }\n };\n}\n\nexport default PluginAnalysis;\n"],"names":["addFitLine","ctx","seriesId","type","options","s","data","result","fitData","bounds","xMin","dataWidth","fitResolution","fitX","fitY","i","x","fitId","sourceStyle","fft","input","n","paddedLength","nextPowerOf2","padded","bitReversePermutation","size","halfSize","angle","j","theta","wRe","wIm","evenIdx","oddIdx","tRe","tIm","ifft","spectrum","conjugated","transformed","fftComplex","c","bits","reversed","reverseBits","temp","num","p","analyzeSpectrum","sampleRate","nyquist","frequency","magnitude","phase","real","imag","powerSpectrum","power","powerDb","dominantFrequency","minFrequency","maxMag","maxIdx","hanningWindow","window","hammingWindow","blackmanWindow","a0","a1","a2","analyzeComplexSpectrum","fftFromComplexInput","resultReal","resultImag","complexToArrays","complex","arraysToComplex","ifftFromArrays","ifftComplex","getPositiveFrequencies","y","fitLinear","fitPolynomial","fitExponential","fitLogarithmic","fitPower","opts","sumX","sumY","sumXY","sumX2","slope","intercept","predict","v","prec","label","calculateR2","degree","m","A","B","sum","k","coeffs","solveLinearSystem","res","equation","xPrime","yPrime","b","a","lowPassFilter","cutoffHz","order","normalized","coefficients","designFIRLowPass","applyFIRFilter","highPassFilter","designFIRHighPass","bandPassFilter","lowCutoffHz","highCutoffHz","normLow","normHigh","designFIRBandPass","bandStopFilter","designFIRBandStop","normalizedCutoff","fc","lowPass","normalizedLow","normalizedHigh","fcLow","fcHigh","bandPass","halfM","idx","butterworth","cutoff","cutoffHigh","wc","wc2","designButterworth","filtfilt","singleFrequencyFilter","bandwidth","designNotchFilter","w0","r","cosW0","wa","butterLowPass","butterHighPass","wa2","butterBandPass","butterBandStop","_order","k2","sqrt2","norm","waLow","waHigh","bw","q","iirFilter","forward","backward","exponentialMovingAverage","alpha","gaussianSmooth","sigma","kernelSize","halfKernel","kernel","acc","savitzkyGolay","windowSize","polynomialOrder","halfWindow","computeSGCoefficients","weight","medianFilter","generateContours","z","xValues","yValues","width","height","minZ","maxZ","levels","calculateLevels","level","segments","v0","v1","v2","v3","processCell","points","seg","line","polylines","joinSegments","placeLabels","defaultLabelFormatter","tolerance","remaining","key","close","index","path","extended","tail","candidates","head","abs","minLength","formatter","labels","text","total","half","midIdx","win","prev","next","min","max","step","xScale","yScale","caseIndex","lerp","t","getT","getPoint","edge","addSeg","e1","e2","p1","p2","crossCorrelation","signal1","signal2","maxLag","n1","n2","effectiveMaxLag","numLags","correlation","lags","mean1","mean2","std1","std2","normFactor","maxCorr","maxLagIdx","lagIdx","lag","autoCorrelation","signal","detectAnomalies","method","detectAnomaliesZScore","detectAnomaliesMAD","detectAnomaliesIQR","detectAnomaliesIsolation","threshold","scores","indices","start","end","mean","std","_windowSize","sorted","median","scaledMad","q1","q3","iqr","lowerBound","upperBound","neighborRadius","calculateNeighborRadius","neighborCount","trapezoidalIntegration","dx","simpsonsIntegration","useN","cumulativeIntegration","tTest","sample1","sample2","var1","var2","se","tStatistic","denom","degreesOfFreedom","pValue","normalCDF","a3","a4","a5","sign","manifestAnalysis","PluginAnalysis","_config","_ctx","integrate","derivative","calculateStats","validateData","detectPeaks","detectCycles","movingAverage","subtractBaseline","downsampleLTTB","sma","ema","rsi","formatWithPrefix","generateCycleColors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analysis.js","sources":["../../src/plugins/analysis/SeriesFit.ts","../../src/plugins/analysis/fft.ts","../../src/plugins/analysis/fitting.ts","../../src/plugins/analysis/filters.ts","../../src/plugins/analysis/contours.ts","../../src/plugins/analysis/statistics.ts","../../src/plugins/analysis/index.ts"],"sourcesContent":["/**\n * Series Curve Fitting Support\n */\nimport { fitData, type FitType, type FitOptions } from \"./index\";\n\nexport function addFitLine(\n ctx: any,\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n): string {\n const s = ctx.series.get(seriesId);\n if (!s) throw new Error(`Series ${seriesId} not found`);\n\n const data = s.getData();\n if (!data || data.x.length < 2) return \"\";\n\n const result = fitData(data.x as any, data.y as any, type, options);\n const bounds = s.getBounds();\n const xMin = bounds?.xMin ?? 0;\n const xMax = bounds?.xMax ?? 1;\n const dataWidth = xMax - xMin;\n const fitResolution = 200;\n const fitX = new Float32Array(fitResolution);\n const fitY = new Float32Array(fitResolution);\n\n for (let i = 0; i < fitResolution; i++) {\n const x = xMin + (i / (fitResolution - 1)) * dataWidth;\n fitX[i] = x;\n fitY[i] = result.predict(x);\n }\n\n const fitId = `${seriesId}-fit-${Date.now()}`;\n const sourceStyle = s.getStyle();\n\n ctx.addSeries({\n id: fitId,\n type: 'line',\n yAxisId: s.getYAxisId(),\n data: { x: fitX, y: fitY },\n style: {\n color: sourceStyle.color,\n width: (sourceStyle.width || 1) * 1.5,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n\n ctx.addAnnotation({\n type: 'text',\n x: xMin + dataWidth * 0.05,\n y: result.predict(xMin + dataWidth * 0.05),\n text: `${result.equation}\\n(R² = ${result.rSquared.toFixed(4)})`,\n fontSize: 12,\n backgroundColor: 'rgba(0,0,0,0.7)',\n color: sourceStyle.color || '#ffffff',\n padding: 4,\n anchor: 'bottom-left',\n interactive: true\n });\n\n return fitId;\n}\n","/**\n * Fast Fourier Transform (FFT) Implementation\n * \n * Provides:\n * - FFT for spectral analysis\n * - Inverse FFT\n * - Power spectrum\n * - Frequency bins calculation\n */\n\n// ============================================\n// Complex Number Type\n// ============================================\n\n/** Complex number representation */\nexport interface Complex {\n re: number;\n im: number;\n}\n\n/** FFT Result */\nexport interface FFTResult {\n /** Frequency bins in Hz (if sample rate provided) or normalized */\n frequency: Float32Array;\n /** Magnitude spectrum */\n magnitude: Float32Array;\n /** Phase spectrum in radians */\n phase: Float32Array;\n /** Full complex spectrum as Complex[] array */\n complex: Complex[];\n /** Real part of full spectrum as Float32Array */\n real: Float32Array;\n /** Imaginary part of full spectrum as Float32Array */\n imag: Float32Array;\n}\n\n/** Complex FFT Result - full spectrum with separate real/imag arrays */\nexport interface ComplexFFTResult {\n /** Real part of spectrum */\n real: Float32Array;\n /** Imaginary part of spectrum */\n imag: Float32Array;\n /** Frequency bins in Hz (if sample rate provided) */\n frequency: Float32Array;\n /** Magnitude spectrum (sqrt(real² + imag²)) */\n magnitude: Float32Array;\n /** Phase spectrum in radians (atan2(imag, real)) */\n phase: Float32Array;\n /** Original spectrum length (power of 2) */\n length: number;\n /** Nyquist index (length / 2) */\n nyquist: number;\n}\n\n/** Power spectrum result */\nexport interface PowerSpectrumResult {\n /** Frequency bins */\n frequency: Float32Array;\n /** Power values (magnitude squared) */\n power: Float32Array;\n /** Power in dB */\n powerDb: Float32Array;\n}\n\n// ============================================\n// FFT Implementation (Cooley-Tukey)\n// ============================================\n\n/**\n * Compute FFT using Cooley-Tukey algorithm\n * Input length must be a power of 2\n */\nexport function fft(input: Float32Array | Float64Array | number[]): Complex[] {\n const n = input.length;\n\n // Pad to power of 2 if necessary\n const paddedLength = nextPowerOf2(n);\n const padded = new Float64Array(paddedLength);\n for (let i = 0; i < n; i++) {\n padded[i] = input[i];\n }\n\n // Convert to complex\n const data: Complex[] = new Array(paddedLength);\n for (let i = 0; i < paddedLength; i++) {\n data[i] = { re: padded[i], im: 0 };\n }\n\n // Bit-reversal permutation\n bitReversePermutation(data);\n\n // Cooley-Tukey iterative FFT\n for (let size = 2; size <= paddedLength; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < paddedLength; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n return data;\n}\n\n/**\n * Compute inverse FFT\n */\nexport function ifft(spectrum: Complex[]): Float32Array {\n const n = spectrum.length;\n\n // Conjugate\n const conjugated = spectrum.map(c => ({ re: c.re, im: -c.im }));\n\n // Forward FFT\n const transformed = fftComplex(conjugated);\n\n // Conjugate and scale\n const result = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n result[i] = transformed[i].re / n;\n }\n\n return result;\n}\n\n/**\n * FFT on complex input\n */\nfunction fftComplex(input: Complex[]): Complex[] {\n const n = input.length;\n const data = input.map(c => ({ ...c }));\n\n bitReversePermutation(data);\n\n for (let size = 2; size <= n; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < n; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n return data;\n}\n\n/**\n * Bit-reversal permutation in-place\n */\nfunction bitReversePermutation(data: Complex[]): void {\n const n = data.length;\n const bits = Math.log2(n);\n\n for (let i = 0; i < n; i++) {\n const reversed = reverseBits(i, bits);\n if (reversed > i) {\n const temp = data[i];\n data[i] = data[reversed];\n data[reversed] = temp;\n }\n }\n}\n\n/**\n * Reverse bits of a number\n */\nfunction reverseBits(num: number, bits: number): number {\n let result = 0;\n for (let i = 0; i < bits; i++) {\n result = (result << 1) | (num & 1);\n num >>= 1;\n }\n return result;\n}\n\n/**\n * Find next power of 2\n */\nexport function nextPowerOf2(n: number): number {\n let p = 1;\n while (p < n) p *= 2;\n return p;\n}\n\n// ============================================\n// High-Level Analysis Functions\n// ============================================\n\n/**\n * Compute full FFT analysis with frequencies and magnitudes\n */\nexport function analyzeSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): FFTResult {\n const spectrum = fft(data);\n const n = spectrum.length;\n const nyquist = n / 2;\n\n const frequency = new Float32Array(nyquist);\n const magnitude = new Float32Array(nyquist);\n const phase = new Float32Array(nyquist);\n\n // Full spectrum real and imaginary parts\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n\n // Extract real and imaginary for full spectrum\n for (let i = 0; i < n; i++) {\n real[i] = spectrum[i].re;\n imag[i] = spectrum[i].im;\n }\n\n // Compute only positive frequencies (up to Nyquist)\n for (let i = 0; i < nyquist; i++) {\n frequency[i] = (i * sampleRate) / n;\n magnitude[i] = Math.sqrt(spectrum[i].re * spectrum[i].re + spectrum[i].im * spectrum[i].im) / n;\n phase[i] = Math.atan2(spectrum[i].im, spectrum[i].re);\n }\n\n // Normalize (except DC)\n for (let i = 1; i < nyquist; i++) {\n magnitude[i] *= 2;\n }\n\n return {\n frequency,\n magnitude,\n phase,\n complex: spectrum,\n real,\n imag,\n };\n}\n\n/**\n * Compute power spectrum\n */\nexport function powerSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): PowerSpectrumResult {\n const result = analyzeSpectrum(data, sampleRate);\n const n = result.frequency.length;\n\n const power = new Float32Array(n);\n const powerDb = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n power[i] = result.magnitude[i] * result.magnitude[i];\n powerDb[i] = 10 * Math.log10(Math.max(power[i], 1e-20));\n }\n\n return {\n frequency: result.frequency,\n power,\n powerDb,\n };\n}\n\n/**\n * Find dominant frequency in signal\n */\nexport function dominantFrequency(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0,\n minFrequency: number = 0\n): { frequency: number; magnitude: number } {\n const result = analyzeSpectrum(data, sampleRate);\n\n let maxMag = 0;\n let maxIdx = 0;\n\n for (let i = 0; i < result.magnitude.length; i++) {\n if (result.frequency[i] >= minFrequency && result.magnitude[i] > maxMag) {\n maxMag = result.magnitude[i];\n maxIdx = i;\n }\n }\n\n return {\n frequency: result.frequency[maxIdx],\n magnitude: maxMag,\n };\n}\n\n/**\n * Apply Hanning window to data\n */\nexport function hanningWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n const window = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n/**\n * Apply Hamming window to data\n */\nexport function hammingWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n const window = 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n/**\n * Apply Blackman window to data\n */\nexport function blackmanWindow(data: Float32Array | Float64Array): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const a0 = 0.42;\n const a1 = 0.5;\n const a2 = 0.08;\n\n for (let i = 0; i < n; i++) {\n const window = a0 - a1 * Math.cos(2 * Math.PI * i / (n - 1))\n + a2 * Math.cos(4 * Math.PI * i / (n - 1));\n result[i] = data[i] * window;\n }\n\n return result;\n}\n\n// ============================================\n// Complex FFT Functions\n// ============================================\n\n/**\n * Compute full complex FFT analysis with separate real and imaginary arrays\n * This is useful when you need direct access to real/imag components\n */\nexport function analyzeComplexSpectrum(\n data: Float32Array | Float64Array | number[],\n sampleRate: number = 1.0\n): ComplexFFTResult {\n const spectrum = fft(data);\n const n = spectrum.length;\n const nyquist = n / 2;\n\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n const frequency = new Float32Array(n);\n const magnitude = new Float32Array(n);\n const phase = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n real[i] = spectrum[i].re;\n imag[i] = spectrum[i].im;\n frequency[i] = (i * sampleRate) / n;\n magnitude[i] = Math.sqrt(spectrum[i].re * spectrum[i].re + spectrum[i].im * spectrum[i].im);\n phase[i] = Math.atan2(spectrum[i].im, spectrum[i].re);\n }\n\n return {\n real,\n imag,\n frequency,\n magnitude,\n phase,\n length: n,\n nyquist,\n };\n}\n\n/**\n * Compute FFT from complex input (real + imaginary arrays)\n * Useful for processing complex signals or chaining FFT operations\n */\nexport function fftFromComplexInput(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): ComplexFFTResult {\n const n = real.length;\n if (imag.length !== n) {\n throw new Error('Real and imaginary arrays must have the same length');\n }\n\n const paddedLength = nextPowerOf2(n);\n const data: Complex[] = new Array(paddedLength);\n\n for (let i = 0; i < paddedLength; i++) {\n data[i] = {\n re: i < n ? real[i] : 0,\n im: i < n ? imag[i] : 0,\n };\n }\n\n // Use internal fftComplex\n bitReversePermutation(data);\n\n for (let size = 2; size <= paddedLength; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < paddedLength; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n const resultReal = new Float32Array(paddedLength);\n const resultImag = new Float32Array(paddedLength);\n const frequency = new Float32Array(paddedLength);\n const magnitude = new Float32Array(paddedLength);\n const phase = new Float32Array(paddedLength);\n\n for (let i = 0; i < paddedLength; i++) {\n resultReal[i] = data[i].re;\n resultImag[i] = data[i].im;\n frequency[i] = i / paddedLength; // Normalized frequency\n magnitude[i] = Math.sqrt(data[i].re * data[i].re + data[i].im * data[i].im);\n phase[i] = Math.atan2(data[i].im, data[i].re);\n }\n\n return {\n real: resultReal,\n imag: resultImag,\n frequency,\n magnitude,\n phase,\n length: paddedLength,\n nyquist: paddedLength / 2,\n };\n}\n\n/**\n * Convert Complex[] array to separate real and imaginary Float32Arrays\n */\nexport function complexToArrays(complex: Complex[]): { real: Float32Array; imag: Float32Array } {\n const n = complex.length;\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n real[i] = complex[i].re;\n imag[i] = complex[i].im;\n }\n\n return { real, imag };\n}\n\n/**\n * Convert separate real and imaginary arrays to Complex[] array\n */\nexport function arraysToComplex(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): Complex[] {\n const n = real.length;\n if (imag.length !== n) {\n throw new Error('Real and imaginary arrays must have the same length');\n }\n\n const result: Complex[] = new Array(n);\n for (let i = 0; i < n; i++) {\n result[i] = { re: real[i], im: imag[i] };\n }\n\n return result;\n}\n\n/**\n * Compute inverse FFT from separate real and imaginary arrays\n * Returns the real part of the inverse transform\n */\nexport function ifftFromArrays(\n real: Float32Array | Float64Array | number[],\n imag: Float32Array | Float64Array | number[]\n): Float32Array {\n const complex = arraysToComplex(real, imag);\n return ifft(complex);\n}\n\n/**\n * Compute inverse FFT returning complex result (both real and imaginary parts)\n */\nexport function ifftComplex(spectrum: Complex[]): { real: Float32Array; imag: Float32Array } {\n const n = spectrum.length;\n\n // Conjugate\n const conjugated = spectrum.map(c => ({ re: c.re, im: -c.im }));\n\n // Forward FFT on conjugated\n const data = conjugated.map(c => ({ ...c }));\n bitReversePermutation(data);\n\n for (let size = 2; size <= n; size *= 2) {\n const halfSize = size / 2;\n const angle = -2 * Math.PI / size;\n\n for (let i = 0; i < n; i += size) {\n for (let j = 0; j < halfSize; j++) {\n const theta = angle * j;\n const wRe = Math.cos(theta);\n const wIm = Math.sin(theta);\n\n const evenIdx = i + j;\n const oddIdx = i + j + halfSize;\n\n const tRe = wRe * data[oddIdx].re - wIm * data[oddIdx].im;\n const tIm = wRe * data[oddIdx].im + wIm * data[oddIdx].re;\n\n data[oddIdx].re = data[evenIdx].re - tRe;\n data[oddIdx].im = data[evenIdx].im - tIm;\n data[evenIdx].re = data[evenIdx].re + tRe;\n data[evenIdx].im = data[evenIdx].im + tIm;\n }\n }\n }\n\n // Conjugate and scale\n const real = new Float32Array(n);\n const imag = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n real[i] = data[i].re / n;\n imag[i] = -data[i].im / n;\n }\n\n return { real, imag };\n}\n\n/**\n * Get only positive frequencies (up to Nyquist) from complex spectrum\n */\nexport function getPositiveFrequencies(\n result: ComplexFFTResult\n): { real: Float32Array; imag: Float32Array; frequency: Float32Array; magnitude: Float32Array; phase: Float32Array } {\n const nyquist = result.nyquist;\n\n return {\n real: result.real.slice(0, nyquist),\n imag: result.imag.slice(0, nyquist),\n frequency: result.frequency.slice(0, nyquist),\n magnitude: result.magnitude.slice(0, nyquist),\n phase: result.phase.slice(0, nyquist),\n };\n}\n\n","/**\n * Curve Fitting and Regression Analysis\n */\nimport { solveLinearSystem, calculateR2 } from './math';\n\nexport type FitType = 'linear' | 'polynomial' | 'exponential' | 'logarithmic' | 'power';\n\nexport interface FitOptions {\n /** Degree for polynomial fit (default: 2) */\n degree?: number;\n /** Custom label for the equation */\n label?: string;\n /** Number of decimals in equation string */\n precision?: number;\n}\n\nexport interface FitResult {\n type: FitType;\n /** Coefficients (a, b, c...) */\n coefficients: number[];\n /** Formatted equation string */\n equation: string;\n /** Coefficient of determination */\n rSquared: number;\n /** Function to calculate value at X */\n predict: (x: number) => number;\n}\n\n/**\n * Perform regression on a dataset\n */\nexport function fitData(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n type: FitType,\n options: FitOptions = {}\n): FitResult {\n const n = x.length;\n if (n < 2) throw new Error(\"At least 2 points are required for fitting\");\n\n switch (type) {\n case 'linear':\n return fitLinear(x, y, options);\n case 'polynomial':\n return fitPolynomial(x, y, options.degree ?? 2, options);\n case 'exponential':\n return fitExponential(x, y, options);\n case 'logarithmic':\n return fitLogarithmic(x, y, options);\n case 'power':\n return fitPower(x, y, options);\n default:\n throw new Error(`Unsupported fit type: ${type}`);\n }\n}\n\nfunction fitLinear(x: any, y: any, opts: FitOptions): FitResult {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;\n\n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumX2 += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const predict = (v: number) => slope * v + intercept;\n const prec = opts.precision ?? 4;\n \n const label = opts.label || \"y\";\n return {\n type: 'linear',\n coefficients: [slope, intercept],\n equation: `${label} = ${slope.toFixed(prec)}x ${intercept >= 0 ? '+' : '-'} ${Math.abs(intercept).toFixed(prec)}`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPolynomial(x: any, y: any, degree: number, opts: FitOptions): FitResult {\n const n = x.length;\n const m = degree + 1;\n const A: number[][] = Array.from({ length: m }, () => new Array(m).fill(0));\n const B: number[] = new Array(m).fill(0);\n\n // Normal equations for least squares polynomial fit\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < m; j++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += Math.pow(x[k], i + j);\n }\n A[i][j] = sum;\n }\n\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += y[k] * Math.pow(x[k], i);\n }\n B[i] = sum;\n }\n\n const coeffs = solveLinearSystem(A, B); // c0, c1, c2...\n\n const predict = (v: number) => {\n let res = 0;\n for (let i = 0; i < coeffs.length; i++) {\n res += coeffs[i] * Math.pow(v, i);\n }\n return res;\n };\n\n const prec = opts.precision ?? 4;\n let equation = \"y = \";\n for (let i = coeffs.length - 1; i >= 0; i--) {\n const c = coeffs[i];\n if (i < coeffs.length - 1) equation += c >= 0 ? \" + \" : \" - \";\n else if (c < 0) equation += \"-\";\n \n equation += `${Math.abs(c).toFixed(prec)}${i > 0 ? (i > 1 ? `x^${i}` : 'x') : ''}`;\n }\n\n const label = opts.label || \"y\";\n return {\n type: 'polynomial',\n coefficients: coeffs,\n equation: `${label} = ${equation.substring(4)}`, // replace \"y = \" with custom label\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitExponential(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * e^(bx) => ln(y) = ln(a) + bx\n // Use linear fit on (x, ln(y))\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (y[i] > 0) {\n xPrime.push(x[i]);\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.exp(b * v);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'exponential',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} * e^(${b.toFixed(prec)}x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitLogarithmic(x: any, y: any, opts: FitOptions): FitResult {\n // y = a + b * ln(x)\n // Use linear fit on (ln(x), y)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(y[i]);\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = result.coefficients[1];\n\n const predict = (v: number) => a + b * Math.log(v);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'logarithmic',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} ${b >= 0 ? '+' : '-'} ${Math.abs(b).toFixed(prec)} * ln(x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPower(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * x^b => ln(y) = ln(a) + b * ln(x)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0 && y[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.pow(v, b);\n const prec = opts.precision ?? 4;\n\n const label = opts.label || \"y\";\n return {\n type: 'power',\n coefficients: [a, b],\n equation: `${label} = ${a.toFixed(prec)} * x^(${b.toFixed(prec)})`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n","/**\n * Digital Filters Implementation\n * \n * Provides:\n * - Low-pass filter\n * - High-pass filter\n * - Band-pass filter\n * - Band-stop (notch) filter\n * - Butterworth filter\n * - Moving average (for smoothing)\n * - Savitzky-Golay filter\n */\n\n// ============================================\n// Filter Types\n// ============================================\n\nexport type FilterType = 'lowpass' | 'highpass' | 'bandpass' | 'bandstop';\n\nexport interface FilterOptions {\n /** Cutoff frequency in Hz (or normalized 0-1) */\n cutoff: number;\n /** Second cutoff for bandpass/bandstop filters */\n cutoffHigh?: number;\n /** Sample rate in Hz (default: 1.0 for normalized) */\n sampleRate?: number;\n /** Filter order (default: 2) */\n order?: number;\n}\n\nexport interface ButterworthOptions extends FilterOptions {\n /** Filter type */\n type: FilterType;\n}\n\nexport interface SingleFrequencyFilterOptions {\n /** Frequency to remove in Hz */\n frequency: number;\n /** Sampling rate in Hz */\n sampleRate: number;\n /** Bandwidth of the notch in Hz (default: 1.0) */\n bandwidth?: number;\n}\n\n// ============================================\n// Simple FIR Filters\n// ============================================\n\n/**\n * Apply a simple low-pass FIR filter\n */\nexport function lowPassFilter(\n data: Float32Array | Float64Array,\n cutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normalized = cutoffHz / (sampleRate / 2);\n const coefficients = designFIRLowPass(Math.min(normalized, 0.99), order);\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a simple high-pass FIR filter\n */\nexport function highPassFilter(\n data: Float32Array | Float64Array,\n cutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normalized = cutoffHz / (sampleRate / 2);\n const coefficients = designFIRHighPass(Math.min(normalized, 0.99), order);\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a band-pass FIR filter\n */\nexport function bandPassFilter(\n data: Float32Array | Float64Array,\n lowCutoffHz: number,\n highCutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normLow = lowCutoffHz / (sampleRate / 2);\n const normHigh = highCutoffHz / (sampleRate / 2);\n const coefficients = designFIRBandPass(\n Math.max(normLow, 0.01), \n Math.min(normHigh, 0.99), \n order\n );\n return applyFIRFilter(data, coefficients);\n}\n\n/**\n * Apply a band-stop (notch) FIR filter\n */\nexport function bandStopFilter(\n data: Float32Array | Float64Array,\n lowCutoffHz: number,\n highCutoffHz: number,\n sampleRate: number,\n order: number = 5\n): Float32Array {\n const normLow = lowCutoffHz / (sampleRate / 2);\n const normHigh = highCutoffHz / (sampleRate / 2);\n const coefficients = designFIRBandStop(\n Math.max(normLow, 0.01), \n Math.min(normHigh, 0.99), \n order\n );\n return applyFIRFilter(data, coefficients);\n}\n\n// ============================================\n// FIR Filter Design (Windowed Sinc)\n// ============================================\n\n/**\n * Design FIR low-pass filter coefficients\n */\nfunction designFIRLowPass(normalizedCutoff: number, order: number): Float32Array {\n const n = 2 * order + 1;\n const coeffs = new Float32Array(n);\n const fc = normalizedCutoff;\n \n for (let i = 0; i < n; i++) {\n const m = i - order;\n if (m === 0) {\n coeffs[i] = 2 * fc;\n } else {\n coeffs[i] = Math.sin(2 * Math.PI * fc * m) / (Math.PI * m);\n }\n // Apply Hamming window\n coeffs[i] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n }\n \n // Normalize\n let sum = 0;\n for (let i = 0; i < n; i++) sum += coeffs[i];\n for (let i = 0; i < n; i++) coeffs[i] /= sum;\n \n return coeffs;\n}\n\n/**\n * Design FIR high-pass filter coefficients\n */\nfunction designFIRHighPass(normalizedCutoff: number, order: number): Float32Array {\n const lowPass = designFIRLowPass(normalizedCutoff, order);\n const n = lowPass.length;\n const coeffs = new Float32Array(n);\n \n // Spectral inversion\n for (let i = 0; i < n; i++) {\n coeffs[i] = -lowPass[i];\n }\n coeffs[order] += 1;\n \n return coeffs;\n}\n\n/**\n * Design FIR band-pass filter coefficients\n */\nfunction designFIRBandPass(\n normalizedLow: number, \n normalizedHigh: number, \n order: number\n): Float32Array {\n const n = 2 * order + 1;\n const coeffs = new Float32Array(n);\n const fcLow = normalizedLow;\n const fcHigh = normalizedHigh;\n \n for (let i = 0; i < n; i++) {\n const m = i - order;\n if (m === 0) {\n coeffs[i] = 2 * (fcHigh - fcLow);\n } else {\n coeffs[i] = (Math.sin(2 * Math.PI * fcHigh * m) - Math.sin(2 * Math.PI * fcLow * m)) \n / (Math.PI * m);\n }\n // Apply Hamming window\n coeffs[i] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * i / (n - 1));\n }\n \n return coeffs;\n}\n\n/**\n * Design FIR band-stop filter coefficients\n */\nfunction designFIRBandStop(\n normalizedLow: number, \n normalizedHigh: number, \n order: number\n): Float32Array {\n const bandPass = designFIRBandPass(normalizedLow, normalizedHigh, order);\n const n = bandPass.length;\n const coeffs = new Float32Array(n);\n \n // Spectral inversion\n for (let i = 0; i < n; i++) {\n coeffs[i] = -bandPass[i];\n }\n coeffs[order] += 1;\n \n return coeffs;\n}\n\n/**\n * Apply FIR filter to data\n */\nfunction applyFIRFilter(data: Float32Array | Float64Array, coeffs: Float32Array): Float32Array {\n const n = data.length;\n const m = coeffs.length;\n const halfM = Math.floor(m / 2);\n const result = new Float32Array(n);\n \n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (let j = 0; j < m; j++) {\n const idx = i - halfM + j;\n if (idx >= 0 && idx < n) {\n sum += data[idx] * coeffs[j];\n }\n }\n result[i] = sum;\n }\n \n return result;\n}\n\n// ============================================\n// IIR Butterworth Filter\n// ============================================\n\n/**\n * Apply Butterworth filter (IIR)\n */\nexport function butterworth(\n data: Float32Array | Float64Array,\n options: ButterworthOptions\n): Float32Array {\n const { type, cutoff, cutoffHigh, sampleRate = 1.0, order = 2 } = options;\n const wc = (2 * cutoff) / sampleRate; // Normalized frequency (0-1)\n const wc2 = cutoffHigh ? (2 * cutoffHigh) / sampleRate : undefined;\n \n // Design filter coefficients\n const { b, a } = designButterworth(type, wc, wc2, order);\n \n // Apply filter (forward-backward for zero phase)\n return filtfilt(data, b, a);\n}\n\n/**\n * Apply a single frequency notch filter to remove periodic noise.\n * Implementing a 2nd order IIR notch filter.\n */\nexport function singleFrequencyFilter(\n data: Float32Array | Float64Array,\n options: SingleFrequencyFilterOptions\n): Float32Array {\n const { frequency, sampleRate, bandwidth = 1.0 } = options;\n const { b, a } = designNotchFilter(frequency, sampleRate, bandwidth);\n \n // Apply zero-phase filtering\n return filtfilt(data, b, a);\n}\n\n/**\n * Design 2nd order IIR Notch Filter coefficients.\n * H(z) = (1 - 2*cos(w0)*z^-1 + z^-2) / (1 - 2*r*cos(w0)*z^-1 + r^2*z^-2)\n */\nfunction designNotchFilter(\n frequency: number,\n sampleRate: number,\n bandwidth: number\n): { b: number[]; a: number[] } {\n const w0 = (2 * Math.PI * frequency) / sampleRate;\n const bw = (2 * Math.PI * bandwidth) / sampleRate;\n \n // r is the pole radius, related to bandwidth\n const r = 1 - (bw / 2);\n \n const cosW0 = Math.cos(w0);\n \n const b = [1, -2 * cosW0, 1];\n const a = [1, -2 * r * cosW0, r * r];\n \n return { b, a };\n}\n\n/**\n * Design Butterworth filter coefficients\n */\nfunction designButterworth(\n type: FilterType,\n wc: number,\n wc2: number | undefined,\n order: number\n): { b: number[]; a: number[] } {\n // Pre-warp for bilinear transform\n const wa = Math.tan(Math.PI * wc / 2);\n \n // Simple 2nd order Butterworth for now\n // Extended implementation would support higher orders\n const effectiveOrder = Math.min(order, 4);\n \n if (type === 'lowpass') {\n return butterLowPass(wa, effectiveOrder);\n } else if (type === 'highpass') {\n return butterHighPass(wa, effectiveOrder);\n } else if (type === 'bandpass' && wc2) {\n const wa2 = Math.tan(Math.PI * wc2 / 2);\n return butterBandPass(wa, wa2, effectiveOrder);\n } else if (type === 'bandstop' && wc2) {\n const wa2 = Math.tan(Math.PI * wc2 / 2);\n return butterBandStop(wa, wa2, effectiveOrder);\n }\n \n // Default to lowpass\n return butterLowPass(wa, effectiveOrder);\n}\n\n/**\n * 2nd order Butterworth low-pass coefficients\n */\nfunction butterLowPass(wa: number, _order: number): { b: number[]; a: number[] } {\n const k = wa;\n const k2 = k * k;\n const sqrt2 = Math.sqrt(2);\n \n const norm = 1 / (1 + sqrt2 * k + k2);\n \n return {\n b: [k2 * norm, 2 * k2 * norm, k2 * norm],\n a: [1, 2 * (k2 - 1) * norm, (1 - sqrt2 * k + k2) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth high-pass coefficients\n */\nfunction butterHighPass(wa: number, _order: number): { b: number[]; a: number[] } {\n const k = wa;\n const k2 = k * k;\n const sqrt2 = Math.sqrt(2);\n \n const norm = 1 / (1 + sqrt2 * k + k2);\n \n return {\n b: [norm, -2 * norm, norm],\n a: [1, 2 * (k2 - 1) * norm, (1 - sqrt2 * k + k2) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth band-pass coefficients\n */\nfunction butterBandPass(waLow: number, waHigh: number, _order: number): { b: number[]; a: number[] } {\n const w0 = Math.sqrt(waLow * waHigh);\n const bw = waHigh - waLow;\n const q = w0 / bw;\n \n const norm = 1 / (1 + w0 / q + w0 * w0);\n \n return {\n b: [w0 / q * norm, 0, -w0 / q * norm],\n a: [1, 2 * (w0 * w0 - 1) * norm, (1 - w0 / q + w0 * w0) * norm],\n };\n}\n\n/**\n * 2nd order Butterworth band-stop coefficients\n */\nfunction butterBandStop(waLow: number, waHigh: number, _order: number): { b: number[]; a: number[] } {\n const w0 = Math.sqrt(waLow * waHigh);\n const bw = waHigh - waLow;\n const q = w0 / bw;\n \n const norm = 1 / (1 + w0 / q + w0 * w0);\n \n return {\n b: [(1 + w0 * w0) * norm, 2 * (w0 * w0 - 1) * norm, (1 + w0 * w0) * norm],\n a: [1, 2 * (w0 * w0 - 1) * norm, (1 - w0 / q + w0 * w0) * norm],\n };\n}\n\n/**\n * Apply IIR filter (single direction)\n */\nfunction iirFilter(data: Float32Array | Float64Array, b: number[], a: number[]): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n for (let i = 0; i < n; i++) {\n result[i] = b[0] * data[i];\n \n for (let j = 1; j < b.length; j++) {\n if (i - j >= 0) {\n result[i] += b[j] * data[i - j];\n result[i] -= a[j] * result[i - j];\n }\n }\n }\n \n return result;\n}\n\n/**\n * Forward-backward filtering for zero-phase response\n */\nfunction filtfilt(data: Float32Array | Float64Array, b: number[], a: number[]): Float32Array {\n // Forward pass\n const forward = iirFilter(data, b, a);\n \n // Reverse\n const reversed = new Float32Array(forward.length);\n for (let i = 0; i < forward.length; i++) {\n reversed[i] = forward[forward.length - 1 - i];\n }\n \n // Backward pass\n const backward = iirFilter(reversed, b, a);\n \n // Reverse again\n const result = new Float32Array(backward.length);\n for (let i = 0; i < backward.length; i++) {\n result[i] = backward[backward.length - 1 - i];\n }\n \n return result;\n}\n\n// ============================================\n// Smoothing Filters\n// ============================================\n\n/**\n * Exponential moving average filter\n */\nexport function exponentialMovingAverage(\n data: Float32Array | Float64Array,\n alpha: number = 0.3\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n result[0] = data[0];\n for (let i = 1; i < n; i++) {\n result[i] = alpha * data[i] + (1 - alpha) * result[i - 1];\n }\n \n return result;\n}\n\n/**\n * Gaussian smoothing filter\n */\nexport function gaussianSmooth(\n data: Float32Array | Float64Array,\n sigma: number = 2\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n \n // Generate Gaussian kernel\n const kernelSize = Math.ceil(sigma * 3) * 2 + 1;\n const halfKernel = Math.floor(kernelSize / 2);\n const kernel = new Float32Array(kernelSize);\n \n let sum = 0;\n for (let i = 0; i < kernelSize; i++) {\n const x = i - halfKernel;\n kernel[i] = Math.exp(-(x * x) / (2 * sigma * sigma));\n sum += kernel[i];\n }\n \n // Normalize\n for (let i = 0; i < kernelSize; i++) {\n kernel[i] /= sum;\n }\n \n // Convolve\n for (let i = 0; i < n; i++) {\n let acc = 0;\n for (let j = 0; j < kernelSize; j++) {\n const idx = i - halfKernel + j;\n if (idx >= 0 && idx < n) {\n acc += data[idx] * kernel[j];\n }\n }\n result[i] = acc;\n }\n \n return result;\n}\n\n/**\n * Savitzky-Golay smoothing filter\n */\nexport function savitzkyGolay(\n data: Float32Array | Float64Array,\n windowSize: number = 5,\n polynomialOrder: number = 2\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const halfWindow = Math.floor(windowSize / 2);\n \n // Pre-compute coefficients for polynomial fitting\n const coeffs = computeSGCoefficients(windowSize, polynomialOrder);\n \n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (let j = -halfWindow; j <= halfWindow; j++) {\n const idx = i + j;\n if (idx >= 0 && idx < n) {\n sum += data[idx] * coeffs[j + halfWindow];\n } else if (idx < 0) {\n sum += data[0] * coeffs[j + halfWindow];\n } else {\n sum += data[n - 1] * coeffs[j + halfWindow];\n }\n }\n result[i] = sum;\n }\n \n return result;\n}\n\n/**\n * Compute Savitzky-Golay coefficients\n */\nfunction computeSGCoefficients(windowSize: number, _order: number): Float32Array {\n const halfWindow = Math.floor(windowSize / 2);\n const coeffs = new Float32Array(windowSize);\n \n // Simple approximation for smoothing (order 0)\n // For full SG, would need matrix inversion\n const weight = 1 / windowSize;\n for (let i = 0; i < windowSize; i++) {\n // Quadratic weighting for better smoothing\n const x = i - halfWindow;\n coeffs[i] = weight * (1 - (x * x) / ((halfWindow + 1) * (halfWindow + 1)));\n }\n \n // Normalize\n let sum = 0;\n for (let i = 0; i < windowSize; i++) sum += coeffs[i];\n for (let i = 0; i < windowSize; i++) coeffs[i] /= sum;\n \n return coeffs;\n}\n\n// ============================================\n// Median Filter\n// ============================================\n\n/**\n * Median filter (good for spike removal)\n */\nexport function medianFilter(\n data: Float32Array | Float64Array,\n windowSize: number = 5\n): Float32Array {\n const n = data.length;\n const result = new Float32Array(n);\n const halfWindow = Math.floor(windowSize / 2);\n \n for (let i = 0; i < n; i++) {\n const window: number[] = [];\n \n for (let j = -halfWindow; j <= halfWindow; j++) {\n const idx = i + j;\n if (idx >= 0 && idx < n) {\n window.push(data[idx]);\n }\n }\n \n window.sort((a, b) => a - b);\n result[i] = window[Math.floor(window.length / 2)];\n }\n \n return result;\n}\n","/**\n * Contour Plot Generation (Marching Squares)\n */\n\nexport interface ContourPoint {\n x: number;\n y: number;\n}\n\nexport interface ContourLine {\n level: number;\n points: ContourPoint[];\n /** Joined polylines (populated when `joinPaths` is enabled). */\n polylines?: ContourPoint[][];\n /** Suggested isoline label placements (populated when `labels` is enabled). */\n labels?: ContourLabel[];\n}\n\n/** A placed label for an isoline, including rotation to follow the line. */\nexport interface ContourLabel {\n x: number;\n y: number;\n level: number;\n /** Text of the label (formatted level value). */\n text: string;\n /** Rotation angle in radians so the label follows the contour direction. */\n angle: number;\n}\n\nexport interface ContourOptions {\n levels?: number[];\n numLevels?: number;\n /** Join marching-squares segments into continuous polylines. */\n joinPaths?: boolean;\n /** Compute isoline label placements (implies `joinPaths`). */\n labels?: boolean;\n /**\n * Minimum polyline length (in polyline vertices) required to receive a label.\n * Prevents cluttering short/noisy isolines. Default: 6.\n */\n minLabelLength?: number;\n /** Formatter for label text. Default: fixed to 2 significant decimals. */\n labelFormatter?: (level: number) => string;\n}\n\n/**\n * Generate contour lines from a 2D grid of values\n * Values are assumed to be in row-major order: z = values[y * width + x]\n */\nexport function generateContours(\n z: Float32Array | number[],\n xValues: Float32Array | number[],\n yValues: Float32Array | number[],\n options: ContourOptions = {}\n): ContourLine[] {\n const width = xValues.length;\n const height = yValues.length;\n \n const minZ = Math.min(...z);\n const maxZ = Math.max(...z);\n \n const levels = options.levels || calculateLevels(minZ, maxZ, options.numLevels || 10);\n const result: ContourLine[] = [];\n\n for (const level of levels) {\n const segments: Array<[number, number, number, number]> = [];\n \n // Process each cell\n for (let y = 0; y < height - 1; y++) {\n for (let x = 0; x < width - 1; x++) {\n const v0 = z[y * width + x];\n const v1 = z[y * width + (x + 1)];\n const v2 = z[(y + 1) * width + (x + 1)];\n const v3 = z[(y + 1) * width + x];\n \n processCell(x, y, v0, v1, v2, v3, level, xValues, yValues, segments);\n }\n }\n \n if (segments.length > 0) {\n // Flat segment list (backwards-compatible: pairs of points).\n const points: ContourPoint[] = [];\n for (const seg of segments) {\n points.push({ x: seg[0], y: seg[1] });\n points.push({ x: seg[2], y: seg[3] });\n }\n\n const line: ContourLine = { level, points };\n\n if (options.joinPaths || options.labels) {\n const polylines = joinSegments(segments);\n line.polylines = polylines;\n\n if (options.labels) {\n line.labels = placeLabels(\n polylines,\n level,\n options.minLabelLength ?? 6,\n options.labelFormatter ?? defaultLabelFormatter\n );\n }\n }\n\n result.push(line);\n }\n }\n\n return result;\n}\n\n/**\n * Join disjoint marching-squares segments into continuous polylines by\n * chaining segments whose endpoints coincide (within a tolerance). This yields\n * smooth isolines suitable for labeling (task 3.13).\n */\nexport function joinSegments(\n segments: Array<[number, number, number, number]>,\n tolerance = 1e-6\n): ContourPoint[][] {\n const remaining = segments.map((s) => ({\n a: { x: s[0], y: s[1] },\n b: { x: s[2], y: s[3] },\n used: false,\n }));\n\n const key = (p: ContourPoint) => `${Math.round(p.x / tolerance)}:${Math.round(p.y / tolerance)}`;\n const close = (p: ContourPoint, q: ContourPoint) =>\n Math.abs(p.x - q.x) <= tolerance && Math.abs(p.y - q.y) <= tolerance;\n\n // Index segment endpoints for O(1)-ish lookup.\n const index = new Map<string, number[]>();\n remaining.forEach((seg, i) => {\n for (const p of [seg.a, seg.b]) {\n const k = key(p);\n if (!index.has(k)) index.set(k, []);\n index.get(k)!.push(i);\n }\n });\n\n const polylines: ContourPoint[][] = [];\n\n for (let i = 0; i < remaining.length; i++) {\n if (remaining[i].used) continue;\n remaining[i].used = true;\n const path: ContourPoint[] = [remaining[i].a, remaining[i].b];\n\n // Extend forward from the tail.\n let extended = true;\n while (extended) {\n extended = false;\n const tail = path[path.length - 1];\n const candidates = index.get(key(tail)) ?? [];\n for (const j of candidates) {\n if (remaining[j].used) continue;\n const seg = remaining[j];\n if (close(seg.a, tail)) {\n path.push(seg.b);\n seg.used = true;\n extended = true;\n break;\n } else if (close(seg.b, tail)) {\n path.push(seg.a);\n seg.used = true;\n extended = true;\n break;\n }\n }\n }\n\n // Extend backward from the head.\n extended = true;\n while (extended) {\n extended = false;\n const head = path[0];\n const candidates = index.get(key(head)) ?? [];\n for (const j of candidates) {\n if (remaining[j].used) continue;\n const seg = remaining[j];\n if (close(seg.b, head)) {\n path.unshift(seg.a);\n seg.used = true;\n extended = true;\n break;\n } else if (close(seg.a, head)) {\n path.unshift(seg.b);\n seg.used = true;\n extended = true;\n break;\n }\n }\n }\n\n polylines.push(path);\n }\n\n return polylines;\n}\n\nfunction defaultLabelFormatter(level: number): string {\n const abs = Math.abs(level);\n if (abs !== 0 && (abs < 0.01 || abs >= 1e5)) return level.toExponential(1);\n return level.toFixed(2).replace(/\\.00$/, '');\n}\n\n/**\n * Place one label near the arc-length midpoint of each sufficiently long\n * polyline, rotated to follow the local isoline direction so it reads naturally\n * at different zoom levels. The tangent is estimated over a small window of\n * neighbouring vertices (rather than the two immediate neighbours) so the angle\n * is smooth and the label doesn't jitter on wiggly isolines.\n */\nfunction placeLabels(\n polylines: ContourPoint[][],\n level: number,\n minLength: number,\n formatter: (level: number) => string\n): ContourLabel[] {\n const labels: ContourLabel[] = [];\n const text = formatter(level);\n\n for (const line of polylines) {\n if (line.length < minLength) continue;\n\n // Find the vertex closest to the polyline's arc-length midpoint so the label\n // sits on the visual middle of the isoline even when vertices are unevenly\n // spaced (marching-squares output clusters points near saddles).\n let total = 0;\n for (let i = 1; i < line.length; i++) {\n total += Math.hypot(line[i].x - line[i - 1].x, line[i].y - line[i - 1].y);\n }\n const half = total / 2;\n let acc = 0;\n let midIdx = Math.floor(line.length / 2);\n for (let i = 1; i < line.length; i++) {\n acc += Math.hypot(line[i].x - line[i - 1].x, line[i].y - line[i - 1].y);\n if (acc >= half) {\n midIdx = i;\n break;\n }\n }\n\n const p = line[midIdx];\n // Smooth tangent over a window of ±win vertices.\n const win = Math.min(3, Math.floor(line.length / 4)) || 1;\n const prev = line[Math.max(0, midIdx - win)];\n const next = line[Math.min(line.length - 1, midIdx + win)];\n\n let angle = Math.atan2(next.y - prev.y, next.x - prev.x);\n // Keep text upright (avoid upside-down labels).\n if (angle > Math.PI / 2) angle -= Math.PI;\n if (angle < -Math.PI / 2) angle += Math.PI;\n\n labels.push({ x: p.x, y: p.y, level, text, angle });\n }\n\n return labels;\n}\n\nfunction calculateLevels(min: number, max: number, n: number): number[] {\n const levels = [];\n const step = (max - min) / (n + 1);\n for (let i = 1; i <= n; i++) {\n levels.push(min + i * step);\n }\n return levels;\n}\n\n/**\n * Process a single cell using Marching Squares\n */\nfunction processCell(\n x: number, y: number,\n v0: number, v1: number, v2: number, v3: number,\n level: number,\n xScale: any, yScale: any,\n segments: Array<[number, number, number, number]>\n) {\n let caseIndex = 0;\n if (v0 >= level) caseIndex |= 1;\n if (v1 >= level) caseIndex |= 2;\n if (v2 >= level) caseIndex |= 4;\n if (v3 >= level) caseIndex |= 8;\n\n if (caseIndex === 0 || caseIndex === 15) return;\n\n // Interpolation helpers\n const lerp = (v0: number, v1: number, t: number) => v0 + (v1 - v0) * t;\n const getT = (v0: number, v1: number) => (level - v0) / (v1 - v0);\n\n // Edges: 0 (top), 1 (right), 2 (bottom), 3 (left)\n const getPoint = (edge: number): [number, number] => {\n switch (edge) {\n case 0: return [lerp(xScale[x], xScale[x + 1], getT(v0, v1)), yScale[y]];\n case 1: return [xScale[x + 1], lerp(yScale[y], yScale[y + 1], getT(v1, v2))];\n case 2: return [lerp(xScale[x], xScale[x + 1], getT(v3, v2)), yScale[y + 1]];\n case 3: return [xScale[x], lerp(yScale[y], yScale[y + 1], getT(v0, v3))];\n default: return [0, 0];\n }\n };\n\n const addSeg = (e1: number, e2: number) => {\n const p1 = getPoint(e1);\n const p2 = getPoint(e2);\n segments.push([p1[0], p1[1], p2[0], p2[1]]);\n };\n\n // Case table\n switch (caseIndex) {\n case 1: case 14: addSeg(0, 3); break;\n case 2: case 13: addSeg(0, 1); break;\n case 3: case 12: addSeg(1, 3); break;\n case 4: case 11: addSeg(1, 2); break;\n case 5: addSeg(0, 1); addSeg(2, 3); break; // Ambiguous\n case 6: case 9: addSeg(0, 2); break;\n case 7: case 8: addSeg(2, 3); break;\n case 10: addSeg(0, 3); addSeg(1, 2); break; // Ambiguous\n }\n}\n","/**\n * Advanced Statistical Analysis\n * \n * Provides:\n * - Cross-correlation\n * - Auto-correlation\n * - Anomaly detection\n * - Statistical tests\n * - Numerical integration (Simpson, trapezoidal)\n */\n\n// ============================================\n// Correlation Analysis\n// ============================================\n\n/** Cross-correlation result */\nexport interface CorrelationResult {\n /** Correlation values at each lag */\n correlation: Float32Array;\n /** Lag values */\n lags: Float32Array;\n /** Maximum correlation value */\n maxCorrelation: number;\n /** Lag at maximum correlation */\n lagAtMax: number;\n}\n\n/**\n * Compute cross-correlation between two signals\n */\nexport function crossCorrelation(\n signal1: Float32Array | Float64Array,\n signal2: Float32Array | Float64Array,\n maxLag?: number\n): CorrelationResult {\n const n1 = signal1.length;\n const n2 = signal2.length;\n const effectiveMaxLag = maxLag ?? Math.min(n1, n2) - 1;\n const numLags = 2 * effectiveMaxLag + 1;\n \n const correlation = new Float32Array(numLags);\n const lags = new Float32Array(numLags);\n \n // Compute means\n let mean1 = 0, mean2 = 0;\n for (let i = 0; i < n1; i++) mean1 += signal1[i];\n for (let i = 0; i < n2; i++) mean2 += signal2[i];\n mean1 /= n1;\n mean2 /= n2;\n \n // Compute standard deviations\n let std1 = 0, std2 = 0;\n for (let i = 0; i < n1; i++) std1 += (signal1[i] - mean1) ** 2;\n for (let i = 0; i < n2; i++) std2 += (signal2[i] - mean2) ** 2;\n std1 = Math.sqrt(std1 / n1);\n std2 = Math.sqrt(std2 / n2);\n \n const normFactor = std1 * std2 * Math.min(n1, n2);\n \n let maxCorr = -Infinity;\n let maxLagIdx = 0;\n \n for (let lagIdx = 0; lagIdx < numLags; lagIdx++) {\n const lag = lagIdx - effectiveMaxLag;\n lags[lagIdx] = lag;\n \n let sum = 0;\n \n for (let i = 0; i < n1; i++) {\n const j = i + lag;\n if (j >= 0 && j < n2) {\n sum += (signal1[i] - mean1) * (signal2[j] - mean2);\n }\n }\n \n correlation[lagIdx] = normFactor > 0 ? sum / normFactor : 0;\n \n if (correlation[lagIdx] > maxCorr) {\n maxCorr = correlation[lagIdx];\n maxLagIdx = lagIdx;\n }\n }\n \n return {\n correlation,\n lags,\n maxCorrelation: maxCorr,\n lagAtMax: lags[maxLagIdx],\n };\n}\n\n/**\n * Compute auto-correlation of a signal\n */\nexport function autoCorrelation(\n signal: Float32Array | Float64Array,\n maxLag?: number\n): CorrelationResult {\n return crossCorrelation(signal, signal, maxLag);\n}\n\n// ============================================\n// Anomaly Detection\n// ============================================\n\n/** Anomaly detection result */\nexport interface AnomalyResult {\n /** Indices of anomalous points */\n indices: number[];\n /** Anomaly scores for all points */\n scores: Float32Array;\n /** Threshold used for detection */\n threshold: number;\n}\n\n/** Anomaly detection options */\nexport interface AnomalyOptions {\n /** Detection method */\n method?: 'zscore' | 'mad' | 'iqr' | 'isolation';\n /** Threshold multiplier (default: 3 for zscore, 2.5 for mad, 1.5 for iqr) */\n threshold?: number;\n /** Window size for local anomaly detection (default: use global) */\n windowSize?: number;\n}\n\n/**\n * Detect anomalies in a signal\n */\nexport function detectAnomalies(\n data: Float32Array | Float64Array,\n options: AnomalyOptions = {}\n): AnomalyResult {\n const { method = 'zscore', windowSize } = options;\n \n switch (method) {\n case 'zscore':\n return detectAnomaliesZScore(data, options.threshold ?? 3, windowSize);\n case 'mad':\n return detectAnomaliesMAD(data, options.threshold ?? 2.5, windowSize);\n case 'iqr':\n return detectAnomaliesIQR(data, options.threshold ?? 1.5);\n case 'isolation':\n return detectAnomaliesIsolation(data, options.threshold ?? 0.5);\n default:\n return detectAnomaliesZScore(data, 3, windowSize);\n }\n}\n\n/**\n * Z-score based anomaly detection\n */\nfunction detectAnomaliesZScore(\n data: Float32Array | Float64Array,\n threshold: number,\n windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n if (windowSize && windowSize < n) {\n // Local anomaly detection\n const halfWindow = Math.floor(windowSize / 2);\n \n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(n, i + halfWindow + 1);\n \n let mean = 0;\n for (let j = start; j < end; j++) mean += data[j];\n mean /= (end - start);\n \n let std = 0;\n for (let j = start; j < end; j++) std += (data[j] - mean) ** 2;\n std = Math.sqrt(std / (end - start));\n \n scores[i] = std > 0 ? Math.abs(data[i] - mean) / std : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n } else {\n // Global anomaly detection\n let mean = 0;\n for (let i = 0; i < n; i++) mean += data[i];\n mean /= n;\n \n let std = 0;\n for (let i = 0; i < n; i++) std += (data[i] - mean) ** 2;\n std = Math.sqrt(std / n);\n \n for (let i = 0; i < n; i++) {\n scores[i] = std > 0 ? Math.abs(data[i] - mean) / std : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Median Absolute Deviation (MAD) based anomaly detection\n */\nfunction detectAnomaliesMAD(\n data: Float32Array | Float64Array,\n threshold: number,\n _windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n // Compute median\n const sorted = Array.from(data).sort((a, b) => a - b);\n const median = sorted[Math.floor(n / 2)];\n \n // Compute MAD\n const absDeviations = sorted.map(x => Math.abs(x - median)).sort((a, b) => a - b);\n const mad = absDeviations[Math.floor(n / 2)];\n const scaledMad = 1.4826 * mad; // Scale factor for normal distribution\n \n for (let i = 0; i < n; i++) {\n scores[i] = scaledMad > 0 ? Math.abs(data[i] - median) / scaledMad : 0;\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * IQR (Interquartile Range) based anomaly detection\n */\nfunction detectAnomaliesIQR(\n data: Float32Array | Float64Array,\n threshold: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n const sorted = Array.from(data).sort((a, b) => a - b);\n const q1 = sorted[Math.floor(n * 0.25)];\n const q3 = sorted[Math.floor(n * 0.75)];\n const iqr = q3 - q1;\n \n const lowerBound = q1 - threshold * iqr;\n const upperBound = q3 + threshold * iqr;\n \n for (let i = 0; i < n; i++) {\n if (data[i] < lowerBound) {\n scores[i] = (lowerBound - data[i]) / iqr;\n indices.push(i);\n } else if (data[i] > upperBound) {\n scores[i] = (data[i] - upperBound) / iqr;\n indices.push(i);\n } else {\n scores[i] = 0;\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Simplified isolation-based anomaly detection\n */\nfunction detectAnomaliesIsolation(\n data: Float32Array | Float64Array,\n threshold: number,\n _windowSize?: number\n): AnomalyResult {\n const n = data.length;\n const scores = new Float32Array(n);\n const indices: number[] = [];\n \n // For each point, count how many neighbors are close\n const neighborRadius = calculateNeighborRadius(data);\n \n for (let i = 0; i < n; i++) {\n let neighborCount = 0;\n \n for (let j = 0; j < n; j++) {\n if (i !== j && Math.abs(data[i] - data[j]) < neighborRadius) {\n neighborCount++;\n }\n }\n \n // Isolation score: fewer neighbors = more isolated = higher score\n scores[i] = 1 - (neighborCount / n);\n \n if (scores[i] > threshold) {\n indices.push(i);\n }\n }\n \n return { indices, scores, threshold };\n}\n\n/**\n * Calculate neighbor radius for isolation detection\n */\nfunction calculateNeighborRadius(data: Float32Array | Float64Array): number {\n let min = Infinity;\n let max = -Infinity;\n \n for (let i = 0; i < data.length; i++) {\n if (data[i] < min) min = data[i];\n if (data[i] > max) max = data[i];\n }\n \n return (max - min) * 0.1; // 10% of range\n}\n\n// ============================================\n// Numerical Integration\n// ============================================\n\n/**\n * Trapezoidal integration\n */\nexport function trapezoidalIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): number {\n const n = y.length;\n if (n < 2) return 0;\n \n let sum = 0;\n \n if (typeof x === 'number') {\n // Uniform spacing\n const dx = x;\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) * dx / 2;\n }\n } else if (x) {\n // Non-uniform spacing\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) * (x[i] - x[i - 1]) / 2;\n }\n } else {\n // Assume unit spacing\n for (let i = 1; i < n; i++) {\n sum += (y[i - 1] + y[i]) / 2;\n }\n }\n \n return sum;\n}\n\n/**\n * Simpson's rule integration (requires odd number of points)\n */\nexport function simpsonsIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): number {\n const n = y.length;\n if (n < 3) return trapezoidalIntegration(y, x);\n \n // Ensure odd number of points\n const useN = n % 2 === 0 ? n - 1 : n;\n \n let sum = 0;\n \n if (typeof x === 'number') {\n // Uniform spacing\n const dx = x;\n \n sum = y[0] + y[useN - 1];\n \n for (let i = 1; i < useN - 1; i++) {\n sum += (i % 2 === 0 ? 2 : 4) * y[i];\n }\n \n sum *= dx / 3;\n \n // Add last interval if we had to skip a point\n if (n !== useN) {\n sum += (y[n - 2] + y[n - 1]) * dx / 2;\n }\n } else if (x) {\n // Non-uniform spacing - use trapezoidal as fallback\n return trapezoidalIntegration(y, x);\n } else {\n // Assume unit spacing\n return simpsonsIntegration(y, 1.0);\n }\n \n return sum;\n}\n\n/**\n * Cumulative integration (returns running integral)\n */\nexport function cumulativeIntegration(\n y: Float32Array | Float64Array,\n x?: Float32Array | Float64Array | number\n): Float32Array {\n const n = y.length;\n const result = new Float32Array(n);\n \n if (n < 2) {\n result[0] = 0;\n return result;\n }\n \n result[0] = 0;\n \n if (typeof x === 'number') {\n const dx = x;\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) * dx / 2;\n }\n } else if (x) {\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) * (x[i] - x[i - 1]) / 2;\n }\n } else {\n for (let i = 1; i < n; i++) {\n result[i] = result[i - 1] + (y[i - 1] + y[i]) / 2;\n }\n }\n \n return result;\n}\n\n// ============================================\n// Statistical Tests\n// ============================================\n\n/** T-test result */\nexport interface TTestResult {\n /** T-statistic */\n tStatistic: number;\n /** Degrees of freedom */\n degreesOfFreedom: number;\n /** Approximate p-value (two-tailed) */\n pValue: number;\n /** Whether the difference is significant at 0.05 level */\n significant: boolean;\n}\n\n/**\n * Two-sample t-test (Welch's t-test)\n */\nexport function tTest(\n sample1: Float32Array | Float64Array | number[],\n sample2: Float32Array | Float64Array | number[]\n): TTestResult {\n const n1 = sample1.length;\n const n2 = sample2.length;\n \n // Calculate means\n let mean1 = 0, mean2 = 0;\n for (let i = 0; i < n1; i++) mean1 += sample1[i];\n for (let i = 0; i < n2; i++) mean2 += sample2[i];\n mean1 /= n1;\n mean2 /= n2;\n \n // Calculate variances\n let var1 = 0, var2 = 0;\n for (let i = 0; i < n1; i++) var1 += (sample1[i] - mean1) ** 2;\n for (let i = 0; i < n2; i++) var2 += (sample2[i] - mean2) ** 2;\n var1 /= (n1 - 1);\n var2 /= (n2 - 1);\n \n // Calculate t-statistic\n const se = Math.sqrt(var1 / n1 + var2 / n2);\n const tStatistic = (mean1 - mean2) / se;\n \n // Welch-Satterthwaite degrees of freedom\n const num = (var1 / n1 + var2 / n2) ** 2;\n const denom = (var1 / n1) ** 2 / (n1 - 1) + (var2 / n2) ** 2 / (n2 - 1);\n const degreesOfFreedom = num / denom;\n \n // Approximate p-value using normal distribution for large df\n const pValue = 2 * (1 - normalCDF(Math.abs(tStatistic)));\n \n return {\n tStatistic,\n degreesOfFreedom,\n pValue,\n significant: pValue < 0.05,\n };\n}\n\n/**\n * Approximate normal CDF\n */\nfunction normalCDF(x: number): number {\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n \n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x) / Math.sqrt(2);\n \n const t = 1 / (1 + p * x);\n const y = 1 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);\n \n return 0.5 * (1 + sign * y);\n}\n","/**\n * VeloPlot Engine - Data Analysis Plugin\n * \n * Provides mathematical and statistical tools including:\n * - FFT (Fast Fourier Transform)\n * - Digital Filters (Kalman, Low-pass, etc.)\n * - Curve Fitting and Regression\n * - Peak and Contour Detection\n * - Financial Indicators (SMA, EMA, RSI, etc.)\n * \n * @module plugins/analysis\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport { addFitLine } from \"./SeriesFit\";\nimport { fft } from \"./fft\";\nimport { integrate, derivative } from \"./math\";\nimport { fitData } from \"./fitting\";\nimport { \n calculateStats, validateData, detectPeaks, detectCycles, \n movingAverage, subtractBaseline, downsampleLTTB, \n formatWithPrefix, generateCycleColors \n} from \"./utils\";\nimport { sma, ema, rsi } from \"./indicators\";\nimport { singleFrequencyFilter } from \"./filters\";\n\n// ============================================\n// Core Exports (Utilities)\n// ============================================\n\nexport {\n formatWithPrefix,\n formatValue,\n formatScientific,\n getBestPrefix,\n detectCycles,\n generateCycleColors,\n detectPeaks,\n validateData,\n calculateStats,\n movingAverage,\n downsampleLTTB,\n subtractBaseline,\n} from './utils';\n\nexport {\n solveLinearSystem,\n calculateR2,\n integrate,\n derivative,\n cumulativeIntegral,\n} from './math';\n\nexport {\n fitData,\n} from './fitting';\n\nexport type {\n CycleInfo,\n Peak,\n PrefixInfo,\n ValidationResult,\n DataStats,\n} from './utils';\n\nexport type {\n FitType,\n FitOptions,\n FitResult,\n} from './fitting';\n\nexport * from './contours';\n\n// ============================================\n// Advanced Analysis (FFT, Filters, Statistics)\n// ============================================\n\nexport {\n fft,\n ifft,\n analyzeSpectrum,\n powerSpectrum,\n dominantFrequency,\n hanningWindow,\n hammingWindow,\n blackmanWindow,\n nextPowerOf2,\n analyzeComplexSpectrum,\n fftFromComplexInput,\n complexToArrays,\n arraysToComplex,\n ifftFromArrays,\n ifftComplex,\n getPositiveFrequencies,\n} from './fft';\n\nexport type {\n Complex,\n FFTResult,\n ComplexFFTResult,\n PowerSpectrumResult,\n} from './fft';\n\nexport {\n lowPassFilter,\n highPassFilter,\n bandPassFilter,\n bandStopFilter,\n butterworth,\n exponentialMovingAverage,\n gaussianSmooth,\n savitzkyGolay,\n medianFilter,\n singleFrequencyFilter,\n} from './filters';\n\nexport type {\n FilterType,\n FilterOptions,\n ButterworthOptions,\n SingleFrequencyFilterOptions,\n} from './filters';\n\nexport {\n crossCorrelation,\n autoCorrelation,\n detectAnomalies,\n trapezoidalIntegration,\n simpsonsIntegration,\n cumulativeIntegration as cumulativeIntegral2,\n tTest,\n} from './statistics';\n\nexport type {\n CorrelationResult,\n AnomalyResult,\n AnomalyOptions,\n TTestResult,\n} from './statistics';\n\n// ============================================\n// Technical/Financial Indicators\n// ============================================\n\nexport {\n sma,\n ema,\n wma,\n dema,\n tema,\n rsi,\n macd,\n stochastic,\n roc,\n momentum,\n bollingerBands,\n atr,\n standardDeviation,\n vwap,\n obv,\n adx,\n aroon,\n percentChange,\n cumsum,\n normalize,\n} from './indicators';\n\nexport type {\n IndicatorResult,\n OHLCData,\n} from './indicators';\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nexport interface PluginAnalysisConfig {\n /** Enable worker-based off-main-thread processing */\n useWorkers?: boolean;\n /** Precision for statistical calculations */\n precision?: number;\n}\n\nconst manifestAnalysis: PluginManifest = {\n name: \"velo-plot-analysis\",\n version: \"1.0.0\",\n description: \"Data analysis and signal processing for velo-plot\",\n provides: [\"analysis\"],\n tags: [\"fft\", \"filters\", \"statistics\", \"math\"],\n};\n\n/**\n * VeloPlot Analysis Plugin\n * \n * Adds comprehensive data analysis capabilities to the chart.\n */\nexport function PluginAnalysis(_config: PluginAnalysisConfig = {}): ChartPlugin<PluginAnalysisConfig> {\n let _ctx: PluginContext;\n\n return {\n manifest: manifestAnalysis,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx; \n },\n\n onDestroy(_ctx: PluginContext) {\n },\n\n api: {\n addFitLine(seriesId: string, type: any, options?: any) {\n return addFitLine(_ctx.chart, seriesId, type, options);\n },\n // Math & Stats\n integrate,\n derivative,\n calculateStats,\n validateData,\n \n // Signal Processing\n fft: (data: any) => fft(data),\n detectPeaks,\n detectCycles,\n movingAverage,\n subtractBaseline,\n downsampleLTTB,\n singleFrequencyFilter,\n \n // Fitting\n fitData,\n \n // Indicators\n sma,\n ema,\n rsi,\n \n // Utils\n formatWithPrefix,\n generateCycleColors\n }\n };\n}\n\nexport default PluginAnalysis;\n"],"names":["addFitLine","ctx","seriesId","type","options","s","data","result","fitData","bounds","xMin","dataWidth","fitResolution","fitX","fitY","i","x","fitId","sourceStyle","fft","input","n","paddedLength","nextPowerOf2","padded","bitReversePermutation","size","halfSize","angle","j","theta","wRe","wIm","evenIdx","oddIdx","tRe","tIm","ifft","spectrum","conjugated","transformed","fftComplex","c","bits","reversed","reverseBits","temp","num","p","analyzeSpectrum","sampleRate","nyquist","frequency","magnitude","phase","real","imag","powerSpectrum","power","powerDb","dominantFrequency","minFrequency","maxMag","maxIdx","hanningWindow","window","hammingWindow","blackmanWindow","a0","a1","a2","analyzeComplexSpectrum","fftFromComplexInput","resultReal","resultImag","complexToArrays","complex","arraysToComplex","ifftFromArrays","ifftComplex","getPositiveFrequencies","y","fitLinear","fitPolynomial","fitExponential","fitLogarithmic","fitPower","opts","sumX","sumY","sumXY","sumX2","slope","intercept","predict","v","prec","label","calculateR2","degree","m","A","B","sum","k","coeffs","solveLinearSystem","res","equation","xPrime","yPrime","b","a","lowPassFilter","cutoffHz","order","normalized","coefficients","designFIRLowPass","applyFIRFilter","highPassFilter","designFIRHighPass","bandPassFilter","lowCutoffHz","highCutoffHz","normLow","normHigh","designFIRBandPass","bandStopFilter","designFIRBandStop","normalizedCutoff","fc","lowPass","normalizedLow","normalizedHigh","fcLow","fcHigh","bandPass","halfM","idx","butterworth","cutoff","cutoffHigh","wc","wc2","designButterworth","filtfilt","singleFrequencyFilter","bandwidth","designNotchFilter","w0","r","cosW0","wa","butterLowPass","butterHighPass","wa2","butterBandPass","butterBandStop","_order","k2","sqrt2","norm","waLow","waHigh","bw","q","iirFilter","forward","backward","exponentialMovingAverage","alpha","gaussianSmooth","sigma","kernelSize","halfKernel","kernel","acc","savitzkyGolay","windowSize","polynomialOrder","halfWindow","computeSGCoefficients","weight","medianFilter","generateContours","z","xValues","yValues","width","height","minZ","maxZ","levels","calculateLevels","level","segments","v0","v1","v2","v3","processCell","points","seg","line","polylines","joinSegments","placeLabels","defaultLabelFormatter","tolerance","remaining","key","close","index","path","extended","tail","candidates","head","abs","minLength","formatter","labels","text","total","half","midIdx","win","prev","next","min","max","step","xScale","yScale","caseIndex","lerp","t","getT","getPoint","edge","addSeg","e1","e2","p1","p2","crossCorrelation","signal1","signal2","maxLag","n1","n2","effectiveMaxLag","numLags","correlation","lags","mean1","mean2","std1","std2","normFactor","maxCorr","maxLagIdx","lagIdx","lag","autoCorrelation","signal","detectAnomalies","method","detectAnomaliesZScore","detectAnomaliesMAD","detectAnomaliesIQR","detectAnomaliesIsolation","threshold","scores","indices","start","end","mean","std","_windowSize","sorted","median","scaledMad","q1","q3","iqr","lowerBound","upperBound","neighborRadius","calculateNeighborRadius","neighborCount","trapezoidalIntegration","dx","simpsonsIntegration","useN","cumulativeIntegration","tTest","sample1","sample2","var1","var2","se","tStatistic","denom","degreesOfFreedom","pValue","normalCDF","a3","a4","a5","sign","manifestAnalysis","PluginAnalysis","_config","_ctx","integrate","derivative","calculateStats","validateData","detectPeaks","detectCycles","movingAverage","subtractBaseline","downsampleLTTB","sma","ema","rsi","formatWithPrefix","generateCycleColors"],"mappings":"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"}
|