Найти производную результирующей функции по заданному циклическому массиву, который заполняется в прямом эфире последовательно, как скользящий буфер - PullRequest
0 голосов
/ 04 июля 2019

У меня есть сигнал данных, который генерируется с постоянным интервалом в 500 мс.Это измерение в реальном мире, и поэтому в его базовой линии присутствует некоторый шум.Шум довольно постоянный.

Я получаю результаты измерений через регулярные промежутки времени и сохраняю их в круговом буферизированном буфере данных выборок.Этот скользящий буфер является массивом значений, которые расположены в позициях (0,1,2,3,4,5 ... -> n).Как только n-ая позиция в этом массиве достигнута, мой буфер переворачивает и перезаписывает значение в 0-ой позиции массива, затем значение в 1-ой позиции массива и так далее, пока значение в n-ой позиции не будет перезаписано (затем снова произойдет опрокидывание).Этот процесс повторяется снова и снова.Я использую скользящий буфер выборок, чтобы вычислить скользящее среднее и стандартное отклонение, и выполнить линейную экстраполяцию, используя данные в буфере.

Теперь для моей проблемы:

Сигнал реального мира может находиться в 3 штатах.Либо увеличивается с течением времени с неизвестной скоростью, либо уменьшается с течением времени с неизвестной скоростью, либо он также может оставаться довольно постоянным во времени, пока не будет обнаружено увеличение или уменьшение.(Мне нужно определить увеличение или уменьшение по достаточно стабильной базовой линии) Такое увеличение может произойти в любой момент.

Я хочу определить, увеличивается ли сигнал с течением времени, уменьшается с течением времени илиоставаясь постоянной с течением времени с хорошей степенью уверенности.Графически говоря, я ожидаю, что мои данные будут колебаться при некотором базовом значении и будут оставаться постоянными до некоторого времени t1, в этот момент сигнал будет либо увеличиваться, либо уменьшаться, и продолжать увеличиваться или уменьшаться до некоторого времени t2, в которое состояние изменится.Какой алгоритм мог бы эффективно это заметить?

Я подумал, может быть, используя производную, вычисленную по точкам данных в массиве, и если наклон касательной линии положительный, то график со временем увеличивается, если отрицательныйзатем уменьшается, а если 0, то постоянная?Не уверен, как реализовать это в Java на моем скользящем массиве или если он будет работать.

Я думаю, что достаточно надежный сигнал увеличения / уменьшения будет, если мои данные будут на 3 * stdDev выше или ниже скользящей средней, ноЯ не уверен, что это так.

Круговой массив:

  private final static int NUM_SAMPLES = 100;
            double[] samples = new double[NUM_SAMPLES];
            int sampleIndex;

        public boolean isBufPopulated() {
                synchronized(this) {
                    return this.isBufPopulated;
                }
            }

            public void addSample(double val) {
                synchronized(this) {
                    samples[sampleIndex++] = val;
                    if(sampleIndex == NUM_SAMPLES) {
                        sampleIndex = 0;
                        isBufPopulated = true;
                    }
                    this.avg = calcAvg();
                }
            }

Моя базовая линия реального мира выглядит так:

data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -9    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -11    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 1    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -2    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -4    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= -7    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3
data= 3    avgData= -3    stdDevData= 3    extrapolatedData= -3

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я бы тоже оставил комментарий, но он слишком длинный.

Я вычисляю свое стандартное значение и среднее значение, используя следующий код:

Примечание * У меня есть рабочий Java-свинг, который обрабатывает мои многопоточности, поэтому мои методы должны быть синхронизированы.

    public double getLatestSample() {
        synchronized(this) {
            return samples[getCircularIndex(sampleIndex-1,NUM_SAMPLES)];
        }
    }

    public double getAverage() {
        synchronized(this) {
            return this.avg;
        }
    }

    public double getStdDev() {
        synchronized(this) {
            double sum = 0;
            for(int i = 0; i < samples.length; i++) {
                double x = samples[i];
                sum += (x-avg)*(x-avg);
            }
            return Math.sqrt(sum / (samples.length-1));
        }
    }

    public double getExtrapolatedValue() {
        synchronized(this) {
            double sum = 0;
            for(int i = 0; i < samples.length; i++) {
                sum += i * (samples[getCircularIndex(i-samples.length, samples.length)] - avg);
            }
            double m = sum/samples.length;
            double b = avg - m;
            return m+b;
        }
    }

    private double calcAvg() {
        synchronized(this) {
            double sum = 0;
            for(int i = 0; i < samples.length; i++) {
                sum += samples[i];
            }
            return sum/samples.length;
        }
    }

    private int getCircularIndex(int i, int N) {
        return (i + N) % N;
    }

идея подвыборки довольно приличная, мне любопытно, если бы взятие производной сообщило бы мне более точную скорость изменения. Если я смогу получить наклон касательной к кривой, которая представлена ​​всеми точками данных, хранящимися в моем буфере, то я могу установить, увеличивается ли общий сигнал или нет, или он постоянен (я думаю), определяется ли наклон положительный, отрицательный или около 0.

Как бы вы рассчитали производную от образцов в моем буфере?

0 голосов
/ 04 июля 2019

Я бы сделал этот комментарий, потому что это всего лишь некоторый совет и справка, но он слишком длинный.

Статистика сложная, легко вычисляемая и трудно интерпретируемая.

Если этоэто математический вопрос, я думаю, я могу дать вам предложения, но не ответы.

Многое зависит от того, насколько шумным является ваш сигнал и даже форма шума, включая тот факт, что вы моглииметь (или нет) выбросы (читай, которые могут сильно отличаться от среднего значения и / или от фактического измеримого значения).

Тогда есть также требования, которым должно соответствовать ваше заявление.Сколько времени вы можете иметь между измерением значения и фактическим обнаружением изменения?

Что я могу вам сказать, так это то, что идея кольцевого буфера очень хороша.Вы действительно должны избегать использования новых выделенных объектов, насколько это возможно, потому что GC может быть вашим врагом здесь.

500 мс дает вам некоторую свободу действий, но вам все равно нужно держать свою память под контролем, чтобы избежать длительного GC, остановившего мирпаузы.

Вы можете вычислить скользящее среднее и даже стандартное отклонение, не перечитывая весь буфер.

Отметьте этот ответ , чтобы получить некоторые рекомендации по вычислениям.

Я бы сравнил 2 подвыборки и проверил, больше ли один, чем другой, сравнив их среднее значение, разделенное на сигму первой подвыборки, пытаясь найти хороший компромисс между пропущенными изменениями и ложноположительныминастройка размера выборок, смещения / перекрытия и сигма, необходимых для запуска изменения.

Также я хотел бы рассмотреть использование медианы вместо среднего, чтобы при необходимости было менее чувствительным к выбросам.

...