Signatur
Beschreibung
Der Konstruktor BiquadFilterNode() erzeugt einen Filterknoten für die Web Audio API. Ein Biquad-Filter ist ein Filter zweiter Ordnung. Mit ihm lassen sich typische Klangformungen umsetzen: Tiefpass (lowpass), Hochpass (highpass), Bandpass, Kerbfilter (notch), Kuhschwanzfilter (lowshelf/highshelf), parametrischer EQ (peaking) und Allpass.
Im Unterschied zur älteren Fabrikmethode AudioContext.createBiquadFilter() kannst du alle Startwerte direkt über ein options-Objekt übergeben. Das ist kompakter und passt zum heutigen Konstruktor-Stil der Web Audio API. Der Knoten hat genau einen Eingang und einen Ausgang. Du baust ihn mit connect() zwischen Quelle und Ziel ein.
Die Eigenschaften frequency, detune, Q und gain sind AudioParam-Objekte. Du kannst sie also zur Laufzeit zeitgenau automatisieren, etwa mit setValueAtTime() oder linearRampToValueAtTime(). Klassische Anwendungen sind Filter-Sweeps bei Synthesizern, Equalizer in Audio-Playern und das Entfernen von Brummen oder Rauschen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | BaseAudioContext | Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehören soll. |
|
| $options | object | {} | Optionale Startwerte:
|
Rückgabewert
BiquadFilterNode, der fest an den übergebenen Kontext gebunden ist.Beispiele
Tiefpassfilter für einen Oszillator
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 220 });
const filter = new BiquadFilterNode(ctx, {
type: 'lowpass',
frequency: 800,
Q: 5
});
osc.connect(filter).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 2);
console.log(filter.type, filter.frequency.value, filter.Q.value);
Filter-Sweep per AudioParam-Automatisierung
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'square', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', Q: 12 });
const now = ctx.currentTime;
// Grenzfrequenz in 3 Sekunden von 200 Hz auf 5000 Hz anheben
filter.frequency.setValueAtTime(200, now);
filter.frequency.exponentialRampToValueAtTime(5000, now + 3);
osc.connect(filter).connect(ctx.destination);
osc.start(now);
osc.stop(now + 3);
Einfacher 3-Band-Equalizer für ein Audio-Element
const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = new MediaElementAudioSourceNode(ctx, { mediaElement: audio });
const bass = new BiquadFilterNode(ctx, { type: 'lowshelf', frequency: 200, gain: 6 });
const mid = new BiquadFilterNode(ctx, { type: 'peaking', frequency: 1000, Q: 1, gain: -3 });
const treble = new BiquadFilterNode(ctx, { type: 'highshelf', frequency: 4000, gain: 4 });
source.connect(bass).connect(mid).connect(treble).connect(ctx.destination);
// Autoplay-Richtlinien: Kontext erst nach Nutzeraktion fortsetzen
audio.addEventListener('play', () => ctx.resume());
Frequenzgang berechnen mit getFrequencyResponse()
const ctx = new AudioContext();
const filter = new BiquadFilterNode(ctx, { type: 'highpass', frequency: 1000 });
const freqs = new Float32Array([100, 1000, 10000]);
const mag = new Float32Array(3);
const phase = new Float32Array(3);
filter.getFrequencyResponse(freqs, mag, phase);
freqs.forEach((f, i) => console.log(`${f} Hz: ${mag[i].toFixed(3)}`));
// Wichtig · Fallstricke
- Autoplay-Sperre: Ein
AudioContextstartet in vielen Browsern im Zustandsuspended. Erst einctx.resume()nach einer Nutzeraktion (z. B. einem Klick) macht den Ton hörbar. - Der Parameter
gainwirkt nur beilowshelf,highshelfundpeaking. BeilowshelfundhighshelfwirdQignoriert. - Ein ungültiger
type-String imoptions-Objekt löst einenTypeErroraus. exponentialRampToValueAtTime()akzeptiert weder 0 noch einen Wechsel des Vorzeichens. Beginne einen Frequenz-Sweep deshalb bei einem positiven Wert.- Sehr hohe
Q-Werte führen zu starker Resonanz und können übersteuern. Setze bei Bedarf einenGainNodedahinter. - Kompatibilität: Der Konstruktor ist in allen aktuellen Browsern verfügbar. Sehr alte Browser (z. B. Safari vor 14.1) kennen nur
ctx.createBiquadFilter(), das du als Rückfallebene nutzen kannst. - Für Filter höherer Ordnung schaltest du mehrere Knoten hintereinander. Für eigene Filterkoeffizienten gibt es
IIRFilterNode.