【发布时间】:2012-05-14 12:11:59
【问题描述】:
我需要对一个简单的 wav 文件进行频谱分析。 我已经做过的事情:
将文件读入字节数组:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = audioStream.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
fileByteArray = baos.toByteArray();
然后我将其转换为实际值(双精度值)。 我已经将样本值存储在 double[] 数组中。
如何对这些样本进行 FFT + 估计基频?
使用JTranforms 库我尝试过这样的事情:
DoubleFFT_1D fft = new DoubleFFT_1D(reader.getSpectrum().getYvalues().length);
double[] x = reader.getSpectrum().getYvalues();
double[] frequencyArray = new double[x.lenght/2];
double[] amplitudeArray = new double[x.lenght/2];
fft.realForward(x);
int i=0;
for (int j = 0; j < x.length-2; j += 2) {
i++;
this.frequencyArray[i] = i;
this.amplitudeArray[i] = Math.sqrt(Math.pow(doub[j],2) + Math.pow(doub[j + 1],2));
}
对吗?
感谢所有建议;)
【问题讨论】:
-
一个问题是您似乎没有在 FFT 之前应用合适的窗口函数。
-
自相关函数是获取基频的另一种方法。
标签: java signal-processing fft analysis spectrum