【问题标题】:How to extract the peak at a specific frequency in python如何在python中提取特定频率的峰值
【发布时间】:2016-07-01 03:26:51
【问题描述】:

我想知道信号中特定频率的能量有多少。我正在使用 FFT 来获取频谱,频率步长由我的信号长度决定。

例如,我的光谱看起来像这样:

我想在 特定频率 -0.08 处获得频谱峰值。然而,光谱的离散化只给我一个峰值在 -0.0729 和 -0.0833。

有没有办法移动频谱以确保在我想要的频率上有一个数据点?还是一种无需使用 fft 即可获得价值的方法?

非常感谢!

【问题讨论】:

    标签: python fft spectrum frequency-analysis


    【解决方案1】:

    当您进行 DFT(或任何傅立叶变换)时,您实际上在做的是测量有多少信号与特定频率的正弦波“相交”。这是通过将信号的乘积与任何频率的波的复共轭相加来完成的。从技术上讲,这称为内积,它是点积的概括,衡量一个信号与另一个信号的“接近”程度。所以如果你只对一个频率感兴趣,不要拿整个 DFT,只看你想要的一个。

    我不确定你的单位是什么,所以我假设你想要 f0 = -0.08 Hz 的峰值(如果你的单位是别的东西,比如标准化为采样频率,那么你需要考虑为了那个原因)。这对应于复指数exp(2*pi*j*f0*t)。因为您正在采样,所以您的 t 是离散的,所以 t = n/fs,其中 fs 是采样频率(以 Hz 为单位)。

    # assuming you're using numpy arrays
    w = exp(-2*pi*1j*f0*arange(len(signal))/fs)
    peak = abs(sum(signal*w))
    

    DFT 有不同的定义;我很确定 numpy 对应于我上面的内容。指数中的额外减号是因为它是复共轭。

    请注意,w 实际上不太可能是周期性的。如果样本数量足够大,这并不重要。一个好的启发式方法至少是 10 个句点。

    【讨论】:

    • 非常感谢,这正是我想要的!你说得对,这里没必要全盘考虑。
    • 测量你的信号有多少与某些频率的正弦“相交” - 现在我终于明白了,离开学校 5 年
    【解决方案2】:

    如果您有离散数据但需要连续变量的输出,则必然需要某种插值函数。对于请求样式的值,我建议 Scipy interp1d (example of the use of a interp1d function)。我相信这是实现预期结果的最快方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2017-05-22
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多