在 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 算法进行音频频谱分析的主要内容,如果未能解决你的问题,请参考以下文章