Почему я получаю сообщение об ошибке IndexOutOfBoundsException в цикле фильтра нижних частот? - PullRequest
0 голосов
/ 09 мая 2019

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

Я не хочу делать фильтр с коэффициентами, мне просто нужна помощь, чтобы заставить формулу работать, пожалуйста.

/**
 * Lowpass filter
 * lpfilt() implements the digital filter represented by the difference equation:
 * y(nT) = 2y(nT - T) - y(nT - 2 T) + x(nT)- 2x(nT- 6T)+x(nT- 12T)
 */

public static ArrayList<Double> lpfilter(ArrayList<Double> ecg) {
    int N = ecg.size();

    ArrayList<Double> ecgLP = new ArrayList<Double>();
    for (int n = 0; n < N; n++) {
        if (n - 12 < 0) {
            ecgLP.set(n, ecg.get(n));
        } else {
            ecgLP.set(n, 2 * ecgLP.get(n - 1) - ecgLP.get(n - 2) + ecg.get(n) - 2 * ecg.get(n - 6) + ecg.get(n - 12));
        }
    }
    return ecgLP;
}

Ответы [ 2 ]

1 голос
/ 09 мая 2019

В случае цикла for в случае, когда n равно 0, в этом случае вы не можете вызвать ecgLP.get (n - 1), так как он становится ecgLP.get (-1), отрицательный индекс дает вам исключение.

1 голос
/ 09 мая 2019

Это происходит в первой итерации.Посмотрите на следующую строку:

ecgLP.set(n, ecg.get(n));

Для n = 0 вы пытаетесь установить ключ 0 со значением ecg.get (0).Но 0 пока не установлено.Поэтому вы получаете IndexoutofBounds-Error.Насколько я вижу, первые 12 (0..11) итераций должны заполнять ArrayList, но ваш код будет каждый раз с ошибками, потому что вы пытаетесь использовать элемент, который еще не был инициализирован.

Iпредложил бы вам выполнить инициализацию в отдельном цикле и затем начать с n = 12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...