如何在处理代码中添加每分钟节拍计算器?

时间:2016-12-12 21:49:55

标签: java

我正在使用从网站获取心跳传感器的代码。此代码显示的信号如下所示:

enter image description here

你能帮我添加一个检查,每当信号超过某个阈值时,它会递增一个整数吗?这需要仅发生10秒,检查停止10秒后再乘以6以显示每分钟的节拍量。

我正在使用的代码完成了成像,我想每分钟添加节拍。

import processing.serial.*;

Serial myPort; // The serial port
int xPos = 1; // horizontal position of the graph
float oldHeartrateHeight = 0; // for storing the previous reading

void setup () {
  // set the window size:
  size(600, 400);
  frameRate(25);

  // List available serial ports.
  println(Serial.list());

  // Setup which serial port to use.
  // This line might change for different computers.
  myPort = new Serial(this, Serial.list()[1], 9600);

  // set inital background:
  background(0);
}

void draw () {
}

void serialEvent (Serial myPort) {
  // read the string from the serial port.
  String inString = myPort.readStringUntil('\n');

  if (inString != null) {
    // trim off any whitespace:
    inString = trim(inString);
    // convert to an int
    println(inString);
    int currentHeartrate = int(inString);

    // draw the Heartrate BPM Graph.
    float heartrateHeight = map(currentHeartrate, 0, 1023, 0, height);
    stroke(0,255,0);
    line(xPos - 1, height - oldHeartrateHeight, xPos, height - heartrateHeight);
    oldHeartrateHeight = heartrateHeight;
    // at the edge of the screen, go back to the beginning:
    if (xPos >= width) {
      xPos = 0;
      background(0);
    } else {
      // increment the horizontal position:
      xPos++;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

免责声明:当然,不言而喻,这只是一个指导原则。在没有经过全面测试的情况下,不要将它与某人联系起来!

最简单的检查是在信号穿过虚线时注意 - 通常是中点,如下所示:

Crossover points are easier

这会立即让事情变得更容易 - 我们只需要检查我们的最新值何时高于该行,而前一个值低于该行;无论何时发生这种情况,我们的信号都必须越线。这很简单,使用PS C:\> $pattern = ',(?=(?:[^"]*"[^"]*")*[^"]*$)\s?' PS C:\> $mailAddresses = '"John Doe" <john@doe.example>, "Doe, Jane" <jane@doe.example>' PS C:\> $mailAddresses -split $pattern "John Doe" <john@doe.example> "Doe, Jane" <jane@doe.example> 作为中点:

750

仔细观察你的信号,它真的很吵,这意味着我们可能会因为一个高于线路的样本而非常不走运,然后立即跌落到它下方,给我们一个错误的读数。为了解决这个问题,您可以在当前的Heartrate值中添加moving average - 这样可以为您消除细微的噪音。将其添加到您的项目中:

int currentHeartrate = int(inString);
int midpoint=750;

if(currentHeartrate >= midpoint && oldHeartrateHeight < midpoint){

    // It crossed the line!
    beats++;

}

而不是使用public class MovingAverage { private final float[] window; private float sum = 0f; private int fill; private int position; public MovingAverage(int size) { this.window=new float[size]; } public void add(float number) { if(fill==window.length){ sum-=window[position]; }else{ fill++; } sum+=number; window[position++]=number; if(position == window.length){ position=0; } } public float getAverage() { return sum / fill; } } currentHeartrate,而是首先获取移动平均线 - 让我们称之为oldHeartrateHeight - 然后将其缓存在{{1}中而是用这两个值进行相同的比较。

更进一步,您可以通过计算这些节拍标记之间的样本数来实时显示您的BPM指标。当您每秒获得固定数量的样本时,您可以将这些样本除以这个时间并应用另一个移动平均值。那就给了我们这个:

averageHeartrate

有些信号是邪恶的,也有一个移动的中点。如果是这种情况,我会通过记录来接近:

  • 自上一次节拍以来所见的最大值
  • 自上一次节拍以来所见的最小值

然后简单地从那些中点。从本质上讲,您最终会随时跟踪中点:

oldAverageHeartrate