2012-01-12 5 views
0

私は、読み取りからecgバイト配列file.now私は読み取りのQRSのQRSを検出したいと思います。 これをjavaでどのように達成できますか?QRSの検出では、javaからecgバイト配列

これらのバイトからLifegain除細動器(心電図デバイス).i draw ecgからバイト配列を取得します。これらのバイトからアンドロイド上にi.draw ecgを取得します。私はQRS複合体(1心拍の波の時間および電圧の計算に使用される用語) .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

+0

私はあなたが実際の医学の文脈でこれをしていないことを願っています... – NPE

+0

質問が編集されました。 – shahkhalid

答えて

1

あなたが持っていると思うデータであれば、アルゴリズムの1つを使用してQRS群を検出する必要があります。

QRSコンプレックスを検出するアルゴリズムはたくさんありますが、最も簡単なのは移動式平均ベースのフィルタリングシステムです。リアルタイムQRS検出への応用 by HC Chen and SW Chenそれはhttp://www.cinc.org/archives/2003/pdf/585.pdfにある)。

の段階がある:ローパスピクチャから段階

を作る

  • ハイパスフィルタ
  • ローパスフィルタ
  • Descisionあなたは今、私たちがピークに我々が持っていることに気づくことができます私たちのQRS群を検出する必要があります。最後の段階は意思決定段階です。記事では、これを実装する式があります。

    QRS複合体がいつ開始するのかを知る必要があります。そのためにしきい値を設定する必要があります。この実装で式は:

    閾値=アルファ*ガンマ*ピーク+(1 - アルファ)*閾値

    ピークがウィンドウ内のローカル最大値である(我々は、通常の信号を検索します閾値は初期値(最初に見つかったピークとすることができる)であり、αおよびγはランダムに生成され、αは0より大きく1より小さく、γは0.15または0.20である。電流信号の値が閾値を超えると、QRS群が見出される。

    // 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

0

は、下のリンクに従ってください、私は、彼らはあなたを助けると思う:

ここでローパス、ハイパスおよび意思決定のためのJavaソースコードです。

http://www.cinc.org/archives/2008/pdf/0441.pdf

http://carg.site.uottawa.ca/doc/ELG6163GeoffreyGreen.pdf

http://www.eplimited.com/osea13.pdf

http://mirel.xmu.edu.cn/mirel/public/Teaching/QRSdetection.pdf

http://sourceforge.net/projects/ecgtoolkit-cs/files/ecgtoolkit-cs/ecgtoolkit-cs-2_2/

関連する問題