Java scipy 巴特沃斯带通滤波器的替代方案

Java alternative for scipy butterworth bandpass filter

我正在尝试对某些音频进行带通,我已经成功实施并从 python 中的 scipy.signal 模块获得了正确的结果。但我的必要性是在 java 中执行此操作,以便我可以在 android.

中进行一些过滤

我尝试在 java 中使用 berndporr/iirj 库,但它 returns 数据是原来的样子。这是 java 中使用该库的代码。 list 是一个包含音频样本的双数组。

double[] filteredList = new double[list.length];
Butterworth butterworth = new Butterworth();
butterworth.bandPass(3,44100,110,90);
for(int i = 0; i < list.length; i++)
{
    filteredList[i] = butterworth.filter(list[i]);
}

filteredList 与我使用 scipy.

的 python 程序的输出不匹配

python代码如下:

import numpy as np
from scipy.signal import butter, filter

def butter_bandpass(lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return b, a

def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = lfilter(b, a, data)
    return y

arr = np.array(list)

filteredList = butter_bandpass_filter(arr, 20, 200, 44100, order=3)

此处 filteredList 包含正确的输出。 我正在将结果与应用 20hz-200hz 带通滤波器的 FL studio 的输出进行比较。

谁能告诉我我的 Java 代码有什么问题,或者谁能告诉我一个更好的音频过滤库。

对于 Android 中的音频过滤,有一个看起来可用的标准 equalizer AudioEffect 库。

FWIW,Java 是一种进行信号处理的痛苦语言。如果您需要 Android 的 AudioEffects 之外的东西,请考虑使用 Android NDK 并用 C++ 编写。