Threshold Heart Rate Calculator Cycling

Cycling Threshold Heart Rate (LTHR) Calculator /* Basic WordPress-friendly Styles */ .lthr-calculator-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; color: #333; line-height: 1.6; } .calc-card { background: #f9f9f9; border: 1px solid #e0e0e0; border-radius: 8px; padding: 30px; margin-bottom: 40px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); } .form-group { margin-bottom: 20px; } .form-group label { display: block; font-weight: 600; margin-bottom: 8px; color: #2c3e50; } .form-group input, .form-group select { width: 100%; padding: 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 16px; box-sizing: border-box; } .btn-calc { background-color: #d32f2f; color: white; border: none; padding: 15px 30px; font-size: 18px; font-weight: bold; border-radius: 4px; cursor: pointer; width: 100%; transition: background-color 0.3s; } .btn-calc:hover { background-color: #b71c1c; } .result-section { margin-top: 30px; display: none; border-top: 2px solid #e0e0e0; padding-top: 20px; } .lthr-display { text-align: center; margin-bottom: 25px; background: #fff; padding: 15px; border-radius: 6px; border: 1px solid #ddd; } .lthr-value { font-size: 36px; font-weight: 800; color: #d32f2f; } .lthr-label { font-size: 14px; text-transform: uppercase; color: #666; letter-spacing: 1px; } .zones-table { width: 100%; border-collapse: collapse; margin-top: 20px; background: white; } .zones-table th, .zones-table td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; } .zones-table th { background-color: #f1f1f1; font-weight: 700; } .zone-row-1 { border-left: 5px solid #a8e6cf; } /* Recovery */ .zone-row-2 { border-left: 5px solid #dcedc1; } /* Aerobic */ .zone-row-3 { border-left: 5px solid #ffd3b6; } /* Tempo */ .zone-row-4 { border-left: 5px solid #ffaaa5; } /* SubThreshold */ .zone-row-5 { border-left: 5px solid #ff8b94; } /* SuperThreshold */ .article-content h2 { color: #2c3e50; margin-top: 30px; border-bottom: 2px solid #d32f2f; padding-bottom: 10px; display: inline-block; } .article-content h3 { color: #444; margin-top: 25px; } .article-content ul { margin-left: 20px; } .article-content li { margin-bottom: 10px; } .info-box { background-color: #e3f2fd; border-left: 4px solid #2196f3; padding: 15px; margin: 20px 0; } @media (max-width: 600px) { .zones-table th, .zones-table td { font-size: 14px; padding: 8px; } }

Cycling Threshold Heart Rate Calculator

Training with a heart rate monitor is one of the most effective ways to improve cycling performance, but it requires more than just knowing your Max Heart Rate. To train specifically for endurance, climbing, or time trialing, you need to determine your Lactate Threshold Heart Rate (LTHR).

