Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java Android中的数字过滤速度太慢_Java_Android_Signal Processing_Digital Filter - Fatal编程技术网

java Android中的数字过滤速度太慢

java Android中的数字过滤速度太慢,java,android,signal-processing,digital-filter,Java,Android,Signal Processing,Digital Filter,我试图在Android中实现音频信号的实时数字滤波。我使用了高通滤波器的标准代码: void doFilter(final short in[], short out[], int sizeIn) { int i, j; for (i = 0; i < sizeIn; i++) { out[i] = 0; for (j = 0; j < size; j++) if (i >= j) out[i] += H

我试图在Android中实现音频信号的实时数字滤波。我使用了高通滤波器的标准代码:

void doFilter(final short in[], short out[], int sizeIn) {
    int i, j;

    for (i = 0; i < sizeIn; i++) {
        out[i] = 0;
        for (j = 0; j < size; j++)
            if (i >= j) out[i] += H[j] * in[i - j];
            else out[i] += H[j] * dataTail[i + size - j];
    }
    System.arraycopy(in, sizeIn - size - 1, dataTail, 0, size);
}
void doFilter(最终短入[]、短出[]、整数){
int i,j;
对于(i=0;i=j)out[i]+=H[j]*in[i-j];
else out[i]+=H[j]*dataTail[i+size-j];
}
arraycopy(in,sizeIn-size-1,dataTail,0,size);
}

问题是该代码工作速度非常慢,无法实时过滤来自麦克风的信号:
200ms
用于
100个样本的过滤器和长
1700个样本的输入数据。原因是什么?解决这个问题的方法是什么<强>建议,请完成快速信号过滤库。< /强>谢谢。

< P>与C/C++相比,java计算量非常慢,考虑使用Android NDK为JNI编译C++中的主逻辑。您可能需要使用零填充FFT/IFFT重叠添加/保存快速卷积方法,而不是时域卷积。这最好在JNI中用C编写。我不知道有什么库,但算法可能会在一些DSP教科书中解释。

我对JNI是新手。您可以建议哪些现成的库来过滤信号?对不起,我没有做过任何类型的信号过滤。如果您了解基本的C编程,那么实现像您在问题中发布的那样的简单函数是非常容易的。在google中搜索库,如果你找不到,就学习Android JNI。你可以使用一个变量来计算总和,并分配给第二个(内部)循环之外的out[i]。但我不确定这是否有帮助。@h22我不太明白这是如何帮助数组成员out[I]访问可能比单个变量访问慢,而且您在循环中执行了很多次。我不确定Android Java编译器是否足够聪明来优化它。它需要多快才能达到可接受的范围?到底什么是dataTail(我理解这个概念,但在这种情况下它的用法是未知的)?您是否在缓冲区队列中的缓冲区上操作?若否,原因为何?你确定这个卷积是瓶颈吗?如果不执行卷积,一切都会按预期进行?这种算法可以更快,但只能在一定程度上。如果您离目标很远,并且没有其他改进选项,则hotpaw2可能是正确的,您必须切换档位。@Dave 40 ms是最大可接受范围。DataTail是前一个数据缓冲区的尾部。它是输入数据连续性所必需的。我已经完全相信Java不适合解决我的问题,现在我正在寻找一个现成的JNI库。