Use this tool to calculate respiratory rate by manually counting the modulation cycles (envelope waves) seen on an ECG rhythm strip. This method relies on Respiratory Sinus Arrhythmia (RSA) or R-wave Amplitude Modulation.
Count the distinct "waves" in the R-peak trend line (amplitude rise and fall).
Standard rhythm strips are often 10 seconds.
Calculated Respiratory Rate
0 BPM
Note: This is an estimation based on the EDR (ECG Derived Respiration) phenomenon. Clinical correlation is always required.
How to Calculate Respiratory Rate from ECG
While the Electrocardiogram (ECG) is primarily designed to monitor electrical activity of the heart, it contains valuable information regarding a patient's respiration. This technique is known as ECG Derived Respiration (EDR).
The Mechanism: How Breathing Affects ECG
Calculating respiratory rate from an ECG trace is possible due to two main physiological coupling mechanisms:
Respiratory Sinus Arrhythmia (RSA): This is the natural variation in heart rate that occurs during a breathing cycle. During inspiration (breathing in), the intrathoracic pressure drops, leading to a slight increase in heart rate (shorter R-R intervals). During expiration (breathing out), the heart rate slows down (longer R-R intervals).
R-Wave Amplitude Modulation: As the chest expands and contracts during breathing, the position of the heart relative to the ECG electrodes on the chest wall shifts slightly. This creates a rhythmic change in the electrical impedance and the physical axis of the heart, resulting in a visible wave-like pattern in the height (amplitude) of the QRS complexes.
Manual Calculation Method
To perform this calculation manually without advanced software, you look for the low-frequency "envelope" or modulation wave formed by the peaks of the R-waves.
Step 1: Obtain a rhythm strip (usually Lead II provides good visibility) of a known duration, typically 10 to 30 seconds.
Step 2: Visualize an imaginary line connecting the tops of all R-waves.
Step 3: Count the number of sinusoidal cycles (rise and fall patterns) of this imaginary line. Each rise-and-fall cycle corresponds to one breath.
Step 4: Apply the formula below.
The Formula
The mathematical logic for converting the count from a time strip into a minute-based rate is:
Respiratory Rate (BPM) = (Number of Cycles / Strip Duration in Seconds) × 60
Example: If you count 3 complete modulation cycles on a 10-second ECG strip:
Calculation: (3 / 10) × 60 = 18 Breaths Per Minute.
Clinical Ranges
Once the rate is calculated, it is compared against standard clinical ranges:
Eupnea (Normal): 12–20 breaths per minute (adults).
Bradypnea: Less than 12 breaths per minute.
Tachypnea: Greater than 20 breaths per minute.
Note: If the patient has a fixed-rate pacemaker or severe autonomic neuropathy, RSA may be absent, making this calculation method invalid.
function calculateRespiratoryRate() {
// Get input values
var cyclesInput = document.getElementById('cyclesCount');
var durationInput = document.getElementById('stripDuration');
var resultDiv = document.getElementById('result');
var rrValueDiv = document.getElementById('rrValue');
var rrInterpDiv = document.getElementById('rrInterpretation');
var cycles = parseFloat(cyclesInput.value);
var duration = parseFloat(durationInput.value);
// Validation
if (isNaN(cycles) || isNaN(duration) || duration <= 0) {
alert("Please enter valid positive numbers for both cycles and duration.");
return;
}
// Calculation: (Cycles / Seconds) * 60 = Breaths per minute
var respiratoryRate = (cycles / duration) * 60;
// Round to 1 decimal place
var finalRR = respiratoryRate.toFixed(1);
// Display Result
resultDiv.style.display = "block";
rrValueDiv.innerHTML = finalRR + " Breaths/Min";
// Interpretation
var interpretation = "";
var interpClass = "";
if (respiratoryRate = 12 && respiratoryRate <= 20) {
interpretation = "Normal Respiratory Rate (Eupnea)";
interpClass = "normal";
} else {
interpretation = "Tachypnea (High Respiratory Rate)";
interpClass = "abnormal";
}
rrInterpDiv.innerHTML = interpretation;
rrInterpDiv.className = "interpretation " + interpClass;
}