Functional Threshold Heart Rate Calculator

Functional Threshold Heart Rate (FTHR) Calculator :root { –primary-color: #ef4444; /* Heart rate red */ –secondary-color: #1f2937; –bg-color: #f3f4f6; –card-bg: #ffffff; –text-color: #374151; –border-radius: 8px; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: var(–text-color); background-color: var(–bg-color); margin: 0; padding: 20px; } .container { max-width: 800px; margin: 0 auto; } .calculator-card { background: var(–card-bg); padding: 2rem; border-radius: var(–border-radius); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); margin-bottom: 2rem; } .calculator-title { text-align: center; color: var(–secondary-color); margin-bottom: 1.5rem; font-size: 1.5rem; font-weight: 700; } .input-group { margin-bottom: 1.5rem; } .input-label { display: block; margin-bottom: 0.5rem; font-weight: 600; color: var(–secondary-color); } .input-field { width: 100%; padding: 0.75rem; border: 1px solid #d1d5db; border-radius: var(–border-radius); font-size: 1rem; box-sizing: border-box; transition: border-color 0.2s; } .input-field:focus { outline: none; border-color: var(–primary-color); box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2); } .btn-calculate { width: 100%; padding: 0.75rem; background-color: var(–primary-color); color: white; border: none; border-radius: var(–border-radius); font-size: 1.125rem; font-weight: 600; cursor: pointer; transition: background-color 0.2s; } .btn-calculate:hover { background-color: #dc2626; } .results-section { margin-top: 2rem; border-top: 2px solid #e5e7eb; padding-top: 1.5rem; display: none; } .main-result { text-align: center; margin-bottom: 1.5rem; } .result-value { font-size: 2.5rem; font-weight: 800; color: var(–primary-color); } .result-label { font-size: 1rem; color: var(–secondary-color); text-transform: uppercase; letter-spacing: 0.05em; } .zones-table { width: 100%; border-collapse: collapse; margin-top: 1rem; font-size: 0.9rem; } .zones-table th, .zones-table td { padding: 0.75rem; text-align: left; border-bottom: 1px solid #e5e7eb; } .zones-table th { background-color: #f9fafb; font-weight: 600; color: var(–secondary-color); } .zones-table tr:hover { background-color: #f3f4f6; } .zones-table .zone-name { font-weight: 600; } .content-section { background: var(–card-bg); padding: 2rem; border-radius: var(–border-radius); box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); } .content-section h2 { color: var(–secondary-color); border-bottom: 2px solid var(–primary-color); padding-bottom: 0.5rem; margin-top: 2rem; } .content-section p { margin-bottom: 1rem; } .content-section ul { margin-bottom: 1rem; padding-left: 1.5rem; } .content-section li { margin-bottom: 0.5rem; } @media (max-width: 600px) { .calculator-card { padding: 1.5rem; } .result-value { font-size: 2rem; } }
FTHR Calculator
Cycling Running
Estimated FTHR
0 bpm

Training Zones

Zone Intensity % of FTHR Heart Rate Range (bpm)

What is Functional Threshold Heart Rate (FTHR)?

Functional Threshold Heart Rate (FTHR), sometimes referred to as Lactate Threshold Heart Rate (LTHR), is the maximum heart rate you can sustain for an extended period, typically around one hour, without fatigue increasing exponentially. Unlike Maximum Heart Rate (which is a biological ceiling), FTHR is a performance metric that changes with fitness.

Knowing your FTHR is critical for endurance athletes because it allows you to establish accurate training zones. Training based on FTHR is generally considered more effective than training based on Maximum Heart Rate, as it accounts for your current physiological fitness level.

How to Test Your FTHR

The most common field test to determine FTHR is the 20-minute Time Trial. Here is the standard protocol:

  • Warm-up: 15-20 minutes of easy to moderate activity, including a few short bursts of intensity to prime the system.
  • The Test: Go as hard as you can for 20 minutes. This should be a maximal, steady-state effort. It is not an interval session; pace yourself so you don't blow up in the first 5 minutes, but finish completely exhausted.
  • Cool-down: 10-15 minutes of easy spinning or jogging.

The Calculation: Take the average heart rate of that 20-minute effort and multiply it by 0.95. This effectively approximates what your heart rate would be for a full 60-minute effort. This calculator handles that math automatically.

Understanding the Training Zones

This calculator uses the widely accepted 7-zone system (popularized by Joe Friel) to structure your training. Note that the percentages differ slightly between running and cycling due to the weight-bearing nature of running.

  • Zone 1 (Active Recovery): Very easy effort, used for recovery rides or runs. promotes blood flow without inducing fatigue.
  • Zone 2 (Aerobic/Endurance): The "all day" pace. Builds mitochondrial density and fat-burning efficiency. This is where the bulk of training should occur.
  • Zone 3 (Tempo): A "comfortably hard" pace. Requires concentration but can be maintained.
  • Zone 4 (Sub-Threshold): Just below your FTHR. Intense aerobic work.
  • Zone 5a (Super-Threshold): Just above FTHR. Improves the body's ability to clear lactate.
  • Zone 5b (Aerobic Capacity/VO2 Max): Very hard, short efforts (3-8 minutes). Improves maximum oxygen uptake.
  • Zone 5c (Anaerobic Capacity): Sprinting or very short bursts. Neuromuscular power.

Cycling vs. Running Zones

It is important to test separately for different sports. Your FTHR for running is typically 5-10 beats higher than cycling because running engages more muscle mass and is weight-bearing. This calculator adjusts the zone percentages based on the activity you select to ensure your training data is accurate for the specific sport.

function calculateFTHR() { // Get input values var avgHrInput = document.getElementById('avgHeartRate').value; var sportType = document.getElementById('sportType').value; // Validation if (!avgHrInput || isNaN(avgHrInput) || avgHrInput 250) { alert("Please enter a valid average heart rate (between 40 and 250 bpm)."); return; } var avgHr = parseFloat(avgHrInput); // Calculate FTHR (95% of 20-min average) var fthr = Math.round(avgHr * 0.95); // Display FTHR document.getElementById('fthrValue').innerText = fthr + " bpm"; document.getElementById('results').style.display = 'block'; // Define Zones based on Sport Type (Joe Friel's Zones) var zones = []; if (sportType === 'cycling') { // Cycling Zones zones = [ { name: "Zone 1", desc: "Active Recovery", min: 0, max: Math.round(fthr * 0.81), pct: " 106%" } ]; } else { // Running Zones (Friel Running) // Z1 106% zones = [ { name: "Zone 1", desc: "Active Recovery", min: 0, max: Math.round(fthr * 0.85), pct: " 106%" } ]; } // Build Table HTML var tbody = document.getElementById('zonesBody'); tbody.innerHTML = ""; // Clear previous results for (var i = 0; i " + z.min + " bpm"; } else if (z.min === 0) { rangeStr = "< " + z.max + " bpm"; } else { rangeStr = z.min + " – " + z.max + " bpm"; } var row = "" + "" + z.name + "" + "" + z.desc + "" + "" + z.pct + "" + "" + rangeStr + "" + ""; tbody.innerHTML += row; } }

Leave a Comment