Speaker box calculator
A driver with Vas 30 litres, Qts 0.4 and Fs 35 Hz wants a sealed box of about 14.12 litres, rolling off near 61.87 Hz. Enter the three datasheet numbers to get the volume, resonance and efficiency-bandwidth figure before you cut wood. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Vas
- 30
- Qts
- 0.4
- Fs
- 35
- Qtc
- 0.7071067812
- Alpha
- 2.125
- Volume l
- 14.1176470588
- Fc hz
- 61.8718433538
A speaker enclosure is not a decorative crate around a driver: the air volume trapped behind the cone sets the bass alignment of the whole loudspeaker. This speaker box calculator takes the three Thiele-Small parameters that fully describe a driver for box design — Vas, the equivalent compliance volume in litres; Qts, the total Q at free-air resonance; and Fs, the free-air resonance in hertz — and returns the optimal sealed internal volume in litres for a Butterworth, maximally flat, closed-box alignment. The solver also reports the closed-box resonance Fc, the minus-three-decibel frequency F3, the compliance ratio alpha, and the efficiency-bandwidth product EBP so you can judge the alignment before you cut wood.
How optimal sealed volume is computed from Vas, Qts, and Fs
The Thiele-Small model treats the loudspeaker driver as a resonant mechanical system whose moving mass, suspension compliance, and losses are captured by three published numbers: Vas, Qts, and Fs. Vas is the volume of air whose acoustic compliance equals the driver's suspension compliance; datasheets quote it in litres. Qts is the total Q of the driver at Fs, combining electrical Qes and mechanical Qms as the parallel product Qts = Qes times Qms over Qes plus Qms.
Fs is the free-air resonance, the frequency where cone impedance peaks when the driver is not yet in a box. For a sealed enclosure the trapped air adds a stiffness in parallel with the suspension. Richard Small showed that the resulting system Q, written Qtc, equals Qts times the square root of one plus Vas over Vb.
Solving for the box volume that produces a chosen Qtc gives Vb = Vas divided by (Qtc over Qts) squared minus one. The Butterworth, or maximally flat, alignment sets Qtc to one over the square root of two, about 0.707, so the amplitude response has no peak and the minus-three-decibel frequency coincides with the closed-box resonance Fc. Fc itself is Fs times Qtc over Qts, so free-air resonance is not decorative: it places the alignment on the frequency axis even though the volume comes from Vas and Qts.
What you can do with it
Quote a car-audio sealed subwoofer box
Turn the three Thiele-Small numbers into a litre target and a closed-box Fc so a shop can fit the enclosure to a trunk while checking that EBP still favours a sealed alignment.
FAQ
How is optimal speaker box volume calculated from Vas, Qts, and Fs?
Send positive finite vas (litres), qts, and fs (hertz).
What happens if Vas, Qts, or Fs is zero or negative?
Every parameter must be a positive finite number; those failures are not billed.
Why must Qts be below about 0.707?
A sealed box can only raise system Q above the driver's Qts.
What box size does a driver with Vas 30 L, Qts 0.4 and Fs 35 Hz need?
About 14.12 litres of net internal volume for a sealed, maximally flat alignment. The box resonance and the minus-three-decibel point both land near 61.87 Hz, and the efficiency-bandwidth product is 87.5.
What does the EBP figure tell me?
EBP is Fs divided by Qts, a quick hint about which box type suits a driver. Values below about 50 favour a sealed enclosure, so check it before committing to the sealed volume this calculator returns.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/audio/speaker-box \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vas":30,"qts":0.4,"fs":35}'const res = await fetch("https://api.kit.forhosting.com/audio/speaker-box", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vas": 30,
"qts": 0.4,
"fs": 35
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/speaker-box",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vas": 30,
"qts": 0.4,
"fs": 35
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/speaker-box", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vas":30,"qts":0.4,"fs":35}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vas":30,"qts":0.4,"fs":35}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/speaker-box", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"vas": 30,
"qts": 0.4,
"fs": 35
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.speaker_box",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 200 |
max_minutes | 180 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Every parameter must be a positive finite number; zero, negatives, NaN, and Infinity fail with invalid_input and are not billed.
How optimal sealed volume is computed from Vas, Qts, and Fs
That litre count is volume_l. If Qts is already at or above 0.707, a sealed box cannot lower Qtc to the Butterworth target, because adding a box only raises Q; the request is rejected rather than inventing a non-positive volume.
Input contract, response fields, and error behaviour
POST a JSON body with three required positive finite numbers: vas, the equivalent compliance volume in litres; qts, the driver's total Q at resonance, dimensionless; and fs, the free-air resonance in hertz. Aliases are accepted so datasheet labels still work: vas_l, vas_liters, and Vas for vas; q_ts, qts_total, and Qts for qts; fs_hz, free_air_resonance, resonance, f_s, and Fs for fs. Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, NaN, Infinity, zero, and negative values fail with invalid_input naming the field and are not billed. On success the body echoes vas, qts, and fs; reports qtc, alpha, and volume_l in litres; and adds fc_hz, f3_hz (equal to Fc for this alignment), ebp equal to Fs over Qts, alignment sealed_butterworth, plus formula and note strings. Example: vas 30, qts 0.4, fs 35 yields alpha 2.125 and volume_l of about 14.12 litres, with Fc and F3 near 61.87 hertz and an EBP of 87.5.
Where a speaker box calculator earns its keep
Cabinet makers and DIY speaker builders use a speaker box calculator so published Vas, Qts, and Fs become a cutting list instead of a guess copied from a forum thread that never named its Qtc. Failed validation does not consume balance. Keep requests small, pin the rounded litre values in tests, and you get reproducible enclosure volumes for CAD templates, course labs, and edge workers without standing up a full box-modeling suite of your own. Car-audio shops quote sealed subwoofer enclosures from the same three datasheet numbers, then add displacement for the driver and any trunk constraints; having Fc and EBP in the same payload tells them whether the alignment will stay tight and sealed-like or whether a vented Keele box would reach lower. Audio-engineering courses treat the Butterworth closed box as the first worked example of Thiele-Small synthesis; a deterministic API lets a lab script mark student volumes without a spreadsheet that rounds Qtc to two decimals and drifts from one over square root two.
Integration use cases
Size a sealed DIY cabinet from the datasheet
Enter Vas in litres, Qts, and Fs in hertz from the driver sheet and cut a Butterworth sealed box to the returned volume_l, adding magnet and bracing displacement on top of the net internal litres.
Teach Thiele-Small sealed alignments
Let a lab script mark student volumes against the same Qtc = 1/√2 formula the API returns, including the rejection of Qts at or above 0.707 where a Butterworth sealed box does not exist.
Technical questions
Is volume_l the external cabinet size?
No. volume_l is net internal litres of air. Add driver displacement, bracing, stuffing, and any port volume when you dimension the outer panels.
What does the speaker box calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.