Flutter心电图绘制插件callibri_ecg的使用

Flutter心电图绘制插件callibri_ecg的使用

心电图(ECG)数据处理库主要用于从Callibri传感器获取的心电图数据进行计算,包括心率(HR)、心间隔长度(RR间隔)和压力指数(SI)。

在最初的6秒内,算法会进行学习。如果在信号中没有找到5个RR间隔,则训练将重新开始。进一步使用该库时是迭代式的(添加新数据并进行计算)。

初始化

确定基本参数

  1. 原始信号采样频率。整型。允许值为250或1000。
  2. 数据处理窗口大小。整型。有效值为采样率/4或采样率/2。
  3. 计算SI的窗口数量。整型。允许值范围为[20…50]。
  4. IN计算的平均参数。默认值为6。

创建库实例

首先需要确定库参数,然后将其传递给库。接下来是初始化过滤器。当前版本中过滤器已经内置且明确指定:巴特沃斯二阶带通滤波器(5到15Hz)。

可以初始化用于SI计算的平均值。这是一个可选值。

// 1. 原始信号采样频率
int samplingRate = 250;
// 2. 数据处理窗口大小
int dataWindow = samplingRate ~/ 2;
// 3. 计算SI的窗口数量
int nWinsForPressureIndex = 30;
final math = CallibriEcgMath(samplingRate, dataWindow, nWinsForPressureIndex);

// 可选
// 4. IN计算的平均参数。默认值为6
int pressureIndexAverage = 6;
math.setPressureAverage(pressureIndexAverage);

初始化数据数组以传递给库

传输数组的大小必须符合一定的长度:

  • 采样频率为250 Hz时为25个值
  • 采样频率为1000 Hz时为100个值
final rawData = List<double>.generate(25, (i) => i.toDouble());
// 或者
final rawData = List<double>.generate(100, (i) => i.toDouble());

可选函数(非必需)

检查初始信号是否损坏。如果您希望显式检测并通知信号损坏,可以使用此方法。

if (math.isInitialSignalCorrupted) {
  // 信号损坏!
}

使用库

添加并处理数据

math.push(samples);
math.process();

获取结果

if(math.rr_detected) {
  // 检查信号中是否有新的峰值
  // RR间隔长度
  double rr = math.rr;
  // 心率
  double hr = math.hr;
  // 压力指数
  double pi = math.pressureIndex;
  // 模态
  double moda = math.moda;
  // 模态幅度
  double amplModa = math.amplitudeModa;
  // 变异范围
  double variationDist = math.variationDistance;
  math.checkRR();
}

结束与库的工作

math.dispose();

完整示例

以下是一个完整的示例代码,展示了如何使用callibri_ecg插件来处理心电图数据。

import 'package:flutter/material.dart';
import 'package:callibri_ecg/callibri_ecg.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late final CallibriEcgMath math;

  [@override](/user/override)
  void initState() {
    super.initState();

    int samplingRate = 500;
    int dataWindow = samplingRate ~/ 2;
    int nWinsForPressureIndex = 30;
    math = CallibriEcgMath(samplingRate, dataWindow, nWinsForPressureIndex);
    
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    math.dispose();
  }

  void run() {
    final samples = List<double>.generate(100, (i) => i * 0.006);
    math.push(samples);
    math.process();

    print("""
          心率: ${math.hr}
          模态: ${math.moda}
          模态幅度: ${math.amplitudeModa}
          最近一个R峰索引: ${math.lastRPeakIndex}
          压力指数: ${math.pressureIndex}
          RR间隔: ${math.rr}
          变异范围: ${math.variationDistance}
          初始信号是否损坏: ${math.isInitialSignalCorrupted}
          是否检测到RR: ${math.isRRDetected}
          """);

    math.clear();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: run,
            child: const Text("运行"),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter心电图绘制插件callibri_ecg的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter心电图绘制插件callibri_ecg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


callibri_ecg 是一个用于在 Flutter 应用程序中绘制心电图的插件。它提供了实时心电图数据的可视化功能,通常用于健康监测或医疗相关的应用程序。以下是如何在 Flutter 项目中使用 callibri_ecg 插件的基本步骤。

1. 添加依赖项

首先,你需要在 pubspec.yaml 文件中添加 callibri_ecg 插件的依赖项。

dependencies:
  flutter:
    sdk: flutter
  callibri_ecg: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖项。

2. 导入插件

在你的 Dart 文件中导入 callibri_ecg 插件。

import 'package:callibri_ecg/callibri_ecg.dart';

3. 初始化插件

在使用 callibri_ecg 之前,通常需要初始化插件。你可以使用 CallibriEcg 类来进行初始化。

CallibriEcg callibriEcg = CallibriEcg();

4. 绘制心电图

callibri_ecg 插件通常提供了一个 Widget 来绘制心电图。你可以将这个 Widget 添加到你的 UI 中。

class EcgScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('心电图绘制'),
      ),
      body: Center(
        child: EcgGraph(
          data: _getEcgData(),  // 获取心电图数据
          width: MediaQuery.of(context).size.width,
          height: 200,
        ),
      ),
    );
  }

  List<double> _getEcgData() {
    // 这里返回心电图数据,通常是一个包含 ECG 值的列表
    return [/* 你的心电图数据 */];
  }
}

