c# - 声音分析仪使用 naudio 进行 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?
问题描述
我需要创建一个声音分析器来隔离某些歌曲频率。目前,我对低音(60-250Hz)感兴趣。
我为每个 1024 块读取信号(IEEE 浮点数):进行 FFT,然后提取与每个频率对应的值。
我不明白的是:我知道 FFT 需要 2 的幂才能工作。我见过使用 512 块的代码,使用 2048、4096 等的代码。
我选择了 1024(这给了我大约 47 个数据点/秒)。我是否正确假设使用 2048,例如将工作相同,给我 23.5 个数据点/秒,唯一的区别是准确性(当然还有计算速度)?
另外,我需要在 1024 个边界块上阅读吗?例如,假设我只是跳过了前 200 个浮点数,结果最终会非常相似吗?(我的测试似乎说是)
后期编辑:更新标题以使其更易于理解
解决方案
1024/48kHz 仅比 60 Hz 信号的一个周期长。太短而无法确定信号是否是完全周期性的(重复)。人类通常需要大约 6 个重复周期才能听到具有确定音高的声音。
60 赫兹是 B1。您可能需要 2 Hz 分辨率才能将 B1 与 C1 分开,并且在两个最近的 FFT 频率区间之间有明显的间隙。为此,仅使用 FFT 幅度结果将需要 48kHz/2Hz 或半秒或更长时间的 FFT。对于 48ksps 样本,最接近 2 的幂是 32768。
对于音乐音高频率,有比使用裸 FFT 或 FFT 频率峰值幅度更好的音高检测器/估计器,因为它们解决了录制的器乐或声乐中常见的缺失或弱基本问题。这些音高估计器可以使用比半秒更短的时间间隔窗口,但需要比裸 FFT 幅度峰值拾取更多的计算。
推荐阅读
- powershell - 从大量组列表中删除用户的更快方法?
- reactjs - 在使用 useState 填充之前清除数组
- c++ - Array and simple queries using vector
- c - What is the need of empty braces '{ }' at the end of array of structs?
- javascript - IE11,引导程序 4,内联表单问题:在输入组内折叠输入
- javascript - 我应该在重定向之前对 GTM 使用 eventCallback 吗?
- python - PyMongo 中的 E11000 重复键错误收集
- ios - 保存数组
在 CoreData 作为可转换属性 - r - \xdef\@fontenc@load@list{\@fontenc@load@list Rmarkdown 中未定义的控制序列
- php - 如何在while循环中的另一个语句中选择语句