我正在从事某种涉及模拟ECG(心电图)的项目。我通过在一个间隔之间生成一些随机数并将该数据发送到另一个对其进行分析和绘制图形的程序来实现。但是,问题在于java代码在[a,b]区间之间生成的随机数具有很大的方差,这意味着下一个生成的随机值与前一个数字有很大差异。我想要的是一个随机数流,略有变化,以使图看起来很平滑。在这一点上,生成的图非常刺眼,但我希望它像真实的ECG图一样平滑且变化。
请帮我做。
这是代码
//setup ECG graph
StdDraw.setXscale(0.0, 100.0);
StdDraw.setYscale(0.0,200.0);
StdDraw.setPenColor(StdDraw.BLUE);
StdDraw.setPenRadius(0.0009);
//generate random points between interval of range
int t = 0;
int prevVal = 0;
int nextVal;
while(true){
nextVal = range.getRandomValue();
System.out.println(nextVal);
StdDraw.point(prevVal, nextVal);
StdDraw.line(t-1, prevVal, t, nextVal);
StdDraw.show(100);
prevVal = nextVal;
t = (t+1) % 100;
if(t == 0){
StdDraw.clear();
}
}
谢谢
最佳答案
为什么不尝试使用sin(t)
函数调制随机信号:
long n = 0;
double randomWeight = 0.5;
while(true) {
nextVal = range.getRandomValue();
double temp = AMPLITUDE*(randomWeight*((double)nextVal)+(1.0-randomWeight)*Math.sin(2.0*Math.PI*((double)n)*WIDTH_FACTOR));
nextVal = (long)temp;
n++;
System.out.println(nextVal);
StdDraw.point(prevVal, nextVal);
StdDraw.line(t-1, prevVal, t, nextVal);
StdDraw.show(100);
prevVal = nextVal;
t = (t+1) % 100;
if(t == 0){
StdDraw.clear();
}
这个想法是产生一个正弦波函数,并给它添加一些随机噪声。
您可能需要将此噪声添加到方波中。我真的不太了解心电图的样子,但我想它必须由心跳来控制。
编辑:
我刚刚检查了这些信号的样子:
在我看来,一个相对平坦的随机信号会被周期性的尖峰干扰而给出一个更准确的模型:
long n = 0;
while(true) {
nextVal = range.getRandomValue();
if(n % SPIKE_PERIOD == 0) nextVal = SPIKE_APLITUDE*nextVal;
n++;
System.out.println(nextVal);
StdDraw.point(prevVal, nextVal);
StdDraw.line(t-1, prevVal, t, nextVal);
StdDraw.show(100);
prevVal = nextVal;
t = (t+1) % 100;
if(t == 0){
StdDraw.clear();
}