Calculate Beats Per Minute (BPM) from an ECG/EKG graph strip.
25 mm/s (Standard)
50 mm/s
Small Squares (1500 Rule – Most Accurate)
Large Squares (300 Rule – Fast)
6-Second Strip (Irregular Rhythms)
Calculated Heart Rate
0 BPM
How to Calculate Heart Rate from an ECG Graph
Reading a heart rate from an ECG (Electrocardiogram) graph involves measuring the distance between consecutive heartbeats, specifically the R-waves (the tall peaks on the graph). Depending on the regularity of the heart rhythm and the level of precision required, there are three primary methods used by clinicians.
1. The 1500 Rule (Small Squares)
This is the most accurate method for regular rhythms. Because ECG paper moves at a standard speed of 25mm per second, there are 1,500 small squares in one minute.
Formula: 1500 / Number of small squares between R-waves.
2. The 300 Rule (Large Squares)
A quicker way to estimate heart rate. There are 300 large squares (each containing 5 small squares) in one minute of ECG paper at standard speed.
Formula: 300 / Number of large squares between R-waves.
3. The 6-Second Method
Used primarily for irregular heartbeats (like Atrial Fibrillation). You count the number of R-waves (QRS complexes) within a 6-second interval (usually 30 large squares) and multiply by 10.
Formula: Number of Complexes in 6s x 10.
Understanding ECG Graph Paper Units
Standard ECG paper has specific dimensions that represent time and voltage:
1 Small Square: 1mm x 1mm (0.04 seconds at 25mm/s speed).
1 Large Square: 5mm x 5mm (0.20 seconds at 25mm/s speed).
Standard Speed: 25mm/sec. If the speed is doubled to 50mm/sec, you must double your calculation factors (e.g., use the 3000 rule instead of 1500).
Example Calculation
If you observe a graph where there are 3 large squares between two R-waves:
Using the 300 rule: 300 / 3 = 100 BPM.
If those same 3 large squares contain 15 small squares: 1500 / 15 = 100 BPM.
function toggleInputs() {
var method = document.getElementById("calcMethod").value;
document.getElementById("smallInput").style.display = (method === "small") ? "block" : "none";
document.getElementById("largeInput").style.display = (method === "large") ? "block" : "none";
document.getElementById("sixSecInput").style.display = (method === "sixsec") ? "block" : "none";
}
function calculateBPM() {
var speed = parseFloat(document.getElementById("paperSpeed").value);
var method = document.getElementById("calcMethod").value;
var resultDiv = document.getElementById("resultArea");
var bpmDisplay = document.getElementById("bpmValue");
var statusDisplay = document.getElementById("rhythmStatus");
var bpm = 0;
// Adjustment factor based on paper speed (standard is 25)
var factor = speed / 25;
if (method === "small") {
var smallSquares = parseFloat(document.getElementById("numSmallSquares").value);
if (smallSquares > 0) {
// At 25mm/s, it's 1500. At 50mm/s, it's 3000.
bpm = (1500 * factor) / smallSquares;
}
} else if (method === "large") {
var largeSquares = parseFloat(document.getElementById("numLargeSquares").value);
if (largeSquares > 0) {
// At 25mm/s, it's 300. At 50mm/s, it's 600.
bpm = (300 * factor) / largeSquares;
}
} else if (method === "sixsec") {
var complexes = parseFloat(document.getElementById("numComplexes").value);
if (complexes > 0) {
// 6 second method is generally independent of speed settings
// but usually assumes standard viewing.
bpm = complexes * 10;
}
}
if (bpm > 0) {
var finalBpm = Math.round(bpm);
bpmDisplay.innerHTML = finalBpm + " BPM";
resultDiv.style.display = "block";
var status = "";
if (finalBpm 100) {
status = "Tachycardia (Fast Heart Rate)";
} else {
status = "Normal Sinus Rhythm Range";
}
statusDisplay.innerHTML = status;
statusDisplay.style.color = (finalBpm 100) ? "#d93025" : "#2e7d32";
} else {
alert("Please enter a valid numeric value.");
}
}