============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
Pulsatility Index Calculator
Doppler PI from PSV, EDV & TAMV — instant clinical reference
Formula: PI = (PSV − EDV) ÷ TAMV
Enter Doppler Values
All velocity values should be in  cm/s — as reported by your Doppler ultrasound machine.
Peak Systolic Velocity (PSV)
Highest point of waveform
cm/s
End Diastolic Velocity (EDV)
Lowest point (can be 0 or negative)
cm/s
Time-Averaged Max Velocity (TAMV)
Mean of velocity envelope
cm/s
!
Please enter valid values. PSV and TAMV must be greater than zero.
Result
Pulsatility Index (PI)
cm/s
PSV − EDV
(Numerator)
cm/s
TAMV
(Denominator)
RI
Resistivity Index
(for reference)
PI Reference Ranges by Vessel
PI Range Interpretation Typical Vessel / Context
0.5 – 1.0 Low resistance, normal Fetal MCA (Middle Cerebral Artery)
1.0 – 1.8 Moderate resistance, normal Uterine artery (mid-pregnancy)
1.8 – 2.5 Mildly elevated resistance Umbilical artery (monitor closely)
> 2.5 High resistance, clinically significant Umbilical / uterine artery (possible pathology)
Absent / Reversed EDV Critical — severely compromised flow End-stage fetal compromise

ⓘ Reference ranges are approximate and vessel/context-specific. Always consult ISUOG, ACOG, or NICE guidelines for patient care decisions.

Formula, Notes & Limitations
  • Core formula: PI = (PSV − EDV) ÷ TAMV — Gosling & King, 1975
  • Resistivity Index (RI) for reference: RI = (PSV − EDV) ÷ PSV
  • EDV may be zero (absent diastolic flow) or negative (reversed flow) — both are valid inputs.
  • TAMV must be > 0. If TAMV = 0, PI is undefined (division by zero).
  • Results are for educational and clinical reference only — not a substitute for professional interpretation.
  • Doppler angle should ideally be <60° for accurate velocity measurements; angle errors affect PSV/EDV/TAMV inputs.
  • Source: Gosling RG, King DH (1975). Ultrasound Angiology. ISUOG Practice Guidelines (isuog.org).

Pulsatility Index Calculator: Find Your Doppler Flow Value Instantly

Pulsatility index (PI) is a critical Doppler ultrasound measurement used to assess blood flow resistance in vessels — most commonly in obstetric, fetal, and vascular medicine. This free tool on Zo Calculator takes three simple flow velocity values and delivers your PI result in seconds, removing the need for manual arithmetic during clinical review or study.


What This Calculator Tells You

Using this pulsatility index calculator, you can instantly determine:

  • Pulsatility Index (PI) — the primary output, indicating the resistance and pulsatility of blood flow in a vessel
  • Peak Systolic Velocity (PSV) — the highest flow speed measured during cardiac contraction
  • End Diastolic Velocity (EDV) — the lowest flow speed recorded at the end of a cardiac cycle
  • Time-Averaged Maximum Velocity (TAMV) — the mean velocity over a full cardiac cycle, used as the divisor in the PI formula
  • Flow waveform classification — whether the result suggests normal, mildly elevated, or high-resistance blood flow based on established reference ranges

How the Calculator Works (The Formula & Logic)

The pulsatility index calculation is based on a straightforward formula established in vascular Doppler analysis. It compares the difference between peak and minimum flow velocities against the mean velocity across the cardiac cycle.

The Core Formula:

PI = (PSV − EDV) ÷ TAMV

Where:

  • PSV = Peak Systolic Velocity (cm/s) — the highest point of the waveform
  • EDV = End Diastolic Velocity (cm/s) — the lowest point of the waveform
  • TAMV = Time-Averaged Maximum Velocity (cm/s) — the mean of the maximum velocity envelope over one complete cycle

Why it matters: A higher PI value indicates greater resistance to flow — for example, in a constricted or downstream high-resistance vessel. A lower PI suggests a low-resistance vascular bed, such as in the fetal middle cerebral artery under normal conditions.

This formula was originally described by Gosling and King and remains the standard in clinical Doppler reporting worldwide.


Standard Ratings & Classifications (Reference Chart)

The table below gives general PI reference ranges for common clinical applications. Note that normal values vary by gestational age, vessel type, and patient physiology. Always interpret results alongside clinical context.

