java - 非 log 2 的快速傅里叶变换

标签 java signal-processing fft

我想在Java中实现快速傅里叶变换来进行和弦识别,但我不太明白。它说样本数应该是2的幂,那么对于样本数不等于2的幂的歌曲我们该怎么办呢?我也想了解 STFT。

最佳答案

您通常会生成 STFT在整个文件的滑动窗口上。选择窗口的大小以给出合理的时间段,在该时间段内声音特征不会发生很大变化。通常,窗口可能约为 10 ms,因此,例如,如果您的采样率为 44.1kHz,则您可以使用窗口大小 N = 512,以便获得所需的持续时间和 2 的幂大小。然后,您通过文件获取大小为 N 个样本的连续 block ,并为每个 N 点 block 生成 FFT。 (注意:在大多数情况下,您实际上需要 FFT 输出的幅度,以便获得功率谱的估计。)为了提高分辨率, block 可以重叠,例如50%,但这当然会增加处理负载。最终结果是一系列短期频谱,因此实际上您有一个 3D 矩阵(幅度 v 频率 v 时间),它描述了频域中的声音内容。

关于java - 非 log 2 的快速傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276295/

相关文章:

java - 使用 JSF 2.0 获取命名容器内组件 clientId 的完整前缀

java - 程序在 ObjectInputStream 阻塞

c++ - 为什么减少窗口长度会导致频谱图中出现空行?

c++ - 如何在代码中实例化 Vst3 插件?对于 vst3 主机应用程序

matlab - 更改快速傅里叶逆变换 (ifft) 以使用任意波形而不是正弦波来创建新信号

ios - iOS Accelerate框架中vDSP_ctoz的数据应该是什么格式

java - Internet Explorer : org. openqa.selenium.NoSuchElementException 的 Selenium 问题:无法使用 xpath 找到元素

java - 在 Java 中使用策略模式的电子邮件程序

speech-recognition - "Voice trigger"检测

c++ - 保存在 16 位的双变量样本中