AnalyserNode: smoothingTimeConstant property
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
ThesmoothingTimeConstant property of theAnalyserNode interface is a double value representing the averaging constant with the last analysis frame. It's basically an average between the current buffer and the last buffer theAnalyserNode processed, and results in a much smoother set of value changes over time.
In this article
Value
A double within the range0 to1 (0 meaning no time averaging). The default value is0.8.
If 0 is set, there is no averaging done, whereas a value of 1 means "overlap the previous and current buffer quite a lot while computing the value", which essentially smooths the changes acrossAnalyserNode.getFloatFrequencyData/AnalyserNode.getByteFrequencyData calls.
In technical terms, we apply aBlackman window and smooth the values over time. The default value is good enough for most cases.
Note:If a value outside the range 0–1 is set, anINDEX_SIZE_ERR exception is thrown.
Examples
The following example shows basic usage of anAudioContext to create anAnalyserNode, thenrequestAnimationFrame and<canvas> to collect frequency data repeatedly and draw a "winamp bar graph style" output of the current audio input.For more complete applied examples/information, check out ourVoice-change-O-matic demo (seeapp.js lines 108–193 for relevant code).
If you are curious about the effect thesmoothingTimeConstant() has, try cloning the above example and settinganalyser.smoothingTimeConstant = 0; instead. You'll notice that the value changes are much more jarring.
const audioCtx = new AudioContext();const analyser = audioCtx.createAnalyser();analyser.minDecibels = -90;analyser.maxDecibels = -10;analyser.smoothingTimeConstant = 0.85;// …analyser.fftSize = 256;const bufferLength = analyser.frequencyBinCount;console.log(bufferLength);const dataArray = new Uint8Array(bufferLength);canvasCtx.clearRect(0, 0, WIDTH, HEIGHT);function draw() { drawVisual = requestAnimationFrame(draw); analyser.getByteFrequencyData(dataArray); canvasCtx.fillStyle = "rgb(0 0 0)"; canvasCtx.fillRect(0, 0, WIDTH, HEIGHT); const barWidth = (WIDTH / bufferLength) * 2.5; let barHeight; let x = 0; for (let i = 0; i < bufferLength; i++) { barHeight = dataArray[i]; canvasCtx.fillStyle = `rgb(${barHeight + 100} 50 50)`; canvasCtx.fillRect(x, HEIGHT - barHeight / 2, barWidth, barHeight / 2); x += barWidth + 1; }}draw();Specifications
| Specification |
|---|
| Web Audio API> # dom-analysernode-smoothingtimeconstant> |