【发布时间】:2013-10-17 01:31:52
【问题描述】:
我想在 Java 中实现快速傅立叶变换来识别和弦,但我真的不明白。它说样本数应该是2的幂,那么对于一首没有样本数等于2的幂的歌曲我们应该怎么办?我也想了解 STFT。
【问题讨论】:
标签: java signal-processing fft
我想在 Java 中实现快速傅立叶变换来识别和弦,但我真的不明白。它说样本数应该是2的幂,那么对于一首没有样本数等于2的幂的歌曲我们应该怎么办?我也想了解 STFT。
【问题讨论】:
标签: java signal-processing fft
您通常会在整个文件的滑动窗口上生成STFT。选择窗口的大小以给出一个合理的时间段,在该时间段内声音的特性不会发生很大变化。通常一个窗口可能在 10 毫秒左右,因此如果您的采样率为 44.1kHz,那么您可以使用 N = 512 的窗口大小,以便获得所需的持续时间和大小为 2 的幂。然后,您通过文件获取大小为 N 个样本的连续块,并为每个 N 点块生成 FFT。 (注意:在大多数情况下,您实际上需要 FFT 输出的 幅度,以便获得功率谱的估计值。)为了提高分辨率,块可以重叠,例如50%,但这当然会增加处理负载。最终结果是一系列短期频谱,因此实际上您有一个 3D 矩阵(幅度 v 频率 v 时间),它描述了频域中声音的内容。
【讨论】:
通常你所做的只是用零填充数据以使其成为 2 的幂。
【讨论】: