Count the large grid boxes between two consecutive R-wave peaks.
Count the tiny 1mm grid boxes for higher precision.
Count the total number of heartbeats (R-waves) visible in 30 large squares.
Estimated Heart Rate:
— BPM
How to Calculate Heart Rate from an ECG Graph
Calculating heart rate from an electrocardiogram (ECG or EKG) strip is a fundamental skill for medical professionals and fitness enthusiasts interpreting heart monitor data. While modern machines calculate this automatically, understanding the manual calculation methods is crucial for verifying accuracy and interpreting graphs where artifacts might confuse automated software.
Standard Calibration: These calculations assume the ECG paper speed is set to the standard 25 mm/second. At this speed:
1 Small Square (1mm) = 0.04 seconds
1 Large Square (5mm) = 0.20 seconds
5 Large Squares = 1 second
Method 1: The 300 Method (The Sequence Method)
The "300 Method" is the quickest way to estimate heart rate for regular rhythms. It relies on the larger grid squares (5mm boxes).
The Logic: Since there are 300 large squares in one minute (60 seconds ÷ 0.2 seconds/square), you can determine the heart rate by dividing 300 by the number of large squares between two consecutive R-waves (the spikes).
How to do it:
Find an R-wave that lands on or near a heavy black line (a large square border).
Count the number of large squares until the next R-wave.
Divide 300 by that number.
Example: If there are 4 large squares between R-waves, the calculation is 300 ÷ 4 = 75 BPM.
Method 2: The 1500 Method (The Precision Method)
For a more accurate heart rate, especially if the R-waves do not land exactly on the heavy lines, the 1500 method is preferred. This uses the small (1mm) squares.
The Logic: There are 1,500 small squares in one minute (25mm/sec × 60 sec = 1500 mm). Dividing 1500 by the number of small squares between R-R intervals gives a precise rate.
How to do it:
Count the number of small squares between two consecutive R-waves.
Divide 1500 by that number.
Example: If there are 20 small squares between peaks, the calculation is 1500 ÷ 20 = 75 BPM.
Method 3: The 6-Second Method (For Irregular Rhythms)
If the heart rhythm is irregular (e.g., Atrial Fibrillation), the distance between R-waves changes constantly. Using the 300 or 1500 methods on a single gap will give an inaccurate result. In this case, you use the 6-second method to get an average.
How to do it:
Identify a 6-second strip on the ECG paper. This is exactly 30 large squares.
Count the number of QRS complexes (R-waves) that occur strictly within this 6-second window.
Multiply that number by 10 to get the Beats Per Minute (6 seconds × 10 = 60 seconds).
Example: If you count 7 beats in a 6-second strip, the heart rate is approximately 7 × 10 = 70 BPM.
Normal Heart Rate Ranges
Once you have calculated the rate from the graph, you can categorize it:
Bradycardia: Less than 60 BPM (Slow)
Normal Sinus Rhythm: 60 to 100 BPM
Tachycardia: Greater than 100 BPM (Fast)
function toggleInputs() {
var method = document.getElementById('methodSelect').value;
var input300 = document.getElementById('input300');
var input1500 = document.getElementById('input1500');
var input6sec = document.getElementById('input6sec');
var resultBox = document.getElementById('resultBox');
// Hide all first
input300.classList.add('hidden');
input1500.classList.add('hidden');
input6sec.classList.add('hidden');
// Clear result when switching methods
resultBox.style.display = 'none';
// Show selected
if (method === '300') {
input300.classList.remove('hidden');
} else if (method === '1500') {
input1500.classList.remove('hidden');
} else if (method === '6sec') {
input6sec.classList.remove('hidden');
}
}
function calculateECG() {
var method = document.getElementById('methodSelect').value;
var result = 0;
var bpm = 0;
var isValid = false;
if (method === '300') {
var largeSquares = parseFloat(document.getElementById('largeSquares').value);
if (largeSquares > 0) {
bpm = 300 / largeSquares;
isValid = true;
}
} else if (method === '1500') {
var smallSquares = parseFloat(document.getElementById('smallSquares').value);
if (smallSquares > 0) {
bpm = 1500 / smallSquares;
isValid = true;
}
} else if (method === '6sec') {
var complexCount = parseFloat(document.getElementById('complexCount').value);
if (complexCount >= 0) {
bpm = complexCount * 10;
isValid = true;
}
}
var resultBox = document.getElementById('resultBox');
var bpmResult = document.getElementById('bpmResult');
var interpretation = document.getElementById('interpretation');
if (isValid) {
// Round to nearest integer for display
var finalBPM = Math.round(bpm);
resultBox.style.display = 'block';
bpmResult.innerHTML = finalBPM + " BPM";
// Interpretation logic
var text = "";
if (finalBPM = 60 && finalBPM <= 100) {
text = "Classification: Normal Resting Rate";
resultBox.style.backgroundColor = "#e8f5e9"; // Green for normal
resultBox.style.borderColor = "#a5d6a7";
bpmResult.style.color = "#2e7d32";
} else {
text = "Classification: Tachycardia (Fast)";
resultBox.style.backgroundColor = "#ffebee"; // Red for fast
resultBox.style.borderColor = "#ffcdd2";
bpmResult.style.color = "#d32f2f";
}
interpretation.innerHTML = text;
} else {
alert("Please enter a valid positive number.");
resultBox.style.display = 'none';
}
}