Quiero ampliar mi comentario y reelaborar el ejemplo al que hace referencia de una manera que debería ser más comprensible que el original y explicar por qué fft
devuelve los coeficientes de la manera en que lo hace.
Como referencia, la parte fft del ejemplo es:
Nx = size(x,2);
k = 2*pi/(b-a)*[0:Nx/2-1 0 -Nx/2+1:-1];
dFdx = ifft(1i*k.*fft(f));
d2Fdx2 = ifft(-k.^2.*fft(f));
Agregué otra sección de código directamente debajo de ella:
Nx = size(x,2);
k = 2*pi/(b-a)*(-Nx/2:Nx/2-1);
dFdxp = ifft(ifftshift(1i*k.*fftshift(fft(f))));
d2Fdx2p = ifft(ifftshift(-k.^2.*fftshift(fft(f))));
y envolvió los dos trozos de código en un momento tic; toc
de rought. En un formato más legible, el segundo método usa:
ckf = fftshift(fft(f));
ckdf = 1i*k.*ckf;
df = ifft(ifftshift(ckdf));
La primera diferencia es que el segundo ejemplo tiene un aspecto mucho más intuitivo k
. Esta es la principal ventaja del segundo ejemplo, ya que k está ahora en la forma en que pensamos sobre ellos. En la segunda y tercera línea tuve que agregar fftshift
alrededor de la llamada a fft
, luego una llamada a ifftshift
directamente dentro de la llamada a ifft
. Estas llamadas de función adicionales reordenan los coeficientes de lo que se requiere para que la computadora trabaje con ellos a la forma en que los humanos generalmente piensan en ellos.
El problema con el segundo ejemplo es que, si bien k
es más intuitivo para nosotros, deja las matrices internas para resolver e invertir fft
en formas que no son tan ventajosas. Entonces, o tenemos que cambiar el orden con llamadas a fftswitch
y ifftswitch
o tiene que estar codificado en las fft
funciones. Esto es menos propenso a errores de los usuarios (suponiendo que no estén familiarizados con el funcionamiento de fft, como muchas personas lo están), pero usted paga un precio en tiempo de ejecución.
Como dije antes, agregué llamadas de tiempo alrededor de los dos bloques para comparar y corrí por múltiples N. Los resultados de tiempo fueron:
N = 1000, Ex1 = 0.000222 s, Ex2 = 0.007072 s
N = 10000, Ex1 = 0.001576 s, Ex2 = 0.003506 s
N = 100000, Ex1 = 0.023857 s, Ex2 = 0.034051 s
N = 1000000, Ex1 = 0.213816 s, Ex2 = 0.406250 s
N = 10000000, Ex1 = 4.555143 s, Ex2 = 7.102348 s
Como puede ver, el acto de cambiar los valores de un lado a otro ralentiza el proceso considerablemente, especialmente a bajo N (donde es 30 veces más lento). Esto es solo un ejemplo, y su computadora puede mostrar tendencias ligeramente diferentes dependiendo de cosas como la velocidad de la memoria, los núcleos / velocidad del procesador, etc. pero es ilustrativo del punto. La razón por la fft
salida confusa es porque le está ahorrando una fracción no trivial de su tiempo de computación.