Java 为什么在低通滤波器环路中出现IndexOutOfBoundsException错误?

Java 为什么在低通滤波器环路中出现IndexOutOfBoundsException错误?,java,filter,signal-processing,Java,Filter,Signal Processing,我正试图在我的第一个Java应用程序中实现Pan-Tompkins算法。我已经根据原始文章对低通滤波器进行了以下循环,但在尝试运行它时,我一直遇到IndexOutOfBoundsException错误。有人能看出我哪里出错了吗 我不想做带系数的滤波器,我只是需要帮助才能使公式生效 /** * Lowpass filter * lpfilt() implements the digital filter represented by the difference equation: * y(

我正试图在我的第一个Java应用程序中实现Pan-Tompkins算法。我已经根据原始文章对低通滤波器进行了以下循环,但在尝试运行它时,我一直遇到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;
}
/**
*低通滤波器
*lpfilt()实现由差分方程表示的数字滤波器:
*y(nT)=2y(nT-T)-y(nT-2T)+x(nT)-2x(nT-6T)+x(nT-12T)
*/
公共静态ArrayList lpfilter(ArrayList ecg){
int N=ecg.size();
ArrayList ecgLP=新的ArrayList();
对于(int n=0;n
它发生在第一次迭代中。请看下面一行:

ecgLP.set(n, ecg.get(n));
对于n=0,您尝试使用ecg.get(0)值设置键0。但到目前为止尚未设置0。因此,您会得到IndexoutofBounds错误。据我所见,前12(0..11)次迭代应该会填满ArrayList,但是每次代码都会失败并出现错误,因为您试图使用尚未初始化的成员


我建议您在单独的循环中进行初始化,然后从n=12开始。

它发生在第一次迭代中。请看下面一行:

ecgLP.set(n, ecg.get(n));
对于n=0,您尝试使用ecg.get(0)值设置键0。但到目前为止尚未设置0。因此,您会得到IndexoutofBounds错误。据我所见,前12(0..11)次迭代应该会填满ArrayList,但是每次代码都会失败并出现错误,因为您试图使用尚未初始化的成员


我建议您在单独的循环中进行初始化,然后从n=12开始。

在for循环中,当n为0时,您不能调用ecgLP.get(n-1),因为它变成了ecgLP.get(-1),负索引会给您异常。

在for循环中,当n为0时,您不能调用ecgLP.get(n-1)当它变成ecgLP.get(-1)时,负索引会给你一个例外。

你需要使用
add
而不是set,至少当n<12我不知道algo,但if中的条件似乎被错误地颠倒时,可能你想写if(n-12>0)或if(n-12>=0)谢谢!非常有用的注释:-)您需要使用
add
而不是set,至少当n<12我不知道algo,但似乎if中的条件被错误地颠倒时,您可能想编写if(n-12>0)或if(n-12>=0)谢谢!非常有用的评论:-)嘿,梅尔文!谢谢,这真的很有道理。我将尝试为前12个索引添加一个初始化循环。嘿,梅尔文!谢谢,这真的很有道理。我将尝试为前12个索引添加一个初始化循环。