This calculator helps you determine your LTHR based on common field test protocols and generates your personalized training zones (based on Joe Friel's methodology).

20-Minute Time Trial (Average HR) 30-Minute Time Trial (Average HR of last 20m) I already know my LTHR
Enter the average heart rate recorded during your test.
Your Estimated Lactate Threshold Heart Rate
0 BPM

Your Training Zones

Zone Intensity Heart Rate Range (BPM) % of LTHR

Understanding Lactate Threshold (LTHR)

Your Lactate Threshold Heart Rate (LTHR) is the maximum intensity at which you can ride for an extended duration (typically 60 minutes) without lactate accumulating in your blood faster than your body can clear it. Riding above this threshold forces your body to switch to anaerobic metabolism, which can only be sustained for short periods.

Why not just use Max Heart Rate?
Max HR formulas (like 220 minus age) are generic and often inaccurate for trained cyclists. LTHR is a performance metric based on your current fitness, making it a much more reliable baseline for setting training intensities.

How to Perform the Field Test

To get accurate numbers for the calculator above, you should perform a solo time trial. Ensure you are well-rested and on a safe, uninterrupted route or an indoor trainer.

Option 1: The 30-Minute Test (Friel Method)

  1. Warm up thoroughly for 15-20 minutes.
  2. Ride as hard as you can sustain for 30 minutes alone. Pacing is key; don't start too hard and fade.
  3. Hit the lap button 10 minutes into the ride.
  4. Your LTHR is the average heart rate of the final 20 minutes of this 30-minute effort.

Option 2: The 20-Minute Test

  1. Warm up thoroughly.
  2. Ride a 20-minute time trial at maximum sustainable effort.
  3. Take the average heart rate of the full 20 minutes.
  4. Since a 20-minute effort is slightly higher intensity than a 60-minute effort, we calculate 95% of this average to estimate your LTHR.

Training Zones Explained

  • Zone 1 (Recovery): Very easy riding. Used for warming up, cooling down, or active recovery days. Promotes blood flow without fatigue.
  • Zone 2 (Aerobic/Endurance): The foundation of cycling fitness. You can hold a conversation here. Improves fat utilization and mitochondrial density.
  • Zone 3 (Tempo): Rhythmic and brisk. Requires concentration but is sustainable. Good for muscle endurance.
  • Zone 4 (Sub-Threshold): "Sweet Spot" training. Hard work, borderline uncomfortable. Highly effective for increasing FTP (Functional Threshold Power) and LTHR.
  • Zone 5a (Super-Threshold): Above your LTHR. Very hard efforts, sustainable for minutes, not hours. Used for time trial intervals and long climbs.
  • Zone 5b (Aerobic Capacity/VO2 Max): Extremely hard. Panting for breath. Used for short intervals (3-8 minutes) to increase VO2 max.
  • Zone 5c (Anaerobic): All-out sprinting or short power bursts.
function calculateCyclingZones() { // 1. Get Inputs var protocol = document.getElementById('testProtocol').value; var inputHR = document.getElementById('inputHeartRate').value; var resultDiv = document.getElementById('resultsArea'); var lthrDisplay = document.getElementById('lthrVal'); var tableBody = document.getElementById('zonesBody'); // 2. Validate Inputs if (!inputHR || isNaN(inputHR)) { alert("Please enter a valid Heart Rate."); return; } var hrValue = parseFloat(inputHR); // Sanity check for human heart rates (cycling context) if (hrValue 240) { alert("Please enter a realistic Heart Rate (between 40 and 240 BPM)."); return; } // 3. Calculate LTHR based on protocol var lthr = 0; if (protocol === '20min') { // 20 min test estimates LTHR as 95% of the average lthr = Math.round(hrValue * 0.95); } else if (protocol === '30min') { // Friel method: Avg of last 20 mins of 30 min test IS the LTHR lthr = Math.round(hrValue); } else { // Direct entry lthr = Math.round(hrValue); } // 4. Update LTHR Display lthrDisplay.innerHTML = lthr; // 5. Calculate Zones (Friel's Pulse Zones) // Zone 1: 106% var z1_high = Math.floor(lthr * 0.80); var z2_low = Math.ceil(lthr * 0.81); var z2_high = Math.floor(lthr * 0.89); var z3_low = Math.ceil(lthr * 0.90); var z3_high = Math.floor(lthr * 0.93); var z4_low = Math.ceil(lthr * 0.94); var z4_high = Math.floor(lthr * 0.99); var z5a_low = Math.ceil(lthr * 1.00); var z5a_high = Math.floor(lthr * 1.02); var z5b_low = Math.ceil(lthr * 1.03); var z5b_high = Math.floor(lthr * 1.06); var z5c_low = Math.ceil(lthr * 1.07); // 6. Generate Table HTML var html = "; // Zone 1 html += ''; html += 'Zone 1'; html += 'Recovery'; html += '< ' + z1_high + ''; html += '< 81%'; html += ''; // Zone 2 html += ''; html += 'Zone 2'; html += 'Aerobic / Endurance'; html += '' + z2_low + ' – ' + z2_high + ''; html += '81% – 89%'; html += ''; // Zone 3 html += ''; html += 'Zone 3'; html += 'Tempo'; html += '' + z3_low + ' – ' + z3_high + ''; html += '90% – 93%'; html += ''; // Zone 4 html += ''; html += 'Zone 4'; html += 'Sub-Threshold'; html += '' + z4_low + ' – ' + z4_high + ''; html += '94% – 99%'; html += ''; // Zone 5a html += ''; html += 'Zone 5a'; html += 'Super-Threshold'; html += '' + z5a_low + ' – ' + z5a_high + ''; html += '100% – 102%'; html += ''; // Zone 5b html += ''; html += 'Zone 5b'; html += 'Aerobic Capacity (VO2 Max)'; html += '' + z5b_low + ' – ' + z5b_high + ''; html += '103% – 106%'; html += ''; // Zone 5c html += ''; html += 'Zone 5c'; html += 'Anaerobic Capacity'; html += '> ' + z5c_low + ''; html += '> 106%'; html += ''; tableBody.innerHTML = html; // 7. Show Results resultDiv.style.display = 'block'; // Scroll to results resultDiv.scrollIntoView({behavior: "smooth"}); }

Leave a Comment