5. 处理实时数据

如果你的应用程序需要处理实时的心电图数据,你可以使用 callibriEcg 提供的方法来监听数据流。

StreamSubscription<List<double>>? _ecgSubscription;

void startEcgMonitoring() {
  _ecgSubscription = callibriEcg.ecgStream.listen((data) {
    // 处理实时心电图数据
    print('Received ECG data: $data');
  });
}

void stopEcgMonitoring() {
  _ecgSubscription?.cancel();
}

6. 清理资源

在不需要使用 callibri_ecg 时,记得取消订阅并清理资源。

[@override](/user/override)
void dispose() {
  stopEcgMonitoring();
  super.dispose();
}

7. 错误处理

在处理心电图数据时,可能会遇到错误。你可以通过监听错误流来处理这些情况。

StreamSubscription<dynamic>? _errorSubscription;

void startErrorMonitoring() {
  _errorSubscription = callibriEcg.errorStream.listen((error) {
    // 处理错误
    print('Error occurred: $error');
  });
}

void stopErrorMonitoring() {
  _errorSubscription?.cancel();
}

8. 示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用程序中使用 callibri_ecg 插件。

import 'package:flutter/material.dart';
import 'package:callibri_ecg/callibri_ecg.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ECG Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: EcgScreen(),
    );
  }
}

class EcgScreen extends StatefulWidget {
  [@override](/user/override)
  _EcgScreenState createState() => _EcgScreenState();
}

class _EcgScreenState extends State<EcgScreen> {
  final CallibriEcg callibriEcg = CallibriEcg();
  StreamSubscription<List<double>>? _ecgSubscription;
  StreamSubscription<dynamic>? _errorSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    startEcgMonitoring();
    startErrorMonitoring();
  }

  [@override](/user/override)
  void dispose() {
    stopEcgMonitoring();
    stopErrorMonitoring();
    super.dispose();
  }

  void startEcgMonitoring() {
    _ecgSubscription = callibriEcg.ecgStream.listen((data) {
      // 处理实时心电图数据
      print('Received ECG data: $data');
    });
  }

  void stopEcgMonitoring() {
    _ecgSubscription?.cancel();
  }

  void startErrorMonitoring() {
    _errorSubscription = callibriEcg.errorStream.listen((error) {
      // 处理错误
      print('Error occurred: $error');
    });
  }

  void stopErrorMonitoring() {
    _errorSubscription?.cancel();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('心电图绘制'),
      ),
      body: Center(
        child: EcgGraph(
          data: _getEcgData(),  // 获取心电图数据
          width: MediaQuery.of(context).size.width,
          height: 200,
        ),
      ),
    );
  }

  List<double> _getEcgData() {
    // 这里返回心电图数据,通常是一个包含 ECG 值的列表
    return [/* 你的心电图数据 */];
  }
}
回到顶部