2012-01-12 52 views
0

我从file.now中读取ecg字节数组我想检测读取ecg字节的QRS。我如何在java中实现这个功能。从ecg字节数组中检测到的java QR码

我从Lifegain defibrilator(一个心电图设备)获取字节数组。我从这些字节在android上绘制心电图。现在我想检测QRS波群(用于计算一次心脏波形的时间和电压的术语) .DATA = LeadData “:” - 284,-127,-122,17,-35,10,32,10,52,16,49,33,38,69,70,58,45,93,47,88 ,58,90,149,5,82,-12,-4,40,-34,29,-29,5,-4,-17,-13,-29,-13,-4,-9,-9 ,-10,-20,-15,-22,-32,-25,-23,-2,-15,-7,-13,-19,-17,-28,-27,-27, - 33,-20,-16,-13,-20,-10,-22,-20,-19,-28,-15,-19,-22,-21,-9,-3,-6, -8,-6,-11,-8,-8,-5,-10,-5,-6,-9,-4,-6,3,20,3,14,7,11,10, 5,11,5,10,2,10,13,14"

问候,

沙阿

+0

你是知道的事实,即较少的努力,你把你的问题更像这将是关闭了,不是吗?请详细说明并告诉我们您的具体问题以及确切问题所在。 – Thomas 2012-01-12 13:02:37

+0

我希望你没有在实际的医疗环境中这样做...... – NPE 2012-01-12 13:03:26

+0

已编辑的问题。 – shahkhalid 2012-01-13 04:40:37

回答

1

如果您拥有的数据是我认为您拥有的数据,您需要使用其中一种算法来检测您的QRS波群。

有很多算法都来检测QRS波群,一个最简单的是基于内容的过滤系统与HC陈和SW陈其应用到实时QRS检测移动平均线(你可以得到它在http://www.cinc.org/archives/2003/pdf/585.pdf)。

的阶段是:

  • 高通滤波
  • 低通滤波
  • Descision决策阶段

从低通图片,你可以看到,现在我们有峰,我们需要检测我们的QRS综合症。最后一个阶段是制定决策阶段。在文章中你有一个公式来实现这一点。

我们需要知道QRS波群何时开始,所以我们需要为此设置一个阈值。在该实施方式的公式为:

阈值=阿尔法*伽马*峰+(1 - α)*阈

的峰是在窗口的局部最大值(我们通常搜索与所述信号一个宽度为250的窗口),阈值是初始值(第一个可以是第一个找到的峰值),alpha和gamma是随机创建的,alpha大于0且小于1,而gamma是0.15或0.20。如果当前信号的值超过阈值,则会找到QRS波群。

这里是Java的源代码低通,高通和决策:

// High pass filter 
// y1[n] = 1/M * Sum[m=0, M-1] x[n-m] 
// y2[n] = x[n - (M+1)/2] 
public static float[] highPass(int[] sig0, int nsamp) { 
    float[] highPass = new float[nsamp]; 
    int M = 5; // M is recommended to be 5 or 7 according to the paper 
    float constant = (float) 1/M; 

    for(int i=0; i<sig0.length; i++) { 
     float y1 = 0; 
     float y2 = 0; 

     int y2_index = i-((M+1)/2); 
     if(y2_index < 0) { 
      y2_index = nsamp + y2_index; 
     } 
     y2 = sig0[y2_index]; 

     float y1_sum = 0; 
     for(int j=i; j>i-M; j--) { 
      int x_index = i - (i-j); 
      if(x_index < 0) { 
       x_index = nsamp + x_index; 
      } 
      y1_sum += sig0[x_index]; 
     } 

     y1 = constant * y1_sum; 
     highPass[i] = y2 - y1; 

    }   

    return highPass; 
} 

// Low pass filter; na n-to mesto zapiši kvadrat 30ih števil v oknu 
public static float[] lowPass(float[] sig0, int nsamp) { 
    float[] lowPass = new float[nsamp]; 
    for(int i=0; i<sig0.length; i++) { 
     float sum = 0; 
     if(i+30 < sig0.length) { 
      for(int j=i; j<i+30; j++) { 
       float current = sig0[j] * sig0[j]; 
       sum += current; 
      } 
     } 
     else if(i+30 >= sig0.length) { 
      int over = i+30 - sig0.length; 
      for(int j=i; j<sig0.length; j++) { 
       float current = sig0[j] * sig0[j]; 
       sum += current; 
      } 
      for(int j=0; j<over; j++) { 
       float current = sig0[j] * sig0[j]; 
       sum += current; 
      } 
     } 

     lowPass[i] = sum; 
    } 

    return lowPass; 

} 

public static int[] QRS(float[] lowPass, int nsamp) { 
    int[] QRS = new int[nsamp]; 

    double treshold = 0; 

    for(int i=0; i<200; i++) { 
     if(lowPass[i] > treshold) { 
      treshold = lowPass[i]; 
     } 
    } 

    int frame = 250; 

    for(int i=0; i<lowPass.length; i+=frame) { 
     float max = 0; 
     int index = 0; 
     if(i + frame > lowPass.length) { 
      index = lowPass.length; 
     } 
     else { 
      index = i + frame; 
     } 
     for(int j=i; j<index; j++) { 
      if(lowPass[j] > max) max = lowPass[j]; 
     } 
     boolean added = false; 
     for(int j=i; j<index; j++) { 
      if(lowPass[j] > treshold && !added) { 
       QRS[j] = 1; 
       added = true; 
      } 
      else { 
       QRS[j] = 0; 
      }     
     } 

     double gama = (Math.random() > 0.5) ? 0.15 : 0.20; 
     double alpha = 0.01 + (Math.random() * ((0.1 - 0.01))); 

     treshold = alpha * gama * max + (1 - alpha) * treshold; 

    } 

    return QRS; 
} 
+0

@Bo你没有右键点击链接并另存为?每个条目都需要自己的路线? – ZeroCool 2012-03-21 21:19:30