2012-06-07 10 views
8

¿Existe una función o paquete en R para calcular la FFT deslizante de una muestra? Con esto quiero decir que dado el resultado de fft(x[n:m]), calcule fft(x[1+(n:m)]) de manera eficiente.FFT deslizante en R

Idealmente, encontraría tanto una versión en línea (donde no tengo acceso a la serie de tiempo completo al principio, o es demasiado grande para caber en la memoria, y no voy a tratar de guardar el toda la FFT en ejecución en la memoria) y una versión por lotes (donde le doy la muestra completa x y le digo el ancho de la ventana en ejecución w, lo que da como resultado una matriz compleja de dimensión c(w,length(x)/w)).

Un ejemplo de tal algoritmo se presenta aquí (pero nunca he intentado implementar en cualquier lenguaje aún):

http://cnx.org/content/m12029/latest/

Si hay tal cosita ya existe en R, que no lo hace Parece demasiado difícil de implementar, supongo.

Respuesta

5

Como suele ocurrir cuando publico algo aquí, no dejaba de trabajar en él y se acercó con una solución:

fft.up <- function(x1, xn, prev) { 
    b <- length(prev) 
    vec <- exp(2i*pi*seq.int(0,b-1)/b) 
    (prev - x1 + xn) * vec 
} 

# Test it out 
x <- runif(6) 
all.equal(fft.up(x[1], x[6], fft(x[1:5])), fft(x[2:6])) 
# [1] TRUE 

Aún interesado en saber si alguna biblioteca ofrece esto, porque entonces podría ofrecer otras cosas útiles también. =) Pero por ahora mi problema está resuelto.