Расчет преобразования Фурье на любой частоте - PullRequest
3 голосов
/ 12 января 2010

Я знаю, что если у нас есть некоторые данные, представляющие некоторую волну, например значения строки изображения мы можем использовать преобразование Фурье, чтобы получить частотную функцию этой волны. Но у нас есть N значений в точках х = 0 ... N-1 И мы получаем только N частот на выходе. Поэтому я хочу проанализировать волну везде в диапазоне [0, N-1] Например, в точке u = 1,5. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 13 января 2010

Вычислить значение преобразования Фурье для любой частоты из набора выборок на самом деле довольно просто:

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)

Если у вас нерегулярное время выборки, вы можете использовать вектор / массив времени [] вместе со своим значением / вектором / массивом вместо того, чтобы вычислять время по индексу. (Однако будьте осторожны, поскольку нерегулярно расположенные образцы не обязательно означают то, что, по вашему мнению, они делают! Если этот комментарий каким-либо образом загадочный, придерживайтесь обычных образцов ...)

Единственная проблема состоит в том, что, если вы хотите, чтобы генерировал N частот с регулярными интервалами на основе регулярных выборок, выполнение описанного выше способа займет время O (N ^ 2). Быстрое Преобразование Фурье - это алгоритм, который делает это за O (N log N).

1 голос
/ 12 января 2010

Вам необходимо интерполировать данные для этих промежуточных точек.

0 голосов
/ 12 января 2010

Прошло более 10 лет с тех пор, как я сделал что-то из этого, но я думаю, что у Matlab есть несколько методов FT, которые позволят вам делать то, что вы хотели. По крайней мере, это то, что мы использовали в наших линейных сигналах и классах DSP

...