Math 计算任意频率下的傅里叶变换

Math 计算任意频率下的傅里叶变换,math,fft,Math,Fft,我知道如果我们有一些数据代表一些波,例如图像线值, 我们可以用傅里叶变换得到那个波的频率函数。 但我们在x=0…N-1点有N个值 我们在输出端只得到N个频率。 所以我想分析[0,N-1]范围内的所有波 例如,在点u=1.5处。 我该怎么做呢?我已经10多年没有做过这些了,但我认为Matlab有一些FT方法可以让你做你想做的事情。至少这是我们在线性信号和DSP类中使用的,您需要为这些中间点计算数据。从一组样本中计算任何频率的傅里叶变换值实际上非常简单: F(w)= sum[over all sam

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

我已经10多年没有做过这些了,但我认为Matlab有一些FT方法可以让你做你想做的事情。至少这是我们在线性信号和DSP类中使用的,您需要为这些中间点计算数据。

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

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)
float Fourier(浮点ω){
复数a(0.0);//认为“a代表累加器”

对于(int k=0;kYou应该在mathoverflow.com上问这个问题。谢谢!我现在就试试!mathoverflow上的常见问题解答很清楚,这对该论坛来说不是一个好问题。似乎程序员想问的任何数学问题都没有家。那么你的意思是我在那里得到了相同的答案?)它实际上与编程无关,只要我们不谈论实现和快速算法。但它在信号分析中很有用,这就是为什么我问这个问题的原因,但我也在想,在这里问这个问题是否足够好,如果知道它们,我希望用C语言实现它们。你想实现它吗hem是为了你自己的利益,还是因为你需要使用它们?CI中有一个FTs库需要它。不是为了我自己的利益。谢谢!这是我一开始想的。但是有没有其他方法解决这个问题?根本没有。当然,你可以改变主意,决定不在中间点分析数据,在这种情况下,你不需要插值。你必须插值-但结果只是一个“有根据的猜测”。为了在频域中获得更好的结果,你还需要在时域中获得更多的样本。@peterchen:当然可以。不用说,插值不能神奇地创造出以前不存在的数据。对不起,我不明白。我们有函数f(t),我们知道它在点t=0..N-1.x_k=f(t_k)的值,其中t_k=k,我们有一个离散傅里叶变换:X_k=sum[在所有样本指数n上](X_n*e^(-(k*n)*i*2Pi/n))从这个方程中我们可以看到,只有N个FT点:X_k,k=0..N-1我想你写了一个关于连续情况的方程。或者可能是我不明白什么?我写了一个关于连续频率的方程——我想这就是你想要的。输入样本是离散的并不重要;从数学上来说,你把它们当作脉冲,将其插入方程,然后计算结果。如果样本是规则间隔的,上述公式和计算会在FFT计算的频率之间提供完美的自然插值。有趣的是…我会检查它!感谢您的想法)不同之处在于您建议的规则间隔频率(由FFT计算的)适用于重复采样——就好像将采样包装到无限重复的循环中一样。这对于任意/连续频率没有意义;在这种情况下,最好将(有限)采样集视为唯一的事件——孤立的或(等价的)被无限的零样本海洋包围。。。