让我们来看看。我不知道 Java 类或它对信号处理的支持类型,但我会给你一些指导。语言中实现的具体细节,你必须弄清楚。
要对音频文件进行任何类型的处理,您需要“原始”数据,这意味着音频文件具有未压缩的音频样本。例如,WAV 格式,它通常具有 16 位有符号 2 补码的样本。
如果您要使用计算机并进行离线处理,则将该值转换为双精度值可能是一个好主意(在当今的大多数处理器中,这意味着 64 位浮点数)。
因此,您将有来自文件的连续双数字流。然后,您需要定义一种处理连续数据的方法。一种标准的、非常广泛使用的方法是使用循环缓冲区(即使它处于脱机状态,我假设您希望您的代码高效,并且将整个文件作为数组加载到内存中并不是最好的解决方案)。无论是那个或只是一个普通的缓冲区,都是你的选择。缓冲区长度应该是 2 的幂(对 Cooley-Tukey radix-2 算法的效率有影响)。
现在您需要进行实际的 FFT。这仅仅是缓冲区(数学上是一个向量)乘以 FFT 矩阵。这个操作实际上是如何在 Java 中执行的,不知道。在 C 语言中,它只是将指向数组的指针和长度传递给 FFT 例程,该例程要么返回指向动态分配内存的指针,要么将结果留在传递给它的数组中。
最后,您会得到一个由 M 个复数组成的数组(假设带有信号的数组/缓冲区/向量的长度为 M)。然后你可以随心所欲地使用它。
例如,您可以取每个复数的大小并找到最大值,以检测基频可能在哪里(虽然非常近似)。
附加功能:更先进的处理技术将包括预先加窗以避免泄漏,进行零填充以在加窗频谱上获得更高的分辨率等。
希望能帮助到你。