Desejo expandir meu comentário e refazer o exemplo que você menciona de uma maneira que seja mais compreensível que o original e explicar por que fft
retorna os coeficientes da maneira que é.
Para referência, a parte fft do exemplo é:
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));
Adicionei outra seção de código diretamente abaixo:
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))));
e embrulhou os dois pedaços de código em um período tic; toc
de tempo necessário. Em um formato mais legível, o segundo método usa:
ckf = fftshift(fft(f));
ckdf = 1i*k.*ckf;
df = ifft(ifftshift(ckdf));
A primeira diferença é que o segundo exemplo é muito mais intuitivo k
. Essa é a principal vantagem do segundo exemplo, já que k está agora na forma que pensamos sobre eles. Nas segunda e terceira linhas, eu tinha que adicionar fftshift
a chamada para fft
e depois uma chamada ifftshift
diretamente para dentro da chamada ifft
. Essas chamadas de função adicionais reordenam os coeficientes do que é necessário para o computador trabalhar com eles da maneira que os humanos geralmente pensam sobre eles.
A questão do segundo exemplo é que, embora k
seja mais intuitivo para nós, isso deixa as matrizes internas para resolver e inverter fft
em formas que não são tão vantajosas. Portanto, ou temos que mudar a ordem com chamadas para fftswitch
e ifftswitch
ou deve ser codificado para as fft
funções. Isso é menos propenso a erros por parte dos usuários (supondo que eles não estejam familiarizados com o funcionamento do fft, como muitas pessoas o fazem), mas você paga um preço em tempo de execução.
Como afirmei antes, adicionei chamadas de tempo nos dois blocos para comparação e corri para vários N. Os resultados de tempo foram:
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 você pode ver, o ato de alternar os valores diminui consideravelmente o processo, especialmente em N baixo (onde é 30x mais lento). Este é apenas um exemplo, e seu computador pode mostrar tendências ligeiramente diferentes, dependendo de coisas como velocidade da memória, núcleos / velocidade do processador, etc., mas é ilustrativo do ponto. A razão pela qual a fft
saída é confusa é porque está economizando uma fração não trivial do seu tempo de computação.