我有一些没有句号的任意函数f(x)
。我希望在f(x)
中找到1个频率分量的幅度。有人可以建议一个快速的方法来做到这一点吗?
到目前为止,我的想法涉及:
将f(x)
的内积设为所需频率,例如
<f(x),cos(kx)>
。这基本上是在给定频率下找到傅立叶系数。为了找到傅里叶系数,我打算在一个时期内完成;但是,由于时间很长,我想我会在不到一个时间内完成它,并希望它足够准确......
对信号进行FFT,然后简单地找到频率 我想从FFT获得的组件。
不管怎样,或许可以使用窄带通滤波器。
编辑: 谢谢你的建议。
我找到了用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算法计算的答案似乎会发生显着变化(大幅增加)。你知道为什么,或者我如何确保选择正确的步骤?
因此,将h
从0.06
更改为0.07
会将相位从-1.388e-11°
更改为21.6°
。