如何保存Java中检测到的峰值位置?

如何保存Java中检测到的峰值位置?,java,signal-processing,Java,Signal Processing,我在Java中有一个ECG信号的峰值检测算法,但它只给出检测到的峰值数量。我不知道如何保存阵列中每个峰值的位置,以后可以用信号绘制 这是我的代码,它只计算峰值。有人能帮我改变它,让它保留每个峰的位置吗 /** Peak detection * findePeaks() implements a general peak picking method for finding n local maxima in an array * * @param data input data *

我在Java中有一个ECG信号的峰值检测算法,但它只给出检测到的峰值数量。我不知道如何保存阵列中每个峰值的位置,以后可以用信号绘制

这是我的代码,它只计算峰值。有人能帮我改变它,让它保留每个峰的位置吗

/** Peak detection
 * findePeaks() implements a general peak picking method for finding n local maxima in an array
 *   *  @param data input data
 *   *  @param peaks list of peak indexes
 *   *  @param width minimum distance between peaks
 *   *  @return The number of peaks found
 */
public static int findPeaks(double[] ecgMW, int[] peaks, int width) {
    int peakCount = 0;
    int maxp = 0;
    int mid = 0;
    int end = ecgMW.length;
while (mid < end) {
    int i = mid - width;
    if (i < 0)
        i = 0;
    int stop = mid + width + 1;
    if (stop > ecgMW.length)
        stop = ecgMW.length;
    maxp = i;
    for (i++; i < stop; i++)
        if (ecgMW[i] > ecgMW[maxp])
            maxp = i;
    if (maxp == mid) {
        int j;
        for (j = peakCount; j > 0; j--) {
            if (ecgMW[maxp] <= ecgMW[peaks[j-1]])
                break;
            else if (j < peaks.length)
                peaks[j] = peaks[j-1];
        }
        if (j != peaks.length)
            peaks[j] = maxp;
        if (peakCount != peaks.length)
            peakCount++;
    }
    mid++;
}
return peakCount;
}
/**峰值检测
*findePaks()实现了一种通用的峰值拾取方法,用于在数组中查找n个局部极大值
**@param数据输入数据
**@param峰值峰值索引列表
**@参数宽度峰值之间的最小距离
**@返回找到的峰值数
*/
公共静态int FindPeak(双[]ecgMW,int[]峰值,int宽度){
int peakCount=0;
int maxp=0;
int-mid=0;
int end=ecgMW.length;
while(中间ecgMW.长度)
停止=ecgMW.长度;
maxp=i;
对于(i++;iecgMW[maxp])
maxp=i;
如果(maxp==mid){
int j;
对于(j=peakCount;j>0;j--){

if(ecgMW[maxp]这里是一个计算局部最小值和最大值的示例函数。这将为您自己的实现提供一个起点。 下面的代码绝对不是完整的或经过测试的,所以要小心。特别是如果您需要正确处理NaN或Inf值,您将需要更多的逻辑来处理这些特殊情况

公共类测试{
公共静态void main(字符串[]args){
双[]样本={1d,2d,2d,3d,0d,5d,6d,5d,0d};
整数宽度=2;
int[]峰值=新的int[samples.length];
int peakCount=FindPeak(样本、峰值、宽度);
对于(int i=0;i无峰值
}else if(samples.length==1){
峰值[0]=0;
返回1;
}
双上一次=样本[0];
//指示下一个峰值是最小值还是最大值
布尔值=样本[1]<样本[0];
对于(int i=1;i=samples.length){
//TODO:也许加上最后一个极值
打破
}
}
如果(isFalling&&prevsamples[i]){//local max
isFalling=!isFalling;
if(peakIndex==0 | | i-peaks[peakIndex-1]>=minPeakDist){
峰值[peakIndex++]=oldI-1;
}
}
prev=样本[i];
}
//TODO:也许加上最后一个极值
返回peakIndex;
}
}

您正在接受一个名为peaks的参数,它是peak@johnny5嗯,是的,我现在明白了。这很奇怪。这是一个我从一个朋友那里收到的代码示例,所以我不知道她在那里做什么。不管怎样,不管是什么代码示例-我需要找到一种方法,从输入数据中找到峰值位置,使用最小宽度为85个样本。你能帮忙吗?谢谢@Jannik-我似乎误解了代码。我正在尝试将其实现到我自己的程序中,我从一个朋友那里得到了这个示例,并且一直在尝试将其更改为适合我自己的。所以我实际上没有“峰值”数组。@Heidi,嗯,好吧,但是你面临的问题是什么?你可以只使用你发布的代码,或者它没有按预期工作?它没有工作-从头开始代码示例。我认为它会有帮助,但现在看到它更令人困惑。我的问题是,我有心电图数据,我使用MATLAB中的findpeaks函数在其中找到峰值我已经确定了数组中每个峰值的位置,以便用于进一步的数据分析。现在我正在尝试用Java实现它(我对Java非常陌生)我不知道怎么做。这是Pan-Tompkins算法的一部分,ecgMW是移动窗口函数的输出。我想用它作为峰值检测的输入,输出应该是一个数组,带有检测到的每个峰值的样本数。@Heidi我已经更新了我的答案,也许这对你有点帮助。如果你有问题关于密码,让我知道。