You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用FFT从音频采样中提取频率与幅值对?

音频频率/幅值提取问题的解决思路

核心问题分析

你遇到的多峰值问题,核心来自三个关键点:

  1. 无窗口函数导致频谱泄漏:直接用原始采样做FFT(默认矩形窗)会产生严重的旁瓣,这些旁瓣会被误判为额外峰值;频率越低(相对于FFT分辨率),泄漏范围越广,旁瓣数量越多。
  2. FFT点数过少,频率分辨率不足:32点FFT的分辨率为 8000/32 = 250Hz,即使是500Hz这种刚好对齐bin的频率,也会因采样误差和矩形窗泄漏扩散到相邻bin,造成多峰值假象。
  3. 幅值计算逻辑可能存在偏差:FFT输出为复数,若未正确处理实信号的对称性、未做幅值缩放,也会导致结果失真。

具体修正步骤

  • 添加窗口函数抑制泄漏
    对FFT前的采样数据施加汉宁窗(Hann Window),大幅降低旁瓣幅度,让真实峰值更突出。代码示例:

    int sampleCount = samples.length;
    double[] hannWindow = new double[sampleCount];
    for (int i = 0; i < sampleCount; i++) {
        hannWindow[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (sampleCount - 1)));
        samples[i] *= hannWindow[i];
    }
    
  • 提升FFT点数,提高分辨率
    将每次读取的采样数提升至256或512(对应512或1024字节缓冲,适配16位采样)。以512点FFT为例,分辨率为 8000/512 ≈15.625Hz,能精准定位500Hz的峰值,减少泄漏干扰。

  • 正确计算FFT幅值
    使用JTransforms的DoubleFFT_1D处理实信号时,需按以下逻辑计算幅值:

    1. 对复数结果取模:Math.sqrt(re*re + im*im)
    2. 除DC分量(索引0)和奈奎斯特频率(索引N/2)外,其余bin的幅值需乘以2(实信号FFT能量对称分布在正负频率)
    3. 除以窗口的能量总和(汉宁窗能量约为0.375*N),做幅值归一化,消除窗口带来的增益影响。

    代码示例(假设N为FFT点数,fftResult为JTransforms输出的交替存储实部虚部的数组):

    double[] magnitudes = new double[N/2 + 1];
    // 处理DC分量
    magnitudes[0] = Math.abs(fftResult[0]);
    // 处理奈奎斯特频率(仅当N为偶数时存在)
    if (N % 2 == 0) {
        magnitudes[N/2] = Math.abs(fftResult[1]);
    }
    // 处理中间频率点
    for (int i = 1; i < N/2; i++) {
        double re = fftResult[2*i];
        double im = fftResult[2*i + 1];
        magnitudes[i] = 2 * Math.sqrt(re*re + im*im);
    }
    // 窗口能量归一化
    double windowEnergy = 0.0;
    for (double w : hannWindow) windowEnergy += w*w;
    for (int i = 0; i < magnitudes.length; i++) {
        magnitudes[i] /= windowEnergy;
    }
    
  • 修正频率映射逻辑
    每个bin对应的频率计算公式为 f = i * Fs / N,其中i为bin索引(0到N/2),Fs=8000为采样率,N为FFT点数。比如512点FFT时,索引32对应的频率为 32*8000/512=500Hz,完全匹配你的测试音。

额外建议

  • 测试时使用纯净正弦波,排除音频本身的谐波干扰。
  • 8kHz采样率的奈奎斯特频率为4kHz,不要处理超过该值的信号,避免混叠失真。
  • 音乐可视化场景无需精细到每个频率点,可将频谱划分为低音、中音、高音等频段,直接对应LED条的亮度即可。

内容的提问来源于stack exchange,提问作者Jezor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:35:41