我想在Java中实现用于和弦识别的快速傅立叶变换,但我并没有真正理解它。它说样本的数量应该是2的幂,那么对于没有等于2的幂的样本数量的歌曲,我们该怎么做?我也想知道STFT。
答案 0 :(得分:3)
您通常会在整个文件的滑动窗口上生成STFT。选择窗口的大小以给出合理的时间段,在该时间段内声音的特性不会发生很大变化。通常窗口可能大约为10毫秒,因此如果您的采样率为44.1kHz,那么您可以使用窗口大小N = 512,这样您就可以获得所需的持续时间和2的大小功率。然后,您通过文件获取大小为N个样本的连续块,并为每个N点块生成FFT。 (注意:在大多数情况下,您实际上需要FFT输出的幅度,以便估算功率谱。)为了提高分辨率,块可以重叠,例如,减少50%,但这会增加处理负荷。最终结果是一系列短期光谱,因此实际上你有一个3D矩阵(幅度v频率v时间),它描述了频域内声音的内容。
答案 1 :(得分:2)
通常你所做的只是用零填充数据,使其成为2的幂。