从函数中提取频率分量

时间:2014-03-03 12:37:38

标签: fft numerical-methods numerical

我有一些没有句号的任意函数f(x)。我希望在f(x)中找到1个频率分量的幅度。有人可以建议一个快速的方法来做到这一点吗?

到目前为止,我的想法涉及:

  1. f(x)的内积设为所需频率,例如 <f(x),cos(kx)>。这基本上是在给定频率下找到傅立叶系数。为了找到傅里叶系数,我打算在一个时期内完成;但是,由于时间很长,我想我会在不到一个时间内完成它,并希望它足够准确......

  2. 对信号进行FFT,然后简单地找到频率 我想从FFT获得的组件。

  3. 不管怎样,或许可以使用窄带通滤波器。

  4. 编辑: 谢谢你的建议。

    我找到了用Python编写的following算法(这是我需要的)并稍微调整一下以适应。

    def Goetrzel(x, target_frequency, sample_rate):
        s_prev = 0
        s_prev2 = 0
        normalized_frequency = target_frequency / sample_rate
    
        wr = np.cos(2.0 * np.pi * normalized_frequency)
        wi = np.sin(2.0 * np.pi * normalized_frequency)
    
        coeff = 2.0 * wr
        for sample in x:
            s = sample + coeff * s_prev - s_prev2
            s_prev2 = s_prev
            s_prev = s
    
        XKreal = s_prev * wr - s_prev2
        XKimag = s_prev * wi
    
        XK = (XKreal + 1j*XKimag) / (len(x)/2.)
    
        #power = s_prev2 * s_prev2 + s_prev * s_prev - coeff * s_prev * s_prev2 ;
        return abs(XK), np.angle(XK)*180./PI
    

    我用以下方法测试:

    h = 0.01
    z = np.arange(0., 300., h)
    f = np.cos(2.*PI*3.*z)
    print Goetrzel(f, 3., 1./h)
    

    如果我制作h = 0.0007,Goetrzel算法计算的答案似乎会发生显着变化(大幅增加)。你知道为什么,或者我如何确保选择正确的步骤?

    因此,将h0.06更改为0.07会将相位从-1.388e-11°更改为21.6°

1 个答案:

答案 0 :(得分:1)

探索Görtzel算法。它旨在检测信号中是否存在一个或几个(16)频率成分。