Learn PPG
Open-Source Tools for PPG Signal Quality
Four public projects cover different pieces. vital_sqi computes statistical and waveform indexes and lets you set the accept rule. biosqi returns a window score plus a stated reason, and its published validation is on ECG. MSPTDfast finds beats and troughs. pyPPG extracts fiducials and can call an optional quality index from an older Matlab routine.

Read the README, then the score
A repository named for signal quality is not automatically a PPG benchmark. The notes below are limited to what each project's own README or docs page states. The signal quality index explains the families these tools implement. The implementation article is a separate walkthrough of metrics in code, not a wrapper for these libraries.
vital_sqi
vital_sqi is a Python package for ECG and PPG. The README specifies Python 3.7 and 3.8, installation with pip install vital-sqi, an MIT license, and documentation at vitalsqi.readthedocs.io.
It groups indexes into standard statistics (including kurtosis, skewness, and entropy), heart-rate-variability summaries (SDNN, SDSD, RMSSD), RR-interval measures, and waveform measures (dynamic time warping, QRS energy, QRS amplitude). A signal can be cut by duration or by beat. The rule layer reads thresholds from a user JSON file and returns accept or reject. PPG is read from CSV. The README does not publish one set of thresholds as the clinical answer. The numbers you put in the JSON are yours.
Skewness as one of those statistical indexes is the quantity Elgendi compared in 2016. Using the function is not the same as adopting his zero threshold. That study is on the skewness page.
biosqi
biosqi scores ECG, PPG, and EEG windows. The README describes a score for a window, a mask, and a short piece of evidence: mains interference, baseline wander or motion, clipping, flatline or dropout, unusual amplitude, and poor beat consistency. Installation is pip install "biosqi[data,ui]". The command line exposes biosqi score, mask, report, and view. The license is MIT. Docs are at akshajbachu.github.io/biosqi. A Zenodo record is 10.5281/zenodo.23552709.
The README states that the software is for research and is not a medical device. The validation block on that README is not a PPG result. It reports ROC AUC 0.819 on the CinC 2011 Set A ECG collection (998 records) and a score-to-SNR correlation of 0.982 on the MIT-BIH Noise Stress Test Database, which is also ECG. Those figures belong to the ECG tests the authors ran. They are not a PPG signal-quality benchmark.
MSPTDfast
PPG-beats is a Matlab library for heartbeat detection in PPG. The library README describes that job and asks to be cited as Charlton and colleagues, Physiological Measurement, 2022 (PPG beat detection, 2022). It does not, in that README, present itself as an SQI package.
MSPTDfast v2 sits inside the library as a beat detector. The function page states that it returns peaks and onsets from a signal and a sample rate, as a faster refinement of multi-scale peak and trough detection, and points to Charlton and colleagues, Physiological Measurement (MSPTDfast). The license on the library materials is MIT, and the author named on the function page is Peter H. Charlton. Peaks are the input to a beat-agreement check or a template correlation. The detector does not emit a quality index.
pyPPG
pyPPG is a Python toolbox for PPG fiducial points and biomarkers. The README says to install with pip install pyPPG, documents the toolbox at pyppg.readthedocs.io, and pins Python 3.10. It reports 74 biomarkers. The beat detector it describes is an improved Aboy 2005 method. That is a different detector from MSPTDfast.
An optional signal-quality index can be called from the Matlab routine ppgSQI.m associated with Li and Clifford and the PhysioNet 2015 challenge sample. The README asks users to cite Goda, Charlton, and Behar, Physiological Measurement, 2023 (doi:10.1088/1361-6579/ad33a2). The optional index is an add-on path. The toolbox's main output is fiducials and biomarkers, which themselves assume the pulse is readable. A biomarker computed on a corrupted window is still a number.
How to choose without inventing a ranking
vital_sqi is the library whose README is organized as a menu of SQIs plus a rule file. biosqi is the library whose README is organized as a score, a mask, and a reason, with ECG validation numbers attached. PPG-beats, including MSPTDfast, is the library you open when the missing piece is the beat time. pyPPG is the library you open when the missing piece is the fiducial point, with quality as an option borrowed from an older Matlab file.
None of the four READMEs reports Elgendi's F1 scores, Charlton's posture SNRs, or Zhao's AUCs. Those results live in the papers, linked from the index, skewness, template, motion, and machine-learning guides. Running a package on your recording is a new measurement.
This page is educational. Research code is not a medical device, which biosqi's own README says in so many words, and which applies as a reading of the others' stated scope as signal-processing tools.
Research on this site
These records are public datasets, models, and papers linked from this guide.
Detecting beats in the photoplethysmogram: benchmarking open-source algorithmsOpen-source beat detectors benchmarked, including the library MSPTDfast refinesPhysiological Measurement · 2022
The MSPTDfast photoplethysmography beat detection algorithm: design, benchmarking, and open-source distributionFaster multi-scale peak and trough detectionPhysiological Measurement · 2025- Optimal Signal Quality Index for Photoplethysmogram SignalsSkewness is one index vital_sqi can compute; the zero threshold is his resultBioengineering · 2016
Go deeper
Frequently Asked Questions
Which open-source library computes a PPG SQI?
vital_sqi computes statistical, HRV, RR-interval, and waveform indexes for ECG and PPG and applies thresholds you supply in JSON (github.com/meta00/vital_sqi). pyPPG can call an optional SQI from the Matlab ppgSQI.m routine. biosqi returns a window score for ECG, PPG, and EEG.
Is biosqi's AUC a PPG result?
The validation printed in the biosqi README is ECG: ROC AUC 0.819 on CinC 2011 Set A (998 records) and a score-to-SNR correlation of 0.982 on the Noise Stress Test Database. The README also says the package is research software, not a medical device.
Does MSPTDfast output an SQI?
No. The PPG-beats function page says MSPTDfast v2 returns peaks and onsets. It is a beat detector (MSPTDfast). A later template or agreement score can use those times.
What should pyPPG be cited as?
The project README asks for Goda, Charlton, and Behar, Physiological Measurement, 2023 (doi:10.1088/1361-6579/ad33a2). It describes 74 biomarkers and an improved Aboy beat detector, plus an optional SQI taken from Li and Clifford's Matlab routine.