声音分析仪使用 naudio 处理 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?

Posted

技术标签:

【中文标题】声音分析仪使用 naudio 处理 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?【英文标题】:sound analyzer using naudio for 48000 samples/sec sound. Can I use a cycle-sample-size of 1024? 【发布时间】:2020-09-06 11:34:37 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

一般规则是 Nyquist,即在进行 FFT 时,您必须对最大频率进行至少两倍的采样。 人耳最多只能听到20KHz的声音,最多只能听到2KHz的声音。请参阅:nhc.com.au/blog/…. 对。您可以有 1 秒或 1 分钟的样本。但它确实关心每秒的样本数。如果每秒使用错误的样本,则会得到错误的输出频率。 取决于算法和系数。 2 的幂可减少获得答案所需的计算次数。它不需要是 2 的幂。参见 Wiki 文章:en.wikipedia.org/wiki/Fast_Fourier_transform 【参考方案1】:

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

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

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

【讨论】:

谢谢!不幸的是,我不完全理解答案。长话短说,例如,我需要知道 BASS 的幅度何时增加和减少。为了检测到这一点,我需要每秒执行很多次,否则,我正在做的事情是无用的。长话短说,我的代码似乎可以正常工作——我已经在 30 首歌曲上对其进行了测试,结果足够准确。在 32768 上进行 FFT 对我来说毫无用处,因为我的数据点太少了。除非 - 我可以以 1024 步长获得 32768 分。所以基本上,使用 1024 步长,然后在 ... 上进行 FFT ... 以下 32768 点。如果这是一个可行的选择,那肯定对我有用。

以上是关于声音分析仪使用 naudio 处理 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 naudio 动态播放音频文件

Naudio:如何在不停止所有其他声音的情况下正确删除 AsioOut 播放的几种声音中的一种?

将 NAudio 的 float[] 转换为 byte[]

使用 NAudio 在特定频道上播放声音

使用 NAudio 改变左右声道的声音平衡

NAudio 使用 C# 播放 x 毫秒的正弦波