现在我只能从音频文件中获取字节数组。但我需要声音的频率。我怎么能得到它。我正在尝试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;
}
答案 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的大小,它当前是输入的长度。这可能是您想要的,也可能不是,我建议您查看信号窗口。