我正在尝试带通一些音频,我已经成功地实现了,并从python中的scipy.signal模块获得了正确的结果。但我必须用java来做这件事,这样我才能在android中做一些过滤。
我尝试在java中使用berndporr/iirj库,但它返回的数据与最初的一样。下面是使用这个库的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包含了正确的输出。我正在将结果与FL studio的输出进行比较,FL studio正在应用一个20 is 200 is的带通滤波器。
有没有人能告诉我我的Java代码出了什么问题,或者有没有人能告诉我一个更好的音频过滤库。
发布于 2020-09-15 07:18:08
对于Android中的音频过滤,有一个标准的equalizer AudioEffect库,看起来很有用。
顺便说一句,Java是一种很难进行信号处理的语言。如果你需要的不仅仅是安卓的AudioEffects,可以考虑使用Android NDK并用C++编写。
https://stackoverflow.com/questions/63859350
复制相似问题