在此文中,我们将首先简要讨论傅里叶变换和FFT。然后,我们将向您展示在Arduino上实现FFT的一种方法。

https://embed.notionlytics.com/wt/ZXlKd1lXZGxTV1FpT2lJeE5HWTBNMkkzT0RobU9ETTBaVEl6WWpjd04yTXdNVGM1TWpZeE1USmpaaUlzSW5kdmNtdHpjR0ZqWlZSeVlXTnJaWEpKWkNJNklsZHNTR2hsVEZSUFdXeHpaVmRhUW1ZNU1YQmxJbjA9

快速傅立叶变换(aka FFT)是一种计算离散傅立叶变换(DFT)的算法。 我们将不涉及傅立叶变换的相对复杂的数学,但是这里的一个重要原理是,通过将具有不同频率和幅度的正弦信号相加,可以非常准确地重建任何信号(甚至是非周期性的信号)。 我们加在一起的正弦信号越多,我们重构的信号看起来就越像原始信号。 从理论上讲,使用无限数量的正弦信号,我们得到的信号与原始信号相同。

下面是一个不错的GIF,它显示了六个加在一起的正弦信号如何类似于方波信号。

FFT

FFT算法使用此原理,实际上使您能够查看任何模拟信号中存在哪些频率,以及哪些频率是最主要的。 这在大量应用程序中非常有帮助。 在上面的GIF中,像蓝色的只有尖峰(f ^)的图形通常是在运行FFT之后得到的:

您通常在此图中得到的是一个或多个峰值。高尖峰意味着该特定频率在信号中占主导地位。

如果将FFT应用于无噪声的正弦信号,则只会得到一个峰值。这是合乎逻辑的,因为您只需要一个正弦信号即可重新创建一个正弦信号。

但是,如果将FFT应用于方波信号(如GIF中所示),您将得到一个指数递减的图形,其中存在许多频率,它们之间具有均匀的间隔。 最低频率具有最大振幅(这是方波信号的主频率),而最高频率具有最低振幅。

取样频率

Nyquist-Shannon采样定理告诉我们,要对信号进行采样,采样频率必须至少是我们要采样的信号频率的两倍。 换句话说,FFT将仅能够检测高达采样频率一半的频率。

但是,在普通的Arduino上,采样频率非常有限。 ADC操作(使用analogRead())大约需要100μs,而其他操作由于8或16 MHz时钟频率而相对较慢。

采样

FFT算法适用于有限数量的样本。 该数字必须为$2^n$,其中$n$是整数(结果为32、64、128等)。 此数字越大,算法将越慢。 但是,对于许多样本,您将获得更大的分辨率。

柱状

术语柱状与FFT的结果有关,其中结果数组中的每个元素都是柱状。 可以说这就是FFT的“分辨率”。 每个柱状图都代表一个频率间隔,就像直方图一样。 您获得的柱状数是整个频率范围(从零到一半)的采样率的一半。

Arduino

当然,有几种方法可以在Arduino上实现FFT。您可以从头开始实施它,也可以使用预制的库。在此,我们将使用后者。