Start · Sprachen · JavaScript · Referenz · AnalyserNode.fftSize

AnalyserNode.fftSize

Eigenschaft

Legt die Fenstergröße in Samples fest, mit der ein <code>AnalyserNode</code> per Fast Fourier Transform (FFT) Frequenz- und Zeitbereichsdaten ermittelt.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

AnalyserNode.fftSize

Beschreibung

Die Eigenschaft fftSize eines AnalyserNode ist ein unsigned long. Sie gibt an, wie viele Samples pro Analysefenster in die Fast Fourier Transform (FFT) eingehen. Der Wert muss eine Zweierpotenz zwischen 32 und 32768 sein. Voreingestellt ist 2048.

Von fftSize hängen direkt zwei Dinge ab:

  • frequencyBinCount ist immer fftSize / 2. So viele Werte liefern getByteFrequencyData() und getFloatFrequencyData().
  • getByteTimeDomainData() und getFloatTimeDomainData() füllen bis zu fftSize Werte, also die Wellenform des aktuellen Fensters.

Mit einem größeren Wert wird die Frequenzauflösung feiner (sampleRate / fftSize Hz pro Bin), die Analyse reagiert aber träger auf Änderungen und kostet mehr Rechenzeit. Kleine Werte wie 256 oder 512 passen gut zu schnellen Balken-Visualisierungen. Große Werte wie 8192 oder mehr eignen sich für genaue Spektralanalysen, etwa für Stimmgeräte oder die Tonhöhenerkennung.

Parameter

Name Typ Default Beschreibung
$value number 2048 Neuer Wert beim Setzen: eine Zweierpotenz von 32 bis 32768.

Rückgabewert

Typ
number
Beschreibung
Die aktuelle FFT-Fenstergröße in Samples, ein unsigned long.

Beispiele

fftSize setzen und frequencyBinCount auslesen

const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();

console.log(analyser.fftSize);           // Standardwert
analyser.fftSize = 512;
console.log(analyser.frequencyBinCount); // immer fftSize / 2

// Frequenzauflösung pro Bin berechnen
const hzPerBin = audioCtx.sampleRate / analyser.fftSize;
console.log(`${hzPerBin.toFixed(2)} Hz pro Bin`);
2048 256 93.75 Hz pro Bin // bei 48000 Hz Abtastrate

Wellenform (Oszilloskop) vom Mikrofon zeichnen

const canvas = document.querySelector('canvas');
const ctx2d = canvas.getContext('2d');

const start = async () => {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const audioCtx = new AudioContext();
  const source = audioCtx.createMediaStreamSource(stream);
  const analyser = audioCtx.createAnalyser();
  analyser.fftSize = 2048;
  source.connect(analyser);

  // Zeitbereichsdaten: Puffer der Länge fftSize
  const data = new Uint8Array(analyser.fftSize);

  const draw = () => {
    requestAnimationFrame(draw);
    analyser.getByteTimeDomainData(data);
    ctx2d.clearRect(0, 0, canvas.width, canvas.height);
    ctx2d.beginPath();
    const step = canvas.width / data.length;
    data.forEach((v, i) => {
      const y = (v / 255) * canvas.height;
      i === 0 ? ctx2d.moveTo(0, y) : ctx2d.lineTo(i * step, y);
    });
    ctx2d.stroke();
  };
  draw();
};

document.querySelector('#start').addEventListener('click', start);

Ungültige Werte abfangen

const analyser = new AudioContext().createAnalyser();

const setFftSize = (node, size) => {
  try {
    node.fftSize = size;
  } catch (err) {
    console.warn(`${size} abgelehnt: ${err.name}`);
  }
  return node.fftSize;
};

console.log(setFftSize(analyser, 1000));  // keine Zweierpotenz
console.log(setFftSize(analyser, 4096));
1000 abgelehnt: IndexSizeError 2048 4096

// Wichtig · Fallstricke

Ungültige Werte lösen eine Exception aus: Ist der Wert keine Zweierpotenz oder liegt er außerhalb von 32 bis 32768, wirft der Browser eine DOMException vom Typ IndexSizeError. Der alte Wert bleibt dann erhalten.

Puffergrößen passend wählen: Für Frequenzdaten braucht man ein Array der Länge frequencyBinCount, für Zeitbereichsdaten eines der Länge fftSize. Ist ein Array zu kurz, werden überzählige Werte stillschweigend verworfen. Wenn sich fftSize zur Laufzeit ändert, müssen die Typed Arrays neu angelegt werden.

Performance und Latenz: Große Fenster wie 32768 lösen tiefe Frequenzen fein auf. Sie glätten dafür schnelle Änderungen und benötigen mehr Rechenzeit pro Frame. Zusätzlich glättet smoothingTimeConstant die Frequenzdaten über die Zeit.

Kompatibilität: Die Eigenschaft wird von allen modernen Browsern unterstützt. Sehr alte WebKit-Versionen erlaubten nur Werte bis 2048. Der AudioContext muss wegen der Autoplay-Richtlinien meist durch eine Nutzeraktion gestartet werden, zum Beispiel per Klick.