在 Java 中使用 FFT 算法进行音频频谱分析

Posted

技术标签:

【中文标题】在 Java 中使用 FFT 算法进行音频频谱分析【英文标题】:Audio spectrum analysis using FFT algorithm in Java 【发布时间】:2011-07-08 16:13:04 【问题描述】:

我想用 Java (ME) 分析音频文件的频谱。我想像一些媒体播放器一样绘制频谱。但是有些地方我不明白:

    FFT 算法的输入,我必须从音频文件中获取。我现在不知道它叫什么,它是什么,更重要的是,我不知道如何得到它。 输出:如果输入是一个数组(范围?)我得到另一个数组,它的范围是:0-1,对(或不是)?那我和它有什么关系?

【问题讨论】:

【参考方案1】:

除了 FFT 之外,您还需要一些额外的步骤。这已经在之前关于 SO 的类似问题中多次介绍过,您可以通过搜索“dsp”、“fft”、“spectrum”、“spectrogram”等找到其他材料,但基本上您需要执行以下操作:

将window function 应用于输入数据(例如Hann(ing)) 将 FFT 应用于加窗输入数据(对于复数到复数 FFT,虚输入应全部为零) 计算第一个 N / 2 FFT 输出 bin (re * re + im * im) 的平方幅度 将幅度平方转换为 dB 标度 (10 * log10(squared_magnitude))

【讨论】:

我想问你:计算前 N/2 个 FFT 输出 bin 的大小平方还是平方根? 10 * log10 (re * re + im * im) 还是 10 * log10(sqrt(re * re + im * im)) ?你能向我解释一下原始公式的来源吗?我真的不知道。 A dB 值实际上只是一个 比率,其中 0 dB 表示比率为 1。要具有任何实际意义,必须指定 dB 值 相对于 一些参考值。因此,例如“dB re full scale”将是一个刻度,其中 0 dB = 满刻度并且所有较小的值都是负数(例如,对于 16 位音频,0 dB 到 -96 dB)。当然,您可以上下移动这些数字,它们仍然具有相同的含义。或者,您可以校准您的系统,以便使用 0 dB 具有一些实际的物理意义,例如0 dB SPL、0 dBm 或 0 dBV。 好的 - 很好 - 如果这个或任何其他答案有帮助,那么请考虑投票和/或接受它。 Paul,我认为您在第一条评论中的意思是您可以使用 20 * log10 (sqrt(re * re + im * im))(注意 20)或 10 * log10 (re * re + im * im),这将得到相同的结果。

以上是关于在 Java 中使用 FFT 算法进行音频频谱分析的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎样进行频谱分析

通过分析音频频谱进行节奏检测

关于用FFT分析信号频谱的问题

用MATLAB设计对信号进行频谱分析和滤波处理的程序

利用matlab怎样进行频谱分析

关于用MATLAB设计对信号进行频谱分析和滤波处理的程序