PI RangeGeneral InterpretationCommon Context
0.5 – 1.0Low resistance, normal flowFetal MCA (Middle Cerebral Artery)
1.0 – 1.8Moderate resistance, typically normalUterine artery (mid-pregnancy)
1.8 – 2.5Mildly elevated resistanceUmbilical artery (may need monitoring)
> 2.5High resistance, clinically significantUmbilical/uterine artery (possible pathology)
Absent/Reversed EDVCritically elevated resistanceSeverely compromised fetal circulation

Reference values are approximate and vessel/context-specific. Clinical guidelines from ISUOG and ACOG should be consulted for patient care decisions.


Step-by-Step Practical Example

Here is a realistic worked example showing how to calculate pulsatility index manually using the standard formula.

Clinical Scenario: A sonographer performs a Doppler study on the umbilical artery and records the following waveform measurements:

  • PSV = 60 cm/s
  • EDV = 20 cm/s
  • TAMV = 35 cm/s

Step 1 — Subtract EDV from PSV: 60 − 20 = 40 cm/s

Step 2 — Divide by TAMV: 40 ÷ 35 = 1.14

Step 3 — Read the result: PI = 1.14

This value falls within the moderate resistance range for the umbilical artery in mid-to-late pregnancy — a result typically considered within normal limits, though clinical correlation is always required.


How to Use Zo Calculator’s Pulsatility Index Tool

Using the pulsatility index calculator on ZoCalculator.com takes less than a minute. Here is exactly how:

  1. Enter Peak Systolic Velocity (PSV): Type in the highest velocity value from your Doppler waveform in cm/s.
  2. Enter End Diastolic Velocity (EDV): Input the lowest velocity recorded at end-diastole. If EDV is absent (zero) or reversed (negative), enter 0 or a negative value accordingly.
  3. Enter Time-Averaged Maximum Velocity (TAMV): Key in the mean of the maximum velocity envelope over one cardiac cycle — this is typically provided by your ultrasound machine’s trace function.
  4. Click “Calculate”: The tool instantly applies the PI = (PSV − EDV) ÷ TAMV formula and displays your result.
  5. Read your PI value: Your pulsatility index is shown clearly, alongside a brief classification note based on general reference ranges.
  6. Reset and recalculate: Use the reset button to enter new values for a different vessel or patient without refreshing the page.

Practical Applications and Real-World Uses

  • Obstetric ultrasound monitoring: Midwives, obstetricians, and maternal-fetal medicine specialists use PI to track umbilical artery and uterine artery resistance during pregnancy, detecting signs of intrauterine growth restriction (IUGR) or placental insufficiency.
  • Fetal neurology assessment: The middle cerebral artery (MCA) PI is used to evaluate fetal cerebral redistribution (“brain-sparing”), a critical marker in at-risk pregnancies.
  • Vascular surgery planning: Vascular surgeons and radiologists assess peripheral artery PI values to evaluate stenosis severity and downstream perfusion before and after interventional procedures.
  • Medical education and exam preparation: Ultrasound students, radiology residents, and sonography trainees use the pulsatility index calculator to practice and verify their manual calculations when studying Doppler principles.
  • Research and data validation: Clinical researchers cross-checking recorded Doppler values can use the tool to rapidly validate PI calculations across large datasets without manual formula re-application.

Important Notes & Technical Limitations

Zo Calculator’s pulsatility index tool is designed for educational reference and clinical support. Please keep these limitations in mind:

  1. Not a diagnostic instrument: This calculator performs a mathematical computation only. It does not acquire ultrasound data, analyze waveform morphology, or account for angle correction errors in Doppler measurements.
  2. Input quality determines output quality: The accuracy of your PI result depends entirely on the accuracy of the PSV, EDV, and TAMV values you enter. Poor Doppler angles (ideally < 60°) or improper waveform tracing will produce unreliable inputs.
  3. Reference ranges are approximate: The classification table reflects general clinical literature values. Normal PI ranges differ by gestational age, vessel, and population. Always use vessel-specific and gestation-specific nomograms from validated clinical guidelines.
  4. Not a substitute for clinical judgment: Results from this tool should always be interpreted by a qualified healthcare professional alongside full clinical history, imaging findings, and applicable national guidelines (e.g., ISUOG, NICE, ACOG).

Helpful References & Sources

For deeper clinical context and validated reference nomograms, consult these authoritative resources:

  • ISUOG (International Society of Ultrasound in Obstetrics and Gynecology): isuog.org — publishes practice guidelines and reference ranges for fetal Doppler assessment.
  • ACOG (American College of Obstetricians and Gynecologists): acog.org — provides clinical practice bulletins covering fetal surveillance including Doppler velocimetry.
  • Wikipedia — Pulsatility Index: en.wikipedia.org/wiki/Pulsatility_index — a concise overview of the PI formula, its derivation, and clinical applications across vessel types.

