问题描述
我正在尝试使某些音频带通,并且已经成功实现并从python中的scipy.signal模块获得了正确的结果。但是我必须在Java中执行此操作,以便可以在android中进行一些过滤。
我尝试在Java中使用berndporr/iirj库,但它会返回原始数据。这是使用此库的Java代码。 public class SimpleChat : ServerlessHub
{
[FunctionName("negotiate")]
public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req)
{
// Doing Db check here
return Negotiate(req.Headers["x-ms-signalr-user-id"],GetClaims(req.Headers["Authorization"]));
}
是包含音频样本的双精度数组。
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]);
}
与使用scipy的python程序的输出不匹配。
python代码如下:
filteredList
此处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,order=5):
b,a = butter_bandpass(lowcut,order=order)
y = lfilter(b,a,data)
return y
arr = np.array(list)
filteredList = butter_bandpass_filter(arr,20,200,order=3)
包含正确的输出。
我正在将结果与使用20hz-200hz带通滤波器的FL studio的输出进行比较。
谁能告诉我我的Java代码有什么问题,或者谁能告诉我一个更好的音频过滤库。
解决方法
对于Android中的音频过滤,有一个看起来可用的标准equalizer AudioEffect库。
FWIW,Java是一种进行信号处理的痛苦语言。如果您需要Android的AudioEffects之外的其他功能,请考虑使用Android NDK并用C ++编写。