最小 FFT 采样时间 - 吉他频率和谐波

信息处理 fft 傅里叶变换
2022-02-22 18:45:05

我正在做一个项目,我试图用微控制器(在拨弦后尽快)确定电吉他上演奏的确切音符,并使用这些信息(即音符的数字值)来操纵音频通过DAC输出。

我正在使用 STM32F4,使用 12 位 ADC 对 DC 偏移和有源过滤吉他信号进行采样(采样率几乎与定时器触发的 ADC DMA 所需的一样快)以及我可以实现的最高 F32 FFT 点数可用 RAM 为 4096(即 8192 个样本)。

我需要测量的吉他频率在 82Hz 和大约 831Hz 之间,分辨率在 2Hz 的低端和大约 22Hz 的顶部。

  • 我是否正确地说实现这一目标的最小采样时间约为 0.5 秒,由最小频率和分辨率要求驱动?
  • 在更高的频率下,我可以采样更短的时间(更高的采样率)?
  • 还是(希望)有什么我想念的东西?
  • 我可以用更少的 FFT 点(因此样本)测量较低的频率,从而节省时间吗?
2个回答

你的最高频率是 831 赫兹;因为忽略低于 82 Hz 的欠采样只会为您节省 10% 的采样率,所以让我们忽略这种可能性。

所以,奈奎斯特说你的采样率至少应该是 1.662 kHz;现在,正如@fibonatic 所提到的,您的问题是频率。任何 DFT 的分辨率总是

Δf=fNyquistNDFTNDFT=fNyquistΔf

捕获该 DFT 所需的样本所花费的时间是

T=NDFTfsample=NDFT2fNyquist=fNyquistΔf2fNyquist=12Δf

因此,无论您以何种速率采样,对于全分辨率 DFT 所需的时间段,oyu 无能为力。

可以用零填充较短的观察值,这将提高您的分辨率。关键是您用分辨率换取质量,而差异将显着增长。

DFT 在这里根本不是正确的选择。如果您需要较低频率的 2Hz 分辨率,则无需任何需要即可在较高频率下获得相同的分辨率。

老实说,考虑一下:您计划使用一个 DFT,它可以为您提供 4096 个频率箱,如果有很多,您可能需要区分 100 个音调。

我很确定你买的便宜的吉他调音器不是这样工作的。我假设他们只是使用专用硬件(而不是您需要编写的固件)来实现一个简单的滤波器组 - 甚至可能是一个 IIR 滤波器组,如果我有一个猜测,在非常低的样本位宽度和简单的双二阶。或者,更简单的是,他们只有几个模拟滤波器带通,只是对结果样本流进行欠采样,并对他们以这种方式预先选择的所有八度音阶执行相同的数字滤波器。

如果我必须这样做,我实际上会在你的微控制器上做同样的事情(顺便说一下,8192-FFT 对于 Cortex-M4 来说听起来很庞大,但你比我更了解你的设备),但架构不同。做一个粗略的计算:如果您保持较低的采样率,您需要多少个不同长度的 FIR 滤波器才能覆盖数据?将您的滤波器组实现为 PFB 滤波器组有帮助吗?是否做出分层决定(例如,首先是一个“八度选择器”,然后根据结果,扔掉一半,38,78,... 的样本,然后进行音调检测滤波器组。

使用边沿触发中断和处理器时钟计数器来标记过零。也许在过零之间进行 ADC 采样,并仅使用过零滞后候选(对于某个合理数量的 N 的每第 N 个过零之间的时间)来寻找自相关最大值或 AMDF 滞后最小值。这可能会在短短 2 或 3 个音高周期内为您提供合理的音高候选,远远快于等待足够样本以实现长 FFT 窗口的半秒或更多延迟。