/ concept-collection / timeseries-compressibility
Sign in
concept-collection / timeseries-compressibility
Go to fileHistoryFork
.githubAdd GitHub Pages deploy workflow
srcEstimate the reference rate R in the browser
.gitignoreCharge rounding at full variance: R = min(spectral rate, one-sample ceiling)
index.htmlInteractive explorer for compressibility of quantized filtered Gaussian time series
package-lock.jsonInteractive explorer for compressibility of quantized filtered Gaussian time series
package.jsonInteractive explorer for compressibility of quantized filtered Gaussian time series
README.mdEstimate the reference rate R in the browser
tsconfig.app.jsonInteractive explorer for compressibility of quantized filtered Gaussian time series
tsconfig.jsonInteractive explorer for compressibility of quantized filtered Gaussian time series
tsconfig.node.jsonInteractive explorer for compressibility of quantized filtered Gaussian time series
vite.config.tsInteractive explorer for compressibility of quantized filtered Gaussian time series

timeseries-compressibility#

Interactive exploration of how compressible quantized time series are.

The generating model is: i.i.d. Gaussian noise (std σ, measured in quantization steps) → FIR filter → round to integers. The app shows the filter (convolution kernel and frequency response, with cutoffs in Hz against a chosen sample rate), a window of the generated integer signal (stationary by default, with a play toggle to let it stream endlessly), and the measured compression of a block of the generated integers under nine methods — zlib, zstd, and an rANS entropy coder, each raw, delta-coded, and LPC-residual-coded — as bits per sample and as ratio against raw int16 storage. The predictor order and the block size are controls, so the measurement can be pushed from 10k to a million samples and LPC from order 1 to 128. Each prefilter group also carries a hollow bar: the order-0 entropy of the stream being coded, the limit a per-sample entropy coder cannot beat, which ANS misses by 1–2% (its symbol table plus its own arithmetic loss).

The reference rate R — the entropy rate of the process, the bits/sample limit no lossless method can beat — is estimated in the browser by the method of the companion timeseries-entropy package: an unbiased Monte-Carlo estimator of H(z_next | a long past), by Gibbs sampling the latent Gaussian under the rounding constraints and applying Rhee–Glynn randomized telescoping to the sampled chain. A button starts a web worker that averages one independent past at a time (live mean ± se, dashed line on the chart) until stopped; the app also shows the exact command to run the Python original at the same settings as an independent check. The in-browser code in src/entropy/ is a hand-synced TypeScript port of that package — change one, change the other. A WebGPU Gibbs sweep may replace the scalar one someday; the sweep is isolated so it can be swapped.

Run it#

npm install
npm run dev

Layout#

src/model/       the latent source (fixed seeded randomness indexed by sample
                 position, convolved zero-phase with the kernel on demand)
                 and the FIR presets
src/entropy/     the unbiased reference-rate estimator: hand-synced TypeScript
                 port of the timeseries-entropy package (Gibbs conditional
                 sampler, Rhee–Glynn telescoping, Cody erfc / Acklam ndtri,
                 xoshiro128** RNG)
src/compress/    lossless codecs run in the browser: zlib (fflate), zstd (wasm),
                 ans.ts (a bit-identical port of simple_ans), and FLAC-style
                 integer LPC; borrowed from entropy-quantized-linear-transform
src/worker/      the codecs and the estimator run off the main thread; the
                 estimator worker refines one past at a time until terminated
src/components/  controls, filter plots, signal canvas, compression chart,
                 and the reference-rate method note

Every reported size round-trips through the decoder and includes whatever the decoder needs (ANS symbol table, LPC coefficients). The signal view and the compression block read the same fixed latent noise sequence — parameter changes transform the same underlying data rather than resampling it, and the first window shown is the start of the block that gets compressed.

moveopenescclose