Este wikibook afirma que a saída do MATLAB FFT
corresponde aos números de onda ordenados como:
No entanto, nos códigos de exemplo da mesma página, os números de onda são codificados como
k = [0:n/2-1 0 -n/2+1:-1];
que é o mesmo que o primeiro, mas com o número onda (o "número máximo de ondas") substituído por . Parece estranho que eles incluam duas vezes.0 0
Parece que a ordem correta é necessária para obter derivadas através de transformadas de Fourier, conforme descrito no wikibook. Qual delas está correta e o MATLAB documenta isso em qualquer lugar?
matlab
fourier-analysis
Dúvida
fonte
fonte
Respostas:
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 é:
Adicionei outra seção de código diretamente abaixo:
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: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 adicionarfftshift
a chamada parafft
e depois uma chamadaifftshift
diretamente para dentro da chamadaifft
. 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 inverterfft
em formas que não são tão vantajosas. Portanto, ou temos que mudar a ordem com chamadas parafftswitch
eifftswitch
ou deve ser codificado para asfft
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:
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.fonte
Sua pergunta sobre a substituição do número de onda é bastante complicada. Em geral, essa modificação do número de onda não tem como objetivo salvar os fracassos, como alguns sugeriram aqui, mas projetada para respeitar as peculiaridades analíticas de, digamos, certos operadores diferenciais. Estou muito surpreso por não ter encontrado uma discussão relacionada nos Métodos espectrais de Trefethen. Para prosseguir, assumirei que você está preocupado com a diferenciação espectral baseada em FFT e que está realizando transformações em um domínio de cardinalidade uniforme.
A regra geral, para derivadas ímpares, é definir
e mesmo para derivativos, para definir
Se você estiver lidando com algum preenchimento, o tratamento da frequência de Nyquist é igualmente tedioso. Há um excelente artigo que comprova e observa esses tópicos aqui !
fonte
Para uma breve explicação e demonstração do alias, consulte o meu caderno IPython aqui .
fonte
fonte