3

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

4

3 回答 3

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[] 向量/数组以及 value[] 向量/数组,而不是从索引计算时间。(但是,要小心,因为不规则间隔的样本并不一定意味着你认为他们所做的事情!如果这个评论有任何神秘,请坚持使用常规样本......)

唯一的问题是,如果您根据规则样本生成 N 个规则间隔的频率,那么按照上述方式进行操作将花费 O(N^2) 时间。快速傅里叶变换是一种在 O(N log N) 时间内完成此操作的算法。

于 2010-01-13T09:13:38.547 回答
1

您需要为这些中间点插入数据。

于 2010-01-12T14:41:58.413 回答
0

自从我做这些已经有 10 多年了,但我认为 Matlab 有一些 FT 方法可以让你做你想做的事。至少那是我们在线性信号和 DSP 类中使用的

于 2010-01-12T14:36:51.950 回答