Calculate your training zones using the Karvonen Formula
Your Personalized Training Zones
Zone
Intensity
Target HR Range
Purpose
Understanding Heart Rate Reserve (HRR) and the Karvonen Formula
The Heart Rate Reserve (HRR) method, also known as the Karvonen Formula, is considered one of the most accurate ways to determine exercise intensity. Unlike the simple percentage of Max HR method, the HRR method takes your individual fitness level into account by factoring in your resting heart rate.
Why Use HRR Instead of Max HR?
Traditional heart rate zone calculations only look at your age-predicted maximum heart rate. However, two people of the same age can have vastly different fitness levels. For example, a professional athlete and a sedentary person might both have a Max HR of 180, but the athlete likely has a much lower resting heart rate (e.g., 45 vs. 75). Using HRR ensures that the "Zone 2" effort for the athlete is calibrated to their specific physiological baseline.
The Karvonen Formula Explained
The math behind this calculator follows this specific sequence:
Training in different zones triggers different physiological adaptations:
Zone 1 (50-60% HRR): Recovery and light activity. Best for warming up and cooling down.
Zone 2 (60-70% HRR): The "Aerobic Base" zone. Improves endurance and teaches the body to burn fat more efficiently.
Zone 3 (70-80% HRR): Aerobic power. Improves cardiovascular strength and respiratory efficiency.
Zone 4 (80-90% HRR): Anaerobic threshold. Increases the speed you can maintain before lactic acid builds up.
Zone 5 (90-100% HRR): Maximum effort. Sprinting and HIIT. Improves peak performance and VO2 max.
Pro Tip: To get an accurate Resting Heart Rate, measure your pulse for 60 seconds immediately after waking up, before getting out of bed, for three consecutive days and take the average.
function updateMaxHR() {
var age = document.getElementById('age').value;
if (age && age > 0) {
document.getElementById('maxHR').value = 220 – age;
}
}
function calculateHRR() {
var age = parseFloat(document.getElementById('age').value);
var rest = parseFloat(document.getElementById('restingHR').value);
var max = parseFloat(document.getElementById('maxHR').value);
if (isNaN(age) || isNaN(rest) || isNaN(max)) {
alert("Please enter valid numbers for all fields.");
return;
}
if (rest >= max) {
alert("Resting Heart Rate must be lower than Maximum Heart Rate.");
return;
}
var hrr = max – rest;
var tableBody = document.getElementById('zoneTableBody');
tableBody.innerHTML = "";
var zones = [
{ name: "Zone 1", label: "Recovery", low: 0.50, high: 0.60, color: "#9e9e9e", purpose: "Active recovery, warmup" },
{ name: "Zone 2", label: "Aerobic", low: 0.60, high: 0.70, color: "#4caf50", purpose: "Endurance & fat metabolism" },
{ name: "Zone 3", label: "Tempo", low: 0.70, high: 0.80, color: "#ff9800", purpose: "Cardiovascular efficiency" },
{ name: "Zone 4", label: "Threshold", low: 0.80, high: 0.90, color: "#f44336", purpose: "Increase anaerobic capacity" },
{ name: "Zone 5", label: "Redline", low: 0.90, high: 1.00, color: "#b71c1c", purpose: "Max performance, VO2 Max" }
];
for (var i = 0; i < zones.length; i++) {
var zone = zones[i];
var lowBPM = Math.round((hrr * zone.low) + rest);
var highBPM = Math.round((hrr * zone.high) + rest);
var row = document.createElement('tr');
row.innerHTML =
'