I am trying to learn how to implement the FFT as a way to approximate the continuous-time Fourier transform, and as a nice easy example I have chosen to test it with a simple Gaussian pulse in the time domain (assume the signal is in units of Volts), given by $$ x(t) = A \exp \bigg(-\frac{t^2}{2\sigma^2} \bigg), \tag{1} $$ and I know that the analytic continuous-time Fourier transform of this function is given by $$ X(f) = A\sigma\sqrt{2\pi} \exp \Big( -2\pi^2\sigma^2f^2 \Big), \tag{2} $$ using the definition of the Fourier transform $$ \mathcal{F}\{x(t)\} = X(f) = \int_{-\infty}^{+\infty} x(t) e^{-2\pi ift} \,\,\textrm{d}t. \tag{3} $$ (Since $X(f)$ is real, we have $|X(f)| = X(f)$, and $\textrm{arg}(X) = 0$. This is because the Gaussian in Eq. (1) is centered at $t = 0$. If the signal was shifted in time to $t=t_0$, this would introduce an addtional phase shift factor of $e^{-2\pi ift_0}$, and $\textrm{arg}(X)$ would be non-zero.) I then use Matlab to sample the Gaussian input signal in Eq. (1) and try to numerically obtain the result of Eq. (2) by implementing the FFT algorithm. ```lang-matlab s = 2; % Sigma of input Gaussian signal [s] A = 3; % Amplitude of input Gaussian signal [V] Fs = 2; % Sampling rate [Hz] N = 50; % Number of samples to collect Ts = 1/Fs; % Sampling interval [s] T = N*Ts; % Record window length [s] t = -(T/2):Ts:(T/2-dt); % Generate centered time vector x = A*exp(-t.^2/(2*s^2)); % Create sampled verison of Gaussian NFFT = N; % This indicates no zero-padding will be implemented df = Fs/NFFT; % Frequency resolution (bin separation) [Hz] f = -(Fs/2):df:(Fs/2-df); % Generate frequency vector X = fftshift(fft(ifftshift(x)))*dt; % Continuous Fourier transform approximated by FFT X_abs = abs(X); % Complex magnitude of FT X((X_abs<1e-8)) = 0; % kill values below threshold, so phase is well-behaved X_phase = unwrap(angle(X)); % Phase of FT figure; plot(t,x) figure; plot(f,X_abs) figure; plot(f,X_phase) ``` This code produces the following plots, which agree very nicely with the analytic expression above. [![enter image description here][1]][1] [![enter image description here][2]][2] The problem is that this code works, but I am not entirely sure exactly *why* it works! What I believe I am actually doing is approximating the continuous Fourier transform of Eq. (3) by a Riemann sum $$ X(f_k) = X\Big(\frac{kF_s}{K}\Big) \approx \sum_{i=0}^{N-1} x(nT_s) \exp\Big( -2\pi i \frac{kn}{K} \Big) \times T_s. $$ There are two things that confuse me: 1) The sum in the [definition of the FFT in Matlab][3] runs from $1$ to $N$ (or $0$ to $N-1$, but let's ignore the Matlab indexing details for now!), but the Fourier transform is defined from $-\infty$ to $+\infty$. Does anyone have a nice intuitive way to see why the shift in the limits works? Is it simply because what we are really looking at here is the area under a curve, and it doesn't matter if you change where this area is positioned? 2) The second thing which confuses me is that I have had to use ```ifftshift(x)``` (not ```fftshift(x)```, although they are equivalent if the number of points is even) before passing my Gaussian to ```fft()```. I was careful to define my time vector in the code in such a way that the zero of time falls at the index $N/2+1 = 26$. This is because I know then that after ```ifftshift()``` the zero point will then be moved to the first entry in the vector (since I am using an even number of samples), as seen in the figure below: [![enter image description here][4]][4] Can someone explain why we have to do this, and how to interpret the fact that points corresponding to negative times are now at the end of the vector? I know this is necessary because if I don't do it then I obtain a linear phase shift, consistent with the signal not being centered at $t=0$. The most common justification I keep seeing is **"It's because the FFT 'assumes' the time zero point is the first value in your vector!"** Is there a nice way to see this in terms of the approximation to the continuous case, using the indexing and Riemann sum as above, without anthropomorphizing the FFT algorithm? [1]: https://i.sstatic.net/VfkhS.png [2]: https://i.sstatic.net/pYCLB.png [3]: https://www.mathworks.com/help/matlab/ref/fft.html [4]: https://i.sstatic.net/q4fdg.png