Este wikibook indica que la salida de MATLAB FFT
corresponde con los números de onda ordenados como:
Sin embargo, en los códigos de ejemplo en la misma página, los números de onda se codifican como
k = [0:n/2-1 0 -n/2+1:-1];
que es lo mismo que el primero, pero con el onda n / 2 (el "número de onda máximo") reemplazado por 0 . Parece extraño que incluirían 0 dos veces.
Parece que el orden correcto es necesario para tomar derivados a través de transformadas de Fourier, como se describe en el wikibook. ¿Cuál de estos es correcto? ¿MATLAB documenta esto en alguna parte?
matlab
fourier-analysis
Duda
fuente
fuente
Respuestas:
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:
Agregué otra sección de código directamente debajo de ella:
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: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 agregarfftshift
alrededor de la llamada afft
, luego una llamada aifftshift
directamente dentro de la llamada aifft
. 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 invertirfft
en formas que no son tan ventajosas. Entonces, o tenemos que cambiar el orden con llamadas afftswitch
yifftswitch
o tiene que estar codificado en lasfft
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:
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.fuente
Su pregunta sobre el 'reemplazo' del número de onda es bastante complicada. En general, la modificación del número de onda de este tipo no está destinada a salvar los fracasos, como algunos han sugerido aquí, sino que está diseñada para respetar las peculiaridades analíticas de, por ejemplo, ciertos operadores diferenciales. Estoy muy sorprendido de que no haya podido encontrar una discusión relacionada en los Métodos espectrales de Trefethen. Para continuar, supondré que está preocupado por la diferenciación espectral basada en FFT y que está realizando transformaciones en un dominio de cardinalidad uniforme.
La regla general, para derivadas impares, es establecer
y para derivados pares, establecer
Si se trata de un relleno, el tratamiento de la frecuencia de Nyquist es igualmente tedioso. Hay un excelente reportaje que prueba y los comentarios sobre estos temas aquí !
fuente
Para una breve explicación y demostración del alias, vea mi cuaderno de IPython aquí .
fuente
fuente