我正在尝试在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
。是什么原因以及解决这个问题的方法是什么? 建议,请完成快速信号过滤库。谢谢。
答案 0 :(得分:1)
与C / C ++相比,Java对于大量计算来说非常慢,考虑使用Android NDK for JNI来编译C / C ++中的主逻辑。
答案 1 :(得分:1)
对于长度为100的FIR滤波器内核,您可能需要使用零填充FFT / IFFT重叠添加/保存快速卷积方法,而不是时域卷积。这将更好地用JNI中的C语言编写。我不知道库,但算法可能会在一些DSP教科书中解释。