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 查找音频信号的频率和幅度的主要内容,如果未能解决你的问题,请参考以下文章