🙋 Frequently Asked Questions (FAQs)

What is the pulsatility index and why is it important?

The pulsatility index (PI) is a dimensionless Doppler ultrasound measurement that quantifies the resistance to blood flow within a vessel. It is calculated by dividing the difference between peak systolic and end diastolic velocities by the time-averaged maximum velocity over a cardiac cycle. Clinically, it is most important in obstetrics and vascular medicine because elevated PI values can indicate downstream vascular resistance, placental dysfunction, or fetal compromise.

How do you calculate pulsatility index step by step?

To calculate pulsatility index, you need three measurements from your Doppler waveform: Peak Systolic Velocity (PSV), End Diastolic Velocity (EDV), and Time-Averaged Maximum Velocity (TAMV). Apply the formula: PI = (PSV − EDV) ÷ TAMV. For example, if PSV = 60, EDV = 20, and TAMV = 35, then PI = (60 − 20) ÷ 35 = 1.14.

What is a normal pulsatility index value?

Normal PI values vary significantly depending on which vessel is being assessed and, in pregnancy, the gestational age. For the umbilical artery at term, a PI below approximately 1.2–1.5 is generally considered normal. For the fetal middle cerebral artery, a normal PI is typically above 1.6 in the third trimester. Always use vessel-specific and gestational-age-specific nomograms from published clinical guidelines rather than a single universal threshold.

What does a high pulsatility index mean?

A high PI indicates elevated downstream vascular resistance — meaning blood is meeting more resistance as it flows through the vessel. In the umbilical artery, a high PI may suggest placental resistance and possible intrauterine growth restriction (IUGR). In peripheral vessels, it can indicate stenosis or occlusive disease. The clinical significance always depends on which vessel is measured and the broader clinical picture.

What is the difference between pulsatility index and resistivity index?

Both are Doppler flow indices, but they use slightly different formulas. The Pulsatility Index (PI) = (PSV − EDV) ÷ TAMV, using mean velocity as the denominator. The Resistivity Index (RI), also called the Pourcelot Index, = (PSV − EDV) ÷ PSV, using peak systolic velocity as the denominator. PI is considered more sensitive than RI in high-resistance states because it remains calculable even when EDV is absent or reversed, situations where RI becomes mathematically undefined or fixed at 1.0.

Can pulsatility index be negative?

The PI value itself will not be negative under normal physiological conditions. However, if End Diastolic Velocity (EDV) is reversed (i.e., blood flows backward during diastole — a sign of critical circulatory compromise), the EDV input becomes a negative number, which will increase the numerator of the PI formula significantly, resulting in a very high PI value rather than a negative one. Absent or reversed end-diastolic flow is a serious clinical finding requiring urgent assessment.

Which vessels are pulsatility index measurements commonly taken from?

Pulsatility index is most commonly measured from the umbilical artery, uterine artery, and fetal middle cerebral artery (MCA) in obstetric practice. In vascular medicine, PI is assessed in peripheral arteries (such as the femoral, popliteal, and tibial arteries), renal arteries, and intracranial vessels during transcranial Doppler studies. Each vessel has its own established reference range and clinical significance.

What equipment is needed to measure pulsatility index?

Measuring PI requires a Doppler-capable ultrasound machine — either a dedicated vascular duplex scanner or an obstetric ultrasound unit with spectral Doppler functionality. The machine acquires a spectral waveform, from which PSV, EDV, and TAMV are extracted (usually via automated waveform tracing). Once you have these three values, you can enter them into a pulsatility index calculator like the one on ZoCalculator.com to compute PI instantly.

Is the pulsatility index calculator suitable for clinical diagnosis?

This calculator is a computational reference tool — it accurately performs the PI = (PSV − EDV) ÷ TAMV calculation based on the values you provide. It is suitable for educational use, quick manual verification, and study purposes. It is not a medical device and should not be used as a standalone diagnostic tool. All clinical decisions regarding patient care must be made by a licensed healthcare professional using validated equipment and applicable clinical guidelines.

How is pulsatility index used in IVF and fertility treatments?

In assisted reproductive technology (ART) and IVF, pulsatility index measurements of the uterine arteries are sometimes used to assess endometrial receptivity and uterine blood flow prior to embryo transfer. A high uterine artery PI on the day of or before transfer may suggest suboptimal uterine perfusion, which some clinicians associate with reduced implantation rates. However, its predictive value remains a subject of ongoing research, and protocols vary across fertility centers.


Explore Related Calculators on Zo Calculator