【问题标题】:java - how to simulate an ECG (electro-cardiogram)java - 如何模拟心电图(心电图)
【发布时间】:2023-03-29 11:44:01
【问题描述】:

我正在从事某种涉及模拟心电图(心电图)的项目。我通过在间隔之间生成一些随机数并将该数据发送到另一个程序来分析和绘制它来做到这一点。但是,问题是java代码在区间say [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(); 

            }
        }

谢谢

【问题讨论】:

  • 你好,阿卜杜勒。你知道什么样的数学函数会绘制出类似心电图的图吗?这是您首先想到的,然后尝试实施它,如果您在某个地方遇到困难,您应该重新提出您的问题。
  • @Abdul:你可以看看bezier curves,在所谓的控制点上绘制平滑图。 (可能有一些库实现了这一点,提供了一个简单的 Java API)如果它看起来像一个真正的 ECG,你可能只想使用随机值来更早/更晚地绘制“心跳”和/或改变幅度。跨度>

标签: java random plot sensors graphing


【解决方案1】:

为什么不尝试使用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(); 

}

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2021-07-29
    • 2011-01-12
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多