Estimate your maximal oxygen uptake based on power output.
Kilograms (kg)
Pounds (lbs)
Male
Female
Relative VO2 Max:—
Absolute VO2 Max:—
Power-to-Weight Ratio:—
Understanding Your Cycling VO2 Max
VO2 Max (Maximal Oxygen Consumption) is widely considered the gold standard for measuring cardiovascular fitness and aerobic endurance. For cyclists, it represents the maximum amount of oxygen your body can utilize during intense exercise. The higher your VO2 Max, the more oxygen your muscles can use to produce aerobic power.
How This Calculator Works
While a true VO2 Max test requires a lab environment with a gas mask to measure oxygen intake, cycling power meters allow for highly accurate estimations. This calculator uses the relationship between your Maximum Aerobic Power (MAP) and oxygen uptake.
The calculation is based on the Hawley & Noakes equation, which correlates peak power output (Wpeak) from a ramp test or maximal effort with oxygen consumption:
Formula (Absolute): VO2 (L/min) = 0.01141 × Power (Watts) + 0.435
Formula (Relative): VO2 (ml/kg/min) = (Absolute VO2 × 1000) / Body Weight (kg)
Input Guide
Body Weight: Accurate weight is crucial because VO2 Max is often expressed relative to body mass (ml/kg/min).
Max Power (Watts): Ideally, this should be your "Peak Power" from a graded exercise test (ramp test) or your average power from a maximal 5-minute effort. Do not use your FTP (Functional Threshold Power) here, as FTP is typically lower than the power achieved at VO2 Max intensities.
Interpreting Your Results
Relative VO2 Max (ml/kg/min): This is the most common metric used to compare athletes of different sizes. Professional male cyclists often have values between 70-85 ml/kg/min, while professional females typically range from 60-75 ml/kg/min. Recreational cyclists usually fall between 35-50 ml/kg/min.
Absolute VO2 Max (L/min): This measures the total volume of oxygen used regardless of weight. Heavier riders often have higher absolute numbers, which helps on flat terrain, but relative VO2 Max is the critical factor for climbing.
Improving Your VO2 Max
To increase your VO2 Max, training must occur at intensities that stress your maximal oxygen uptake system. Effective workouts include:
VO2 Max Intervals: 3 to 5-minute efforts at 110-120% of your FTP with equal rest periods.
Tabata Intervals: Short, high-intensity bursts (e.g., 20 seconds on, 10 seconds off) repeated for 4-8 minutes.
Hill Repeats: Climbing gradients require sustained high power output, naturally stimulating VO2 adaptation.
function calculateCyclingVO2() {
// Get Inputs
var weightInput = document.getElementById('cyclistWeight').value;
var unit = document.getElementById('weightUnit').value;
var powerInput = document.getElementById('maxPower').value;
var gender = document.getElementById('cyclistGender').value;
var ageInput = document.getElementById('cyclistAge').value;
// Basic Validation
if (!weightInput || !powerInput || weightInput <= 0 || powerInput <= 0) {
alert("Please enter valid positive numbers for Weight and Power.");
return;
}
var weightKg = parseFloat(weightInput);
var power = parseFloat(powerInput);
var age = parseInt(ageInput);
// Convert lbs to kg if necessary
if (unit === 'lbs') {
weightKg = weightKg * 0.453592;
}
// Calculation: Hawley & Noakes Formula
// VO2 Max (L/min) = 0.01141 * Wpeak + 0.435
var vo2Absolute = (0.01141 * power) + 0.435;
// Convert to Relative VO2 Max (ml/kg/min)
var vo2Relative = (vo2Absolute * 1000) / weightKg;
// Power to Weight Ratio (W/kg) at Max Power
var wKg = power / weightKg;
// Display Results
document.getElementById('displayAbsVO2').innerHTML = vo2Absolute.toFixed(2) + " L/min";
document.getElementById('displayRelVO2').innerHTML = vo2Relative.toFixed(1) + " ml/kg/min";
document.getElementById('displayWKg').innerHTML = wKg.toFixed(2) + " W/kg";
// Determine Rating based on Age/Gender and Relative VO2 Max
// Simplified Cooper Institute / ACSM norms logic
var rating = "";
var ratingClass = "";
if (age && !isNaN(age)) {
rating = getFitnessRating(vo2Relative, age, gender);
} else {
rating = "Enter age for fitness rating";
ratingClass = "rating-average";
}
var ratingDiv = document.getElementById('fitnessRating');
ratingDiv.innerHTML = "Fitness Category: " + rating;
// Remove old classes and add new one
ratingDiv.className = "vo2-rating"; // reset
if (rating === "Superior" || rating === "Excellent") ratingDiv.classList.add("rating-excellent");
else if (rating === "Good") ratingDiv.classList.add("rating-good");
else if (rating === "Fair" || rating === "Average") ratingDiv.classList.add("rating-average");
else ratingDiv.classList.add("rating-poor");
// Show Result Box
document.getElementById('resultBox').style.display = "block";
}
function getFitnessRating(vo2, age, gender) {
// Simple approximate lookup logic for demo purposes based on general ACSM data
// Returns: Superior, Excellent, Good, Fair, Poor
if (gender === 'male') {
if (age 55) return "Superior";
if (vo2 > 50) return "Excellent";
if (vo2 > 45) return "Good";
if (vo2 > 35) return "Fair";
return "Poor";
} else if (age 50) return "Superior";
if (vo2 > 45) return "Excellent";
if (vo2 > 40) return "Good";
if (vo2 > 33) return "Fair";
return "Poor";
} else if (age 46) return "Superior";
if (vo2 > 42) return "Excellent";
if (vo2 > 36) return "Good";
if (vo2 > 30) return "Fair";
return "Poor";
} else if (age 43) return "Superior";
if (vo2 > 38) return "Excellent";
if (vo2 > 33) return "Good";
if (vo2 > 27) return "Fair";
return "Poor";
} else {
if (vo2 > 40) return "Superior";
if (vo2 > 34) return "Excellent";
if (vo2 > 29) return "Good";
if (vo2 > 24) return "Fair";
return "Poor";
}
} else { // Female
if (age 49) return "Superior";
if (vo2 > 44) return "Excellent";
if (vo2 > 38) return "Good";
if (vo2 > 29) return "Fair";
return "Poor";
} else if (age 45) return "Superior";
if (vo2 > 40) return "Excellent";
if (vo2 > 34) return "Good";
if (vo2 > 27) return "Fair";
return "Poor";
} else if (age 41) return "Superior";
if (vo2 > 36) return "Excellent";
if (vo2 > 31) return "Good";
if (vo2 > 25) return "Fair";
return "Poor";
} else if (age 37) return "Superior";
if (vo2 > 32) return "Excellent";
if (vo2 > 27) return "Good";
if (vo2 > 22) return "Fair";
return "Poor";
} else {
if (vo2 > 34) return "Superior";
if (vo2 > 29) return "Excellent";
if (vo2 > 24) return "Good";
if (vo2 > 20) return "Fair";
return "Poor";
}
}
}