Реализация БПФ в R. Что не так? - PullRequest
0 голосов
/ 06 мая 2020

Эта ссылка обеспечивает рекурсивную реализацию FFT в Python:

from cmath import exp, pi

def fft(x):
    N = len(x)
    if N <= 1: return x
    even = fft(x[0::2])
    odd =  fft(x[1::2])
    T= [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
    return [even[k] + T[k] for k in range(N//2)] + \
           [even[k] - T[k] for k in range(N//2)]

Я попытался написать приведенный выше код в R. Вот мой код:

myFFT<- function(x)
{
  n <- length(x)

  if (n <= 1)
    return (x)

  even <- myFFT(x[c(TRUE, FALSE)])
  odd <- myFFT(x[c(FALSE, TRUE)])

  res <- c(0)
  for (k in 1:floor(n/2)){
    res[k] <- exp(-2*(1i)*pi*k/n)*odd[k]
  }

  lp <- c(0)
  rp <- c(0)

  for (k in 1:floor(n/2))
    lp[k] <- even[k] + res[k]

  for (k in 1:floor(n/2))
    rp[k] <- even[k] - res[k]

  return (c(lp, rp))
}

и результат:

> x <- (1:4)

#R
> myFFT(x)
[1] -2+2i -2-0i -2-2i 10+0i

#Python
#fft(x) returns                                                                                                                      
[(10+0j), (-2+2j), (-2+0j), (-1.9999999999999998-2j)]

Кажется, что myFFT(x) вычисляет элементы результата правильно, но переставляет их, и я не знаю, что не так .

...