C80 = 10·log₁₀( E0–80ms / E80ms–∞ ). Carica un impulso (IR) o genera una stanza sintetica, vedi le aree di energia precoce/tardiva, ascolta l'effetto sul segnale e misura il valore C80.
C80 misura il rapporto tra l'energia sonora che arriva nei primi 80 ms dopo il suono diretto (utile alla chiarezza) e l'energia che arriva dopo (percepita come riverbero che riduce l'intelligibilità). Valori tipici: +2…+8 dB indicano buona chiarezza; valori negativi (es. −2 dB) indicano ascolto confuso. Per il parlato si usa spesso C50 (soglia a 50 ms).
Dato un impulso h(t), con energia e(t)=h(t)^2, si definisce t0 al picco del diretto. Allora:
Eearly = ∫t0t0+80ms e(t) dt, Elate = ∫t0∞ e(t) dt − Eearly
C80 = 10·log10( Eearly / Elate ) (analogamente C50 sostituendo 80→50 ms)
La curva di Schroeder è l'integrale cumulativo inverso: S(τ)=∫τ∞ e(t) dt, normalizzata a 0 dB al valore massimo.
Suggerimento: carica un IR reale di un teatro, oppure genera vari RT60/DRR e ascolta come cambia l'intelligibilità.
Questa sezione documenta ogni funzione presente nell'app: scopo, parametri, ritorni e note d'uso/robustezza.
dB(x), pow10(d), ampFromDb(d), clamp(v,min,max)x in decibel (10·log10). Protegge da zero con un floor a 1e‑20.10^(d/10). Utile per operare su energie.10^(d/20). Usato nel gate relativo al picco.findT0(data, fs, mode, gateDB)Determina il riferimento temporale t0 dell'impulso:
thr = |peak|·ampFromDb(gateDB).Robustezza: gestisce lunghezze nulle, picco=0, e applica clamp alla soglia.
Ritorno: indice intero (sample) di t0.
energyBands(ir, fs, split_ms, t0)Calcola le energie early (t0→t0+split) e late (oltre split) su ir e ricava C = 10·log10(early/late).
Restituisce: { early, late, C, splitN, e } dove e è l'energia per campione.
schroeder(e)Integra all'indietro l'energia e per ottenere la curva cumulativa normalizzata 0..1 (curva di Schroeder).
decodeFile(file), mixToMono(ab)makeBurst(sec), play(buffer), playConvolved(ir)ConvolverNode, per ascoltare l'effetto ambientale.synthesizeIR(opts) & helper dbToLinCrea un'IR sintetica con diretto a 2 ms, predelay selezionabile, coda esponenziale da RT60 e riflessioni precoci sparse.
Ritorna un AudioBuffer mono.
drawAll(ir, fs, t0, splitMs)Disegna sul canvas: griglia, aree early/late, forma d'onda, curva di Schroeder e marker t0/split.
Usa un lock drawing e requestAnimationFrame per evitare ridisegni re‑entranti.
analyzeAndDraw(), setMetric, fmtdrawAll. Protetto da lock analyzing.syncLabels(), handlers, runTests(), assert()I valori considerati ottimali dipendono dall'uso dello spazio:
In generale, per la voce e la chiarezza del parlato, un intervallo di +2…+8 dB è considerato ottimale.