执行流式音频问题的 DFT。有限制吗?

信息处理 fft 声音的 采样 自由度 爪哇
2022-02-25 19:28:34

我正在尝试编写软件来执行来自麦克风的实时数据到计算机声卡的离散傅立叶变换。我正在使用带有 javax.sound API 的 Java。

我每次捕获 250 毫秒的数据。这意味着,由于采样率为 44100,我将缓冲 11025 个 16 位短路,并在每次迭代中对此数据执行 DFT。

我的 DFT 代码将这个数据窗口与从 19 Hz 到 198 Hz 的正弦波和余弦波相关联,步长为 1,所以这个窗口是 250 ms 的数据,这意味着它实际上将传入的音频与 76 Hz 以上的频率相关联以 4 为步长至 792Hz。

如果我现在希望每次使用 125 毫秒而不是 250 毫秒的较小数据窗口来加快速度。如果我像以前一样将此数据与频率递增 1 的正弦波和余弦波相关联,这意味着它实际上将传入的音频与以 8Hz 为步长的波相关联。这对我的问题不利,因为我希望能够在小于 8Hz 的信号中寻找频率差异。

我的问题是,这是正常的权衡,速度与频率分辨率,还是有办法解决这个问题?

提前谢谢了。我是音频处理的新手,如果我错过了一些常识,请原谅我:)

3个回答

您的 FFT 的窗口大小限制了您的分辨率,并且无法解决这个问题(即,您无法通过零填充或零填充来解决它)。考虑它的最简单方法是:较低的频率具有较长的周期,因此需要较长的窗口(更多样本)来区分。

我相信即使您使用替代方法(例如一系列非常陡峭的带通比 FFT 为您的窗口大小所允许的频率分辨率更窄),也无法提高您的分辨率。是的,你会从你的带通中得到一些测量,但如果窗口大小不够长,那么在区分非常接近的较低频率时数据将非常不准确,因为没有足够的数据来解开它们。

考虑一个包含 1 个样本或 2 个样本的窗口,在这些情况下,很容易看出,如果不通过收集更多独立样本使它们变得更大,就无法从小窗口恢复分辨率。

我的问题是,这是正常的权衡,速度与频率分辨率,还是有办法解决这个问题?

嗯,是的,这是正常的权衡。

但是:如果速度是一个问题,你到底为什么要使用你自己的基于相关性的 DFT?那里有很多FFT 实现,使用 FFTw 完成的 11025 点 FFT 在我的 PC 上需要几微秒,因此您可以毫无问题地为所有其他样本运行 FFT。

因此:如果您关心速度,请使用有经验的人(或数十年的开发时间、充满理论的大学工作人员和许多助理研究人员)为您编写的库。基于“与正弦的相关性”的 DFT 肯定会更慢,尤其是因为我认为您甚至没有根据您对问题的措辞将其实现为与 DFT 矩阵的简单乘法。

请注意,如果您并不真正需要 DFT 提供给您的所有等距频率,但只需要测试一些频率(例如,参数伪谱估计器,如 MUSIC)或知道,可能会有更具体的算法执行得更好究竟有多少离散音调(密切相关的 ESPRIT)。

样本长度和频率分辨率之间的权衡取决于信噪比(或频谱稀疏度)以及您需要什么样的分辨率。如果噪声水平足够低,则可以将充分隔离的窄频谱内插到 DFT 结果频率区间间隔的某个部分内(例如,可能足以从 8 Hz DFT 结果间隔获得 1 或 2 Hz 分辨率)。如果干扰水平足够高,则可能需要 2 个以上的 DFT 结果箱间距才能干净地分离光谱峰。

对于频谱非常稀疏的信号,除了仅使用 DFT 幅度峰值之外,还有其他参数估计器。