如何从音频中获取频率数组?

时间:2018-04-15 07:33:29

标签: java android audio fft frequency

现在我只能从音频文件中获取字节数组。但我需要声音的频率。我怎么能得到它。我正在尝试fft。但在那之后,我得到了非常大的数字,而且不是频率。当然,我不能跟我说话,因为这是Java

private static double[] fft(byte[] bytes) {
        double[] fft = new double[bytes.length];
        for (int k = 0; k < bytes.length; k++) {
            for (int n = 0; n < bytes.length; n++) {
                fft[k] += bytes[n] * Math.pow(Math.E, -2 * Math.PI * k * n / bytes.length);
            }
        }
        return fft;
    }

1 个答案:

答案 0 :(得分:0)

我建议使用复杂类型进行FFT计算,它会使一切变得更简单(或至少更具可读性),并且不会增加很多开销。

我不是一个java人,看起来JDK没有像这样的内置复杂类型BUT实现: https://introcs.cs.princeton.edu/java/97data/Complex.java.html

你的FFT可能是这样的(有点未经优化的伪代码!):

private static Complex[] fft(byte[] bytes) {
        Complex[] fft = new Complex[bytes.length];
        for (int k = 0; k < bytes.length; k++) {
            for (int n = 0; n < bytes.length; n++) {
                Complex temp = new Complex (0,-2 * Math.PI * k * n/bytes.length);
                fft[k] += bytes[n] * Complex.exp(temp);   
            }
        }
        return fft;
    }

你可以用

之类的东西来获得数量
Complex.abs(fft[k])

我还会看一下你的外环(k),这是你FFT的大小,它当前是输入的长度。这可能是您想要的,也可能不是,我建议您查看信号窗口。