Scipy Butterworth带通滤波器的Java替代品

问题描述

我正在尝试使某些音频带通,并且已经成功实现并从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 ++编写。