有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用安卓 java查找峰值

我试图编码,如果斜率的符号值从正变为负,那么这个值就是我的传感器压力峰值。即使找到了峰值,也可能会有另一个峰值,因为压力在增加。 我该怎么做?提前谢谢你

for (int i =1;i<strNumbers.length -2;i++){ //strNumber is the array stream from sensor.
            String y1;
            y1 = strNumbers[i];
            String y2;
            y2 = strNumbers[i+1];
            float y_2 = Float.parseFloat(y2);
            float y_1 = Float.parseFloat(y1);
            float delta_y = y_2  - y_1;
            float mySlope = 0;
            float delta_x;
            delta_x  = 1; //always difference is 1.  
             mySlope =  (delta_y / delta_x);

              activity.FirstPeak.setTextColor(Color.RED);
              activity.FirstPeak.setText(String.valueOf(mySlope));

        }

共 (1) 个答案

  1. # 1 楼答案

    在循环中的每个点上,你需要比较两个渐变——左边的渐变和右边的渐变。如果左边是正的,右边是负的,那么你已经找到了一个峰值

    List<Integer> peaks = new ArrayList<>();
    
    for (int i = 1; i < strNumbers.length - 1; i++)
    {
        float left = Float.parseFloat(strNumbers[i]) - Float.parseFloat(strNumbers[i - 1]);
        float right = Float.parseFloat(strNumbers[i + 1]) - Float.parseFloat(strNumbers[i]);
        if (left > 0 && right <= 0)
            peaks.add(i);
    }
    

    现在有了一个数组,包含所有峰值的索引。你可以这样找到绝对最大值:

    float max = 0;
    float maxIndex = -1;
    for (Integer i : peaks)
    {
        float peak = Float.parseFloat(strNumbers[i]);
        if (peak > max)
        {
            max = peak;
            maxIndex = i;
        }
    }
    

    你可以找到这样的峰间距离:

    int sum = 0;
    for (int i = 0; i < peaks.size() - 1; i++)
        sum += peaks.get(i + 1) - peaks.get(i);
    float average = (float)sum / (peaks.size() - 1)