Crates.io | cardio-rs |
lib.rs | cardio-rs |
version | 0.2.1 |
created_at | 2025-03-09 17:24:34.089406+00 |
updated_at | 2025-03-28 14:35:18.281989+00 |
description | A Rust library for computing heart rate variability (HRV) metrics from ECG and PPG data. |
homepage | https://github.com/bgallois/cardio-rs |
repository | https://github.com/bgallois/cardio-rs |
max_upload_size | |
id | 1585649 |
size | 23,391,628 |
A Rust library for Heart Rate Variability (HRV) analysis
📊 Compute HRV metrics in time-domain, frequency-domain, and non-linear domain from RR intervals with ease!
💓 Preprocess ECG & PPG raw data for accurate HRV analysis!
📟 Compatible with embedded systems using no_std
!
no_std
compatibility for embedded systems.Computed using Welch’s method for spectral density estimation:
Non-linear HRV metrics provide insights into the complexity and self-organization of the heart's autonomic regulation. They are useful for capturing dynamics that cannot be fully understood through linear analysis alone.
Cardio-rs supports window analysis, which allows you to split data into segments of a defined size. This is useful for performing HRV analysis on specific time periods or segments of data.
use cardio_rs::{ windows_analysis::WindowsAnalysisBuilder };
let data = vec![800., 810., 790., 765., 780., 800., 810., 795., 770., 785.];
// Create the window analysis builder
let analysis = WindowsAnalysisBuilder::new(data)
.with_window_size(3_000.)
.build();
// Get HRV metrics for each window
println!("{:?}", analysis.metrics);
The live analysis module allows for real-time HRV calculations by dynamically processing incoming RR intervals. You can define a custom analysis pipeline or use the default pipeline for standard HRV metrics.
use cardio_rs::{ live_analysis::TimeQueue, HrvMetrics };
use cardio_rs::utils::test_data::RR_INTERVALS;
let mut queue = TimeQueue::new(60_000); // Set the time window (in milliseconds)
let rr_intervals = RR_INTERVALS.to_vec();
for interval in rr_intervals {
queue.push(interval);
}
let hrv = queue.get_hrv();
println!("Calculated HRV: {:?}", hrv);
use cardio_rs::{ standard_analysis, HrvMetrics };
let path = "tests/ecg.csv";
let signal = "ECG_Raw";
let rate = 1000.;
let hrv_metrics = standard_analysis!(path, signal, rate);
println!("{:?}", hrv_metrics);
#[cfg(feature = "std")] {
use cardio_rs::{
processing_utils::{ RRIntervals, EctopicMethod, DetectOutliers },
time_domain::TimeMetrics,
non_linear::NonLinearMetrics,
geometric_domain::GeometricMetrics,
frequency_domain::FrequencyMetrics,
io_utils::{ DataBuilder },
standard_analysis,
HrvMetrics,
};
let path = "tests/ecg.csv";
let signal = "ECG_Raw";
let time = "Time";
let data = DataBuilder::new(path.into(), signal.into())
.with_time(time.into())
.build()
.unwrap();
let hrv_metrics = standard_analysis!(data.clone().get_rr());
println!("{:?}", hrv_metrics);
// Manual analysis for more control
let mut rr_intervals = RRIntervals::new(data.get_rr());
rr_intervals.detect_ectopics(EctopicMethod::Karlsson);
rr_intervals.detect_outliers(&300., &2_000.);
rr_intervals.remove_outliers_ectopics();
let time_metrics = TimeMetrics::compute(rr_intervals.as_slice());
println!("{:?}", time_metrics);
let frequency_metrics = FrequencyMetrics::compute(rr_intervals.as_slice(), 10.);
println!("{:?}", frequency_metrics);
let geo_metrics = GeometricMetrics::compute(rr_intervals.as_slice());
println!("{:?}", geo_metrics);
let non_linear_metrics = NonLinearMetrics::compute_default(&rr_intervals);
println!("{:?}", non_linear_metrics);
}
🔥 Start analyzing HRV today with cardio-rs! 🚀💓