计算任何频率的傅立叶变换

时间:2010-01-12 14:18:30

标签: math fft

我知道如果我们有一些数据表示某些波形,例如图像线值, 我们可以使用傅里叶变换来获得该波的频率函数。 但是我们在点x = 0 ... N-1处有N个值 我们在输出端只得到N个频率。 所以我想分析[0,N-1]范围内的波动 例如,在点u = 1.5。 我该怎么办?

3 个答案:

答案 0 :(得分:4)

计算一组样本中任何频率的傅立叶变换值实际上非常简单:

F(w)= sum[over all sample indices k] ( f(t_k) e^(i w t_k) )

代码方面,你做这样的事情:

float Fourier(float omega) {
  Complex a(0.0); // think "a is for accumulator"
  for(int k=0; k<value.size(); ++k) {
    float time= t_start + k*dt;
    float theta= omega * time;  // this is (w t_k) from above
    a+= value[k] * Complex(cos(theta), sin(theta));
  }
  return a;
} // note, I have explicitly written out e^(i theta) = cos(theta) + i sin(theta)

如果您有不规则的采样时间,可以使用time []向量/数组以及值[]向量/数组,而不是从索引计算时间。 (但是,要小心,因为不规则间隔的样本并不一定意味着你认为他们做了什么!如果这个评论有任何神秘感,坚持使用常规样本......)

唯一的问题是,如果你希望基于常规样本生成N个规则间隔的频率,那么按照上述方式执行它将花费O(N ^ 2)时间。 快速傅立叶变换是一种在O(N log N)时间内执行此操作的算法。

答案 1 :(得分:1)

您需要interpolate这些中间点的数据。

答案 2 :(得分:0)

自从我完成其中任何一项已有超过10年,但我认为Matlab有一些FT方法可以让你做你想做的事情。至少这是我们在线性信号和DSP类中使用的那些