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

时间:2017-08-27 15:16:10

标签: 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[j] * in[i - j];
            else out[i] += H[j] * dataTail[i + size - j];
    }
    System.arraycopy(in, sizeIn - size - 1, dataTail, 0, size);
}

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

2 个答案:

答案 0 :(得分:1)

与C / C ++相比,Java对于大量计算来说非常慢,考虑使用Android NDK for JNI来编译C / C ++中的主逻辑。

答案 1 :(得分:1)

对于长度为100的FIR滤波器内核,您可能需要使用零填充FFT / IFFT重叠添加/保存快速卷积方法,而不是时域卷积。这将更好地用JNI中的C语言编写。我不知道库,但算法可能会在一些DSP教科书中解释。