【问题标题】:How can get array of frequency from audio?如何从音频中获取频率数组?
【发布时间】:2018-09-25 03:26:56
【问题描述】:

现在我只能从音频文件中获取字节数组。但我需要声音的频率。我怎么能得到它。我正在尝试fft。但在那之后,我得到了非常大的数字,而不是频率。当然,我不能多说 i,因为这是 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;
    }

【问题讨论】:

    标签: java android audio fft frequency


    【解决方案1】:

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

    我不是 java 人,JDK 似乎没有内置的复杂类型,但存在这样的实现: 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 的大小,当前将是输入的长度。这可能是也可能不是您想要的,我建议您查看信号窗口。

    【讨论】:

    • fft函数应该返回Complex[]temp是用new Complex(0,-2*Math.PI*k*n/bytes.length)构造的(实部应该是0)。
    • 好消息@SleuthEye。
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 2012-07-26
    • 2011-07-16
    • 2013-06-27
    • 2021-11-13
    • 2019-05-28
    • 2013-07-30
    • 2012-06-20
    相关资源
    最近更新 更多