dft - 如何从 DFT 中选择频率

标签 dft

假设一个数字序列(波状数据)。然后我执行 DFT(或 FFT)变换。我想要实现的下一步是找到与数据中包含的实际频率相对应的频率。正如我们所知,DFT 输出具有实部和虚部 a[i] 和 b[i]。如果我们查看频谱 (sqrt(a[i]^2+b[i]^2),那么其中的最大值对应于包含在数据中的频率。问题是如何从 DFT 中找到所有频率?当有许多其他峰可能被错误选择时,就会出现问题。

最佳答案

我在写荣誉论文时,在对数据进行光谱分析处理时遇到了类似的问题。

你是对的:要找到主频率,你通常只需要查看 DFT 中复数值的大小。

不幸的是,您几乎必须编写某种智能算法来识别峰值(频率)。该算法的工作方式在很大程度上取决于您的应用程序的 DFT 外观。我的 DFT 都具有相似的特征,因此组合启发式算法并不难。如果您的 DFT 可以采用任何形式,那么您可能会得到很多误报和/或漏报。

我这样做的方法是识别 DFT 中具有高震级(峰)的区域,这些区域被低震级(低谷)包围。您可以将峰谷之间的最小差异(灵敏度)定义为常数乘以数据的标准偏差。此外,您可以说任何低于特定幅度(阈值)的峰值都将被完全忽略,因为它们只是噪声。

当然,只有在数据中定义相对明确的频率时,上述技术才会真正起作用。如果您的 DFT 是高度随机的,那么您需要格外小心地仔细设置灵敏度和阈值。

不要忘记您的数据量级是对称的,因此您只需要查看其中的一半。

一旦您确定了 DFT 中的频率,请不要忘记将其转换为您想要的单位。从内存中,如果您使用时间离散化 dt 采集了 n 个样本,那么如果您在数据点 5 处有一个峰值(例如),其中第一个数据点为 1,则频率为 1/(n*dt) 弧度/时间单位。 (我已经有一段时间没有这样做了,所以这个公式可能会因 Pi 或其他因素而偏离)

关于dft - 如何从 DFT 中选择频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973221/

相关文章:

c++ - MATLAB 中的 fft2 与 OpenCV C++ 中的 dft 速度比较

matlab - 在 MATLAB 中查找二维脉冲峰值

python - 在 Python 中计算单位的 n 次根

python - python中离散功率谱密度的正确归一化实际问题

matlab - 如何证明二维DFT的信号可分离性?软件

python - 直接傅立叶变换的最大值

c++ - 在 dft 之后是否有进一步的步骤来计算相位?

c++ - OpenCV 中的逆傅里叶变换

algorithm - Matlab 中的离散傅里叶变换 - 理论困惑