音频 FFT 函数的结果几乎不可能检查 low/mid 个频率
Result from audio FFT function makes it near impossible to inspect low/mid frequencies
我正在尝试在 Linux 上构建一个图形音频频谱分析器。我 运行 PCM samples/frames 的每个缓冲区上的 FFT 函数被馈送到音频硬件,因此我可以看到哪些频率在音频输出中最普遍。一切正常,除了 FFT 函数的结果仅将几个数组元素(bin)分配给低频和中频。我知道音频是对数的,而 FFT 使用线性数据。但是由于 low/mid 频率的分配如此之少,我不确定如何才能清楚地将事物分开以图形方式显示频率分布。我尝试过 window 大小为 256 到 1024 字节,虽然较大的 windows 在 low/mid 范围内提供了更多的分辨率,但它仍然没有那么多。我还对每个数据块应用 Hann 函数以平滑 window 边界。
例如,我使用以 120、440、1000、5000、15000 和 20000 Hz 播放音调的单声道音频文件进行测试。当以对数方式解释它们时,它们应该在整个频谱中均匀分布。但是,由于 FFTW 是线性工作的,对于 256 个元素或 1024 个元素的数组,return 数组中只有大约 10% 实际上包含高达大约 5 kHz 的值。 FFTW 阵列的其余部分包含高于 10-15 kHz 的频率。
这是我想要的大致结果:
但这就是我实际得到的:
同样,我知道这可能按设计工作,但我仍然需要一种方法来在底部和中部获得更高的分辨率,以便更好地分离频率。
我该怎么做才能完成这项工作?
您所看到的确实是 FFT(傅里叶变换)的预期结果。您期望的对数 f-axis 是通过 Constant-Q transform.
实现的
现在,Constant-Q 转换的实现是 non-trivial。傅里叶变换之所以流行,正是因为有一个快速的实现(FFT)。在实践中,constant-Q 变换通常通过使用 FFT 并组合多个 high-frequency bin 来实现。这会丢弃较高分箱中的分辨率;它不会在较低的垃圾箱中为您提供更多分辨率。
要在 FFT 的较低区间获得更高的频率分辨率,只需使用更长的 window。但是,如果您 也 想保持时间分辨率,则必须使用小于 window 大小的跃点大小。换句话说,你的 FFT windows 会重叠。
我正在尝试在 Linux 上构建一个图形音频频谱分析器。我 运行 PCM samples/frames 的每个缓冲区上的 FFT 函数被馈送到音频硬件,因此我可以看到哪些频率在音频输出中最普遍。一切正常,除了 FFT 函数的结果仅将几个数组元素(bin)分配给低频和中频。我知道音频是对数的,而 FFT 使用线性数据。但是由于 low/mid 频率的分配如此之少,我不确定如何才能清楚地将事物分开以图形方式显示频率分布。我尝试过 window 大小为 256 到 1024 字节,虽然较大的 windows 在 low/mid 范围内提供了更多的分辨率,但它仍然没有那么多。我还对每个数据块应用 Hann 函数以平滑 window 边界。
例如,我使用以 120、440、1000、5000、15000 和 20000 Hz 播放音调的单声道音频文件进行测试。当以对数方式解释它们时,它们应该在整个频谱中均匀分布。但是,由于 FFTW 是线性工作的,对于 256 个元素或 1024 个元素的数组,return 数组中只有大约 10% 实际上包含高达大约 5 kHz 的值。 FFTW 阵列的其余部分包含高于 10-15 kHz 的频率。
这是我想要的大致结果:
但这就是我实际得到的:
同样,我知道这可能按设计工作,但我仍然需要一种方法来在底部和中部获得更高的分辨率,以便更好地分离频率。
我该怎么做才能完成这项工作?
您所看到的确实是 FFT(傅里叶变换)的预期结果。您期望的对数 f-axis 是通过 Constant-Q transform.
实现的现在,Constant-Q 转换的实现是 non-trivial。傅里叶变换之所以流行,正是因为有一个快速的实现(FFT)。在实践中,constant-Q 变换通常通过使用 FFT 并组合多个 high-frequency bin 来实现。这会丢弃较高分箱中的分辨率;它不会在较低的垃圾箱中为您提供更多分辨率。
要在 FFT 的较低区间获得更高的频率分辨率,只需使用更长的 window。但是,如果您 也 想保持时间分辨率,则必须使用小于 window 大小的跃点大小。换句话说,你的 FFT windows 会重叠。