我正在使用从网站获取心跳传感器的代码。此代码显示的信号如下所示:
你能帮我添加一个检查,每当信号超过某个阈值时,它会递增一个整数吗?这需要仅发生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++;
}
}
}
答案 0 :(得分:0)
免责声明:当然,不言而喻,这只是一个指导原则。在没有经过全面测试的情况下,不要将它与某人联系起来!
最简单的检查是在信号穿过虚线时注意 - 通常是中点,如下所示:
这会立即让事情变得更容易 - 我们只需要检查我们的最新值何时高于该行,而前一个值低于该行;无论何时发生这种情况,我们的信号都必须越线。这很简单,使用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