Signatur
Beschreibung
Die Eigenschaft Q eines BiquadFilterNode liefert einen AudioParam, der den Qualitätsfaktor (Güte) des Filters festlegt. Die Eigenschaft selbst ist schreibgeschützt: Man weist nicht filter.Q zu, sondern setzt filter.Q.value oder nutzt die Automatisierungsmethoden wie setValueAtTime(), linearRampToValueAtTime() oder setTargetAtTime(). Als a-rate-Parameter kann der Wert für jedes einzelne Audio-Sample neu berechnet werden, was flüssige Filterfahrten ohne Knackser erlaubt.
Wie der Wert interpretiert wird, hängt vom Filtertyp (filter.type) ab:
lowpass/highpass: Q wird in Dezibel angegeben und bestimmt die Resonanzspitze an der Grenzfrequenz. Höhere Werte erzeugen einen deutlich hörbaren, „singenden" Resonanzpeak – typisch für Synthesizer-Sounds.bandpass,notch,allpass,peaking: Q ist ein linearer Wert und steuert die Bandbreite (ungefähr Mittenfrequenz ÷ Bandbreite). Großes Q = schmales Band, kleines Q = breites Band.lowshelf/highshelf: Q wird nicht verwendet.
Der Standardwert ist 1. Der nominale Wertebereich reicht vom kleinsten bis zum größten darstellbaren 32-Bit-Float; sinnvoll sind in der Praxis meist Werte zwischen etwa 0.0001 und 30 bzw. einige Dezibel bei Tief-/Hochpass.
Rückgabewert
AudioParam mit defaultValue 1 und automationRate "a-rate". Der aktuelle Wert steht in Q.value.Beispiele
Resonanten Tiefpass einstellen
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', frequency: 800 });
// Q beim Tiefpass in dB: deutliche Resonanzspitze
filter.Q.value = 12;
osc.connect(filter).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 2);
console.log(filter.Q.value, filter.Q.defaultValue);
Filterfahrt mit automatisiertem Q (Synth-Sweep)
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 55 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', frequency: 200, Q: 0 });
osc.connect(filter).connect(ctx.destination);
const t = ctx.currentTime;
// Grenzfrequenz und Resonanz gemeinsam hochfahren
filter.frequency.setValueAtTime(200, t);
filter.frequency.exponentialRampToValueAtTime(4000, t + 3);
filter.Q.setValueAtTime(0, t);
filter.Q.linearRampToValueAtTime(20, t + 3);
osc.start(t);
osc.stop(t + 3.5);
Bandpass: Q aus gewünschter Bandbreite berechnen
const ctx = new AudioContext();
const center = 1000; // Mittenfrequenz in Hz
const bandwidth = 200; // gewünschte Bandbreite in Hz
const bandpass = new BiquadFilterNode(ctx, {
type: 'bandpass',
frequency: center,
Q: center / bandwidth // lineares Q = f0 / Bandbreite
});
console.log(`Q = ${bandpass.Q.value}`);
Auswirkung von Q per Frequenzgang prüfen
const ctx = new AudioContext();
const filter = new BiquadFilterNode(ctx, { type: 'peaking', frequency: 1000, gain: 12 });
const freqs = new Float32Array([500, 1000, 2000]);
const mag = new Float32Array(3);
const phase = new Float32Array(3);
for (const q of [0.5, 5]) {
filter.Q.value = q;
filter.getFrequencyResponse(freqs, mag, phase);
const db = [...mag].map(m => (20 * Math.log10(m)).toFixed(1));
console.log(`Q=${q}:`, db.join(' dB, ') + ' dB');
}
// Wichtig · Fallstricke
- Nicht direkt zuweisen:
filter.Q = 5bewirkt nichts (bzw. wirft im Strict Mode einen Fehler), daQschreibgeschützt ist. Immerfilter.Q.valueoder Automatisierungsmethoden verwenden. - Einheit hängt vom Typ ab: Bei
lowpass/highpassist Q in dB (ein Butterworth-artiger, flacher Verlauf ohne Resonanz entspricht etwa-3.01dB), beibandpass,notch,peaking,allpassein linearer Faktor. Beilowshelf/highshelfwird Q ignoriert. - Werte ≤ 0: Bei Bandfiltern führen Q-Werte von
0oder negative Werte zu degenerierten Filtern (z. B. Stille oder unverändertes Signal). Positive Werte verwenden. - Lautstärke: Hohe Resonanz beim Tief-/Hochpass kann starke Pegelspitzen erzeugen – ggf. einen
GainNodeoderDynamicsCompressorNodenachschalten. - Automatisierung vs.
value: Wenn Automatisierungsereignisse geplant sind, wird ein direktes Setzen vonvalueeventuell überschrieben. Bei laufender Wiedergabe für weiche ÜbergängesetTargetAtTime()statt harter Sprünge nutzen, um Knackser zu vermeiden. - Kompatibilität: In allen modernen Browsern verfügbar. Ein
AudioContextstartet wegen Autoplay-Richtlinien oft im Zustandsuspendedund muss nach einer Nutzerinteraktion perctx.resume()fortgesetzt werden. Ältere WebKit-Versionen benötigtenwebkitAudioContext.