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