如何将 FFT 应用于录音以获得频率?
How do I apply FFT onto an audio recording to get a frequency?
这应该是针对 android 应用程序的,所以有问题的语言显然是 Java。
我正在尝试录制一些音频并获得主频率。这是为了一个非常特殊的目的,我需要检测的频率是另一个设备发出的纯声音。我已经完成了录音部分,所以我唯一需要做的就是计算它生成的缓冲区的频率。
我知道我应该使用一种叫做 FFT 的东西,所以我把它们放到了我的项目中:http://introcs.cs.princeton.edu/java/97data/FFT.java, and http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我知道有很多关于此的问题,但其中 none 给出了我能理解的答案。其他人的链接已损坏。
谁知道怎么做,并用相对简单的方式解释一下?
傅立叶变换是一种数学技术,可让您在时域和频域之间来回切换时间相关信号。
FFT 是一种用于快速高效地计算离散变换的计算机算法。
您将采集时间信号的样本并对其应用 FFT 以获得样本的振幅与频率。
如果你没有数学背景,这不是一个简单的话题。它假定您对三角函数(正弦和余弦)、函数和微积分有很好的了解。如果没有,将很难阅读和理解您能找到的任何参考资料。
如果您没有该背景,请尽量将库 FFT 函数视为黑盒并使用它返回的内容。
通常,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 大小的块处理输入。
这应该是针对 android 应用程序的,所以有问题的语言显然是 Java。 我正在尝试录制一些音频并获得主频率。这是为了一个非常特殊的目的,我需要检测的频率是另一个设备发出的纯声音。我已经完成了录音部分,所以我唯一需要做的就是计算它生成的缓冲区的频率。
我知道我应该使用一种叫做 FFT 的东西,所以我把它们放到了我的项目中:http://introcs.cs.princeton.edu/java/97data/FFT.java, and http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我知道有很多关于此的问题,但其中 none 给出了我能理解的答案。其他人的链接已损坏。
谁知道怎么做,并用相对简单的方式解释一下?
傅立叶变换是一种数学技术,可让您在时域和频域之间来回切换时间相关信号。
FFT 是一种用于快速高效地计算离散变换的计算机算法。
您将采集时间信号的样本并对其应用 FFT 以获得样本的振幅与频率。
如果你没有数学背景,这不是一个简单的话题。它假定您对三角函数(正弦和余弦)、函数和微积分有很好的了解。如果没有,将很难阅读和理解您能找到的任何参考资料。
如果您没有该背景,请尽量将库 FFT 函数视为黑盒并使用它返回的内容。
通常,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 大小的块处理输入。