我已经为 1024 个样本的基数 FFT 变换编写了 C 代码。但我的主要目标是获取音频文件,将它们转换为原始 pcm 样本值,然后对整个音频文件进行 FFT。我的目标是制作带有条形的频谱图,显示音频文件中存在的频率量。
我遇到的问题是我从音频文件中获得任意数量的样本,具体取决于持续时间。(即 10k、50k、100k)。如何使用我的 1024 样本 FFT 函数来转换所有样本?我不知道该文件将有多少样本。这是一个完全错误的方法吗?
我已经为 1024 个样本的基数 FFT 变换编写了 C 代码。但我的主要目标是获取音频文件,将它们转换为原始 pcm 样本值,然后对整个音频文件进行 FFT。我的目标是制作带有条形的频谱图,显示音频文件中存在的频率量。
我遇到的问题是我从音频文件中获得任意数量的样本,具体取决于持续时间。(即 10k、50k、100k)。如何使用我的 1024 样本 FFT 函数来转换所有样本?我不知道该文件将有多少样本。这是一个完全错误的方法吗?
这是一个完全错误的方法吗?
是的。
然后对整个音频文件进行 FFT。
真的没有理由这样做。您最终获得的频率分辨率远远超出您的需要。对于 3 分钟长的文件,您的频率分辨率约为 0.005 Hz。
如何使用我的 1024 样本 FFT 函数来转换所有样本?
如果您只对整个文件的平均功率感兴趣,您可以简单地使用“Welch 方法”:将文件分成重叠为 50% 的帧,应用窗口,应用 FFT,计算幅度平方和平均值所有帧,
1024 差一点。我会推荐 8192 或 16384 以获得足够好的低音频率分辨率。如果您希望它在对数频率范围内,您可以集成八度音阶或第三个八度音阶,这将是“标准”的方式。
我已经为 1024 个样本的基数 FFT 变换编写了 C 代码
为什么?有很多优秀的库针对这项工作进行了高度优化。
Hilmar 在这里提出了一个非常好的答案,在我看来,这是解决您的问题的一个非常好的方法。
然而,如果您已经有一个 FFT 算法,那么将它与任意数量的样本一起使用应该是微不足道的。您所要做的就是确保数字是 2 的幂(如果我没记错的话,尽管存在允许将 FFT 与不是 2 的幂的数组一起使用的算法)。如果您的信号不包含多个为 2 的幂的样本,则您始终可以使用零填充来做到这一点。
我绝对不建议这是最好的方法,我坚信 Hilmar 的方法(至少)在这里更合适。尽管如此,零填充和使用“通用” FFT 算法也是一种选择(在我看来,在很多方面都不是最优的)。