这应该是一个Android应用程序,所以有问题的语言显然是Java。 我正在尝试录制一些音频并获得主导频率。这是出于非常特定的目的,我需要检测的频率是由另一个设备产生的纯音。我完成了录制部分,所以我唯一需要做的就是从它生成的缓冲区计算频率。
我知道我应该使用一种名为FFT的东西,所以我把它们放到我的项目中:http://introcs.cs.princeton.edu/java/97data/FFT.java和http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我知道有很多问题,但没有一个给出我能理解的答案。其他人打破了链接。
任何人都知道如何做到这一点,并以一种相对简单的方式解释?
答案 0 :(得分:1)
傅立叶变换是一种数学技术,可让您在时域和频域之间来回传递与时间相关的信号。
FFT是一种用于快速有效地计算离散变换的计算机算法。
您将采集时间信号样本并对其应用FFT以获得样本的幅度与频率的关系。
如果你没有数学背景,这不是一个简单的话题。它假定了三角学(正弦和余弦),函数和微积分的良好知识。如果你没有这个,那么阅读和理解你能找到的任何参考资料都会很困难。
如果您没有该背景,请尽力将库FFT函数视为黑盒并使用它所提供的内容。
答案 1 :(得分:1)
通常,DFT(包括FFT)实现将采用N个时域采样(您的记录)并在频域中产生N / 2个复数值。复数值的角度表示相位,其绝对值表示幅度。通常,输出值将从最低频率到最高频率进行排序。
某些实现可能会输出N个复数值,但除非您的输入包含复杂值,否则额外值是多余的。它不应该在你的情况下。这就是为什么许多实现输入实数值并输出N / 2复数值的原因,因为这是FFT的最常见用途。
所以,你需要计算输出的绝对值,因为振幅是你感兴趣的。复数的绝对值是它的实数的平方和的平方和的平方根。这是一个复杂的组成部分。
每个值的确切频率取决于输入样本的数量和样本之间的间隔。位置i的值的频率(假设i从0变为N / 2 - 1)将是i *(采样频率)/ N.
这假设你的N是偶数,而不是试图解释N为奇数的情况我会建议你为了简单起见保持N.对于FFT的情况,N总是2的幂,因此无论如何N总是均匀。
如果您在最短时间T内寻找音调,那么我还建议以T / 2大小的块处理输入。