¿Se multiplicará la amplitud de los resultados fft de Numpy por el período de muestreo?

Intento validar mi comprensión de la FFT de Numpy con un ejemplo: la transformada de Fourier de exp(-pi*t^2) debe ser exp(-pi*f^2) cuando no se aplica escala en la transformación directa.

Sin embargo, encuentro que para obtener este resultado necesito multiplicar el resultado de FFT por un factor dt , que es el intervalo de tiempo entre dos puntos de muestra en mi función. No entiendo porque ¿Alguien puede ayudar?

Aquí hay un código de ejemplo:

 # create data N = 4097 T = 100.0 t = linspace(-T/2,T/2,N) f = exp(-pi*t**2) # perform FT and multiply by dt dt = t[1]-t[0] ft = fft(f) * dt freq = fftfreq( N, dt ) freq = freq[:N/2+1] # plot results plot(freq,abs(ft[:N/2+1]),'o') plot(freq,exp(-pi*freq**2),'r') legend(('numpy fft * dt', 'exact solution'),loc='upper right') xlabel('f') ylabel('amplitude') xlim(0,1.4) 

Tenga cuidado, no está calculando la transformación de Fourier de tiempo continuo, las computadoras trabajan con datos discretos, también lo hace Numpy, si numpy.fft.fft documentación de numpy.fft.fft que dice:

numpy.fft.fft (a, n = Ninguno, eje = -1) [fuente]

Calcular la transformada de Fourier discreta unidimensional.

Esta función calcula la transformada de Fourier discreta (DFT) unidimensional con el algoritmo eficiente de Transformada rápida de Fourier (FFT).

Eso significa que estás calculando la DFT que se define por la ecuación:

introduzca la descripción de la imagen aquí

La transformada de Fourier de tiempo continuo se define por:

introduzca la descripción de la imagen aquí

Y si haces las matemáticas para buscar la relación entre ellos:

introduzca la descripción de la imagen aquí

Como puede ver, hay un factor constante 1/N que es exactamente su valor de escala dt ( x[n] - x[n-1] donde n está en el intervalo [0, T] es equivalente a 1/N ).


Solo un comentario sobre su código, no es una buena práctica importar todo from numpy import * lugar de usar:

 import numpy as np import matplotlib.pyplot as plt # create data N = 4097 T = 100.0 t = np.linspace(-T/2,T/2,N) f = np.exp(-np.pi*t**2) # perform FT and multiply by dt dt = t[1]-t[0] ft = np.fft.fft(f) * dt freq = np.fft.fftfreq(N, dt) freq = freq[:N/2+1] # plot results plt.plot(freq, np.abs(ft[:N/2+1]),'o') plt.plot(freq, np.exp(-np.pi * freq**2),'r') plt.legend(('numpy fft * dt', 'exact solution'), loc='upper right') plt.xlabel('f') plt.ylabel('amplitude') plt.xlim([0, 1.4]) plt.show() 

introduzca la descripción de la imagen aquí