系统 SHALL 提供 FFTAnalyzer 工具类,接收 1024 个 PCM 时域样本(number[]),通过 Cooley-Tukey 基 2 快速傅立叶变换算法计算出 512 个频率 bin 的幅值数组。
FFTAnalyzer.analyze(pcmData: number[], sampleRate: number) 且 pcmData 长度为 1024SpectrumData 对象,包含 512 个频率 bin 的归一化幅值(0.0 ~ 1.0 范围)FFTAnalyzer.analyze(pcmData, sampleRate) 且 pcmData 长度为 0SpectrumData 对象FFT 计算前 SHALL 对输入 PCM 数据应用 Hann 窗函数,以减少频谱泄漏。
0.5 * (1 - cos(2π * n / N)),然后再执行 FFT系统 SHALL 将 512 个线性频率 bin 按对数刻度映射并聚合为 32 个可视化频段。
SpectrumData.getBands(bandCount: number)number[],长度等于 bandCount,每个元素为对应频率范围内所有 bin 幅值的平均值,归一化到 0.0 ~ 1.0系统 SHALL 对连续帧的频谱数据进行指数移动平均平滑,避免视觉跳变。
output = newValue * smoothUp + previousOutput * (1 - smoothUp)(上升时),或 output = newValue * smoothDown + previousOutput * (1 - smoothDown)(下降时),其中上升系数约 0.7,下降系数约 0.3,实现快速响应、缓慢衰减的视觉效果SpectrumData SHALL 提供 getEnergy(): number 方法,返回当前帧所有频段幅值的均方根值,归一化到 0.0 ~ 1.0,代表当前音频的整体响度/能量。
getEnergy() SHALL 返回 0.0getEnergy() SHALL 返回一个介于 0.0 ~ 1.0 之间的值,反映当前帧的整体响度