首页 > 解决方案 > 声音分析仪使用 naudio 进行 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?

问题描述

我需要创建一个声音分析器来隔离某些歌曲频率。目前,我对低音(60-250Hz)感兴趣。

我为每个 1024 块读取信号(IEEE 浮点数):进行 FFT,然后提取与每个频率对应的值。

我不明白的是:我知道 FFT 需要 2 的幂才能工作。我见过使用 512 块的代码,使用 2048、4096 等的代码。

我选择了 1024(这给了我大约 47 个数据点/秒)。我是否正确假设使用 2048,例如将工作相同,给我 23.5 个数据点/秒,唯一的区别是准确性(当然还有计算速度)?

另外,我需要在 1024 个边界块上阅读吗?例如,假设我只是跳过了前 200 个浮点数,结果最终会非常相似吗?(我的测试似乎说是)

后期编辑:更新标题以使其更易于理解

标签: c#audiofftnaudioanalyzer

解决方案


1024/48kHz 仅比 60 Hz 信号的一个周期长。太短而无法确定信号是否是完全周期性的(重复)。人类通常需要大约 6 个重复周期才能听到具有确定音高的声音。

60 赫兹是 B1。您可能需要 2 Hz 分辨率才能将 B1 与 C1 分开,并且在两个最近的 FFT 频率区间之间有明显的间隙。为此,仅使用 FFT 幅度结果将需要 48kHz/2Hz 或半秒或更长时间的 FFT。对于 48ksps 样本,最接近 2 的幂是 32768。

对于音乐音高频率,有比使用裸 FFT 或 FFT 频率峰值幅度更好的音高检测器/估计器,因为它们解决了录制的器乐或声乐中常见的缺失或弱基本问题。这些音高估计器可以使用比半秒更短的时间间隔窗口,但需要比裸 FFT 幅度峰值拾取更多的计算。


推荐阅读