Calculate Air Changes Per Hour based on room dimensions and airflow (CFM).
Total Room Volume:0 ft³
Time for 1 Air Change:0 mins
Air Changes Per Hour (ACH):0.00
What is the Air Change Rate Calculation Formula?
The Air Change Rate, often abbreviated as ACH (Air Changes per Hour) or ACR, is a measure of the air volume added to or removed from a space divided by the volume of the space. It essentially tells you how many times the entire volume of air in a room is replaced within one hour.
The core formula used in this calculator is:
ACH = (CFM × 60) ÷ Room Volume
Where:
CFM: Cubic Feet per Minute (the output rating of your fan, HVAC system, or purifier).
60: The number of minutes in an hour.
Room Volume: Calculated as Length × Width × Height (in cubic feet).
Why is Air Change Rate Important?
Ventilation is critical for indoor air quality (IAQ). A higher ACH indicates better ventilation, which helps remove contaminants, CO2, moisture, viruses, and odors. Different environments require specific ACH levels to ensure safety and comfort.
Typical Recommended ACH Levels
Room Type
Recommended ACH
Residential Living Room
4 – 6 ACH
Kitchen / Bathroom
6 – 15 ACH
Classrooms
3 – 4 ACH
Laboratories
6 – 12 ACH
Hospital Operating Rooms
15 – 20+ ACH
Server Rooms
20 – 30+ ACH
How to Use This Calculator
To determine if your current ventilation or air purifier is sufficient:
Measure the Length and Width of the room in feet.
Measure the Height of the ceiling (standard is often 8 or 9 ft).
Input the CFM (Cubic Feet per Minute) rating of your air handling unit or air purifier.
Click calculate to see how many times per hour the air is completely cycled.
function validateInput(input) {
// Prevent negative numbers
if (input.value < 0) input.value = 0;
}
function calculateAirChangeRate() {
// 1. Get DOM elements
var lengthInput = document.getElementById('roomLength');
var widthInput = document.getElementById('roomWidth');
var heightInput = document.getElementById('roomHeight');
var cfmInput = document.getElementById('airflowCFM');
var resultsArea = document.getElementById('resultsArea');
var displayVolume = document.getElementById('displayVolume');
var displayTime = document.getElementById('displayTime');
var displayACH = document.getElementById('displayACH');
// 2. Parse values
var L = parseFloat(lengthInput.value);
var W = parseFloat(widthInput.value);
var H = parseFloat(heightInput.value);
var CFM = parseFloat(cfmInput.value);
// 3. Validation
if (isNaN(L) || isNaN(W) || isNaN(H) || isNaN(CFM) || L <= 0 || W <= 0 || H 0) {
timePerChange = 60 / ach;
}
// 7. Update UI
resultsArea.style.display = 'block';
// Format numbers for display
displayVolume.innerHTML = volume.toLocaleString('en-US', {maximumFractionDigits: 0}) + " ft³";
displayACH.innerHTML = ach.toFixed(2);
if (ach === 0) {
displayTime.innerHTML = "Infinite";
} else {
// If less than 1 minute, show seconds roughly? Or just decimals.
displayTime.innerHTML = timePerChange.toFixed(1) + " mins";
}
// Scroll to results
resultsArea.scrollIntoView({behavior: 'smooth', block: 'nearest'});
}