Java - 使用FFT查找音频信号的频率和幅度

时间:2013-05-21 08:18:12

标签: java fft

看完了没有。这里的帖子我已经在录制的音频(.wav)文件上应用了FFT算法,将其从时域转换到频域。

结果我有一个包含一些值的数组

magnitude[i] = sqrt(re*re+im*im);

现在标题说我必须使用这个幅度数组找到信号的频率和幅度(复杂的声音,即声音),但我不知道如何使用这个数组进行进一步处理.FFT的大小是1024采样率为48000Hz。  请帮我进一步处理。

1 个答案:

答案 0 :(得分:0)

如果您只是寻找单个最大(正弦)分量,则扫描幅度数组,直到找到最大值,然后将该值的索引转换为相应的频率,即

mag_max = magnitude[0];
i_max = 0;
for (i = 1; i < N; ++i)
{
    if (magnitude[i] > mag_max)
    {
        mag_max = magnitude[i];
        i_max = i;
    }
}

您现在拥有mag_max中的峰值及其i_max中的索引值。你可以得到这样的频率:

f_max = i_max * Fs / N;

其中Fs是采样率(当然N是FFT大小。)

当然,如果您正在寻找类似复杂声音(例如声音或乐器)的音高之类的东西,那么事情会变得更复杂。 lot 。您可能希望查看谐波产品频谱算法和pitch detection algorithms