特定频率范围的 FFT。

信息处理 fft 频率
2022-01-03 07:07:31

我想将信号转换为频域。所需的频率范围为0.1 Hz1 Hz频率分辨率为0.01 Hz

在 的采样率下30 Hz,FFT 给出了高达 15 Hz 的频率分量。提高采样率可以提供更好的频率分辨率。然而,FFT 提供更宽的频率范围。就我而言,我只想0.1 Hz1 HzFFT 放弃15 Hz(额外计算)。

我的问题是,有没有标准的方法可以计算具有特定频率范围和高分辨率的信号的频域?

3个回答

我认为解决您的问题的最佳方法是使用 chirp-DFT。它就像一个特定频率范围的放大镜。它比直接实现 DFT(没有 FFT)更有效,因为 FFT 算法可以与一些适当的预处理和后处理一起使用。您基本上需要用啁啾信号调制您的信号,然后使用 FFT 进行滤波,然后再次啁啾调制您的信号以获得所需的频率响应。有关如何实现 chirp-DFT 的详细信息,请参见此处此处。

还有可能使用频率扭曲(也可以用作放大镜,因为您可以在相同尺寸的 FFT 的感兴趣的频率范围内提高分辨率,但会以较高频率下的较低分辨率为代价)。但是,您不会保存任何 MIPS,因为 FFT 大小并没有减少,而且频率扭曲也远非便宜。

如果您只想计算 FFT 中的某些 bin(从而节省 MIPS),有几种方法可以做到这一点。例如滑动 DFT。本文中的参考资料给出了很好的解释http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf我也认为 goertzel 算法做了类似的事情,但我不知道。

然后可以选择在 FFT 之前进行下采样。这可能还会节省一些 MIPS。

编辑:只是为了澄清关于 Goertzel 算法没有用的评论。通过直接将值插入此 wiki 页面底部的表达式http://en.wikipedia.org/wiki/Goertzel_algorithm,当所需 FFT 的大小大于 128 时,Goertzel 方法将比 FFT 更复杂(假设 FFT 大小是 2 的因子和 radix-2 实现)。

但是,还有其他有利于 Goertzel 的因素需要考虑。仅引用 wiki 页面:“FFT 实现和处理平台对相对性能有重大影响。一些 FFT 实现 [9] 执行内部复数计算以即时生成系数,显着增加了它们的“成本 K per FFT 和 DFT 算法可以使用预先计算的系数值表来提高数值效率,但这需要更多地访问缓冲在外部存储器中的系数值,这可能导致缓存争用增加,从而抵消了一些数值优势。”

“当使用实值而不是复值输入数据时,这两种算法的效率都提高了大约 2 倍。然而,这些增益对于 Goertzel 算法来说是很自然的,但如果不使用专门用于转换实数的某些算法变体,FFT 将无法实现这些增益。 ——有价值的数据。”

频率分辨率为

Δf=fsN
在哪里fs是采样频率和N是 FFT 大小。因此,增加采样频率实际上会增加频率分辨率(我假设“更好”是指更低)。因此,您应该增加 FFT 大小N,即 FFT 在一个数据块中处理的样本数,以降低频率分辨率。在您的示例中,您需要至少 300 个样本才能达到所需的频率分辨率。

如果N由于计算复杂性不能增加,带限信号可以在 FFT 之前进行频移。s(t)是连续信号,fc它的中心频率和fb它的带宽。x(n)是的采样版本s(t),即x(n)=s(n/fs). 然后可以通过以下方式实现频移

x~(n)=x(n)ej2πk0/N
在哪里k0=fc/fs. 现在可以降低采样频率,因为信号现在的截止频率为fb与截止频率相反fb+fc它在频移之前就有了。根据采样定理新的采样频率f~s必须大于或等于fb因此x~(n)可以下采样一个因子M=fs/fb从而提高频率分辨率,同时保持N持续的。

此方法仅在以下情况下有效s(t)是严格带宽限制的。如果不是,则必须提前应用带通滤波来滤除所需频带。另请注意,按小数进行下采样M还将引入额外的计算复杂性。