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

Posted

技术标签:

【中文标题】Java - 使用 FFT 查找音频信号的频率和幅度【英文标题】:Java - Finding frequency and amplitude of audio signal using FFT 【发布时间】:2013-05-21 08:18:12 【问题描述】:

读完一个没有。这里的帖子本身我已经对录制的音频(.wav)文件应用了 FFT 算法,以将其从时域转换为频域。

结果我得到了一个包含一些值的数组

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

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

【问题讨论】:

【参考方案1】:

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

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 大小)。

当然,如果您正在寻找类似于复杂声音(例如声音或乐器)的音高,那么事情会变得很多更复杂。您可能想看一下谐波乘积谱算法和pitch detection algorithms。

【讨论】:

感谢 Paul 的快速帮助,是的,正如您所说,我正在尝试查找频率。和复杂声音的幅度。那么我应该如何使用这个幅度数组对其进行处理? 如果你想做pitch检测,那么你真的需要回到绘图板上。基于 FFT 的方法是可能的,但它并不简单(参见“谐波乘积谱”),并且有更好的方法。以Wikipedia page on pitch detection 为起点。 好的,保罗,我会浏览那个 wiki 页面。但是你有任何此类算法的 java 实现或可以为我服务的 java 库吗? 不 - 我不使用 Java。此外,由于音高检测非常复杂,因此您不太可能在不了解基本概念的情况下插入第三方库并使用它。 我已将此标记为正确答案,因为 Paul 已正确地将我指向音高检测算法。非常感谢保罗。我现在正在努力。

以上是关于Java - 使用 FFT 查找音频信号的频率和幅度的主要内容,如果未能解决你的问题,请参考以下文章

FFT_ad采样速率

解决了:FFT频率分档和PIC32

从歌曲中获取当前音频频率 - Java(也许使用 FFT?)

如何实时获取特定频率音频信号的幅度android

如何使用示波器FFT功能查找感兴趣的FFT频率点?

MATLAB中的FFT的采样频率和采样点怎样确定