Start · Sprachen · JavaScript · Referenz · BiquadFilterNode.frequency

BiquadFilterNode.frequency

Eigenschaft

Schreibgeschützter a-rate <code>AudioParam</code>, der die Eck- bzw. Mittenfrequenz des Biquad-Filters in Hertz festlegt. Standardwert: 350 Hz.

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

Signatur

BiquadFilterNode.frequency

Beschreibung

BiquadFilterNode.frequency ist ein a-rate AudioParam. Er legt fest, bei welcher Frequenz (in Hertz) der Filter arbeitet. Wie der Wert wirkt, hängt vom eingestellten type ab:

  • lowpass / highpass: Grenzfrequenz (Cutoff), ab der gedämpft wird
  • bandpass / notch / peaking: Mittenfrequenz des Bandes
  • lowshelf / highshelf: Übergangsfrequenz der Kuhschwanz-Anhebung bzw. -Absenkung
  • allpass: Frequenz, bei der die Phasenverschiebung 90° beträgt

Die Eigenschaft selbst ist schreibgeschützt, denn sie verweist immer auf dasselbe AudioParam-Objekt. Ändern kann man aber dessen value oder den Wert mit den Automatisierungsmethoden zeitgenau planen, etwa mit setValueAtTime(), linearRampToValueAtTime(), exponentialRampToValueAtTime() oder setTargetAtTime(). Weil der Parameter a-rate ist, wird er für jedes einzelne Sample neu berechnet. Das ermöglicht saubere Filter-Sweeps ohne Treppeneffekte.

Außerdem lässt sich ein anderer Audioknoten an den Parameter anschließen, zum Beispiel ein OscillatorNode als LFO. So entstehen Effekte wie Auto-Wah oder rhythmisches Filtern. Das Signal des angeschlossenen Knotens wird dabei zum eingestellten Grundwert addiert.

Rückgabewert

Typ
AudioParam
Beschreibung
Ein AudioParam mit defaultValue 350, minValue 0 und maxValue gleich der Nyquist-Frequenz (context.sampleRate / 2). Die Einheit ist Hertz.

Beispiele

Tiefpass-Grenzfrequenz setzen

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass' });

// Grenzfrequenz auf 800 Hz setzen
filter.frequency.value = 800;

osc.connect(filter).connect(ctx.destination);
osc.start();

console.log(filter.frequency.defaultValue, filter.frequency.value);
350 800

Filter-Sweep mit exponentieller Rampe

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 55 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', Q: 8 });
osc.connect(filter).connect(ctx.destination);

const now = ctx.currentTime;
// Startwert fixieren, dann in 2 s von 200 Hz auf 5 kHz öffnen
filter.frequency.setValueAtTime(200, now);
filter.frequency.exponentialRampToValueAtTime(5000, now + 2);

osc.start(now);
osc.stop(now + 2.5);

Auto-Wah per LFO an frequency anschließen

const ctx = new AudioContext();
const source = new OscillatorNode(ctx, { type: 'square', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'bandpass', Q: 5, frequency: 1000 });

// LFO mit 3 Hz, Modulationstiefe ±700 Hz
const lfo = new OscillatorNode(ctx, { frequency: 3 });
const depth = new GainNode(ctx, { gain: 700 });
lfo.connect(depth).connect(filter.frequency);

source.connect(filter).connect(ctx.destination);
source.start();
lfo.start();

Frequenz per Schieberegler steuern (ohne Knacken)

const ctx = new AudioContext();
const filter = new BiquadFilterNode(ctx, { type: 'highpass' });
const slider = document.querySelector('#cutoff'); // <input type="range" min="20" max="20000">

slider.addEventListener('input', (e) => {
  const hz = Number(e.target.value);
  // Weich nachführen statt hart zu springen
  filter.frequency.setTargetAtTime(hz, ctx.currentTime, 0.02);
});

// Wichtig · Fallstricke

  • Nicht die Eigenschaft selbst zuweisen: filter.frequency = 1000 hat keine Wirkung, weil die Eigenschaft schreibgeschützt ist. Richtig ist filter.frequency.value = 1000 oder eine Automatisierungsmethode.
  • Wertebereich: Werte über der Nyquist-Frequenz (sampleRate / 2) werden auf diesen Bereich begrenzt.
  • Exponentielle Rampen: exponentialRampToValueAtTime() erlaubt weder 0 als Ziel- oder Startwert noch einen Vorzeichenwechsel. Sonst wird ein RangeError ausgelöst bzw. die Rampe verhält sich unerwartet. Setze vorher mit setValueAtTime() einen positiven Startwert. Für das Gehör sind exponentielle Frequenzverläufe meist natürlicher als lineare.
  • value-Zuweisung während einer Automatisierung: Laufen noch geplante Ereignisse, kann eine direkte Zuweisung an value ignoriert werden oder zu Sprüngen führen. Vorher cancelScheduledValues() aufrufen.
  • Harte Sprünge bei großen Frequenzänderungen können hörbare Klicks erzeugen. Dagegen hilft setTargetAtTime().
  • Der effektive Wert ergibt sich zusammen mit detune (in Cent): frequency · 2^(detune/1200).
  • Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Konstruktor new BiquadFilterNode() fehlt in sehr alten Browsern. Dort gibt es nur ctx.createBiquadFilter(). Ein AudioContext startet in der Regel erst nach einer Nutzerinteraktion (Autoplay-Richtlinie).