JTransforms 在 Android 音频中的使用

Posted

技术标签:

【中文标题】JTransforms 在 Android 音频中的使用【英文标题】:JTransforms usage in Android audio 【发布时间】:2014-06-24 11:45:36 【问题描述】:

我一直在寻找快速和完整的 DSP java 库来与 android 音频操作一起使用。 我遇到了 FFT 高度计算的问题。然后我找到了 JTransforms。 我无法在任何地方找到有关如何使用它的文档。具体来说,我对输入信号感到困惑。在我的情况下,我有一个 wav 文件,转换为字节数组,然后转换为双数组,使用这个:

public static double[] read(byte[]file) 
    byte[] data = new byte[file.length];
    int N = data.length;
    double[] d = new double[N/2];
    for (int i = 0; i < N/2; i++) 
        d[i] = ((short) (((data[2*i+1] & 0xFF) << 8) + (data[2*i] & 0xFF))) / ((double) MAX_16_BIT);
    
    return d;

但是当我查看this documentation 时,我不明白eache 方法的输入是什么。

复数按顺序存储为两个双精度值

我需要转换成 Complex 才能使用这个库吗?

【问题讨论】:

FFT audio input的可能重复 这是一个特定的库。我在问如何使用这个 JTransforms 库。另一个问题是关于转换为一般的 FFt 输入。 【参考方案1】:

DoubleFFT_1D 有方法 realForward 采用实值样本(双精度)数组,因此您无需将输入转换为 Complex。

您链接的documentation 进一步描述了输入要求,具体取决于您使用的是realForward(double[]) 还是realForward(double[], int)

【讨论】:

【参考方案2】:

在 Java 中执行 DSP 比在具有良好优化库的 NDK 中执行要慢得多。

Superpowered Audio SDK 具有许多 DSP 功能,包括优于 Apple vDSP 的 FFT。

特别是如果您想接收幅度和相位。

查看 SuperpoweredPolarFFT 方法:http://superpowered.com/docs/_superpowered_f_f_t_8h.html#a0b63c427504bcbbd9ead8a2ff58daf62

【讨论】:

我喜欢你项目的想法。我在 android 上遇到了很多音频问题。我在录制时仍然有奇怪的延迟,有时需要 500 毫秒才能真正开始录制。 看看,让我知道你的想法!

以上是关于JTransforms 在 Android 音频中的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 JTransforms 的 FFT:是基数 2 吗?

如何将音频剪辑转换为数组以执行 FFT?

jTransforms DoubleFFT_1D 前两个值

区分注释FFT算法

在 Android 中录制音频时的 VU(音频)计

在 Android 中使用 MediaPlayer 播放音频文件