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

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

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

【问题讨论】:

    标签: java audio java-me media fft


    【解决方案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),这将得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多