Эта ссылка обеспечивает рекурсивную реализацию 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)
вычисляет элементы результата правильно, но переставляет их, и я не знаю, что не так .