【问题标题】:Java alternative for scipy butterworth bandpass filterscipy 巴特沃斯带通滤波器的 Java 替代方案
【发布时间】:2020-09-12 10:27:12
【问题描述】:

我正在尝试带通一些音频,并且我已经成功实现并从 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 包含正确的输出。 我将结果与应用 20hz-200hz 带通滤波器的 FL Studio 的输出进行比较。

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

【问题讨论】:

    标签: java signal-processing audio-processing


    【解决方案1】:

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

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

    【讨论】:

    • 这个标准的安卓均衡器只影响预定义的频段。例如,在我正在测试我的 android 应用程序的手机上,第一个频段从 20hz 到 460 hz,第二个频段从 460hz 到 1500hz。但我想带通频率从 50 赫兹到 1500 赫兹,所以 android 官方库对我没有用(我很乐意在这种情况下被证明是错误的)。
    • 你能推荐任何用于对 wav 文件进行带通滤波的 c++ 库
    • 你可以试试multichannel-audio-tools。特别是Chebyshev等的IIR滤波器设计函数在biquad_filter_design.h中,使用BiquadFilterCascadebiquad_filter.h中应用。
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2020-08-24
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多