Huge difference between the result of fft function Matlab and analytical Fourier transform of the same function
94 次查看(过去 30 天)
显示 更早的评论
Hey,
I am trying to find a way to obtain the numerical fourier transform of a function (it is not a signal and I only want to obtain the numerical fourier transform of a function). For a test code, I tried to see what is the result of fft matlab for a Gaussian function and compared it with the analytical fourier transform of this Gaussian. I have attached the plot of both results. Why the amplitude of fft result is that huge compared to analytical result? I can use fftshift to shift the result of fft to center but still the issue of amplitudes are there. I am wondering isn't it because it is a Gaussian function and so not periodic over time? Does fft only works if the function we have is spanned from -infinity to +infinity (basically a signal)? or we can use it if we want ot calculate the fourier transform of a function which spans from t-1 to t-2?![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1121775/image.jpeg)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1121775/image.jpeg)
2 个评论
Paul
2022-9-11
编辑:Paul
2022-9-11
If the code is posted, I'm sure we can sort it out.
Also, by definiion the DFT (as computed by fft) can only be applied for signals that have have finite duration, so NOT from -inf to inf. If the signal of interest is of infinite duration, then fft can be used if we're willing to live with a windowed version of the signal, with the windowing fucntion being zero where the underlying signal is small.
Not sure what distinction is being made between signals and functions. Mabye you're using the term "function" to mean a finite duration signal? I've not heard of that nomenclature, but maybe it's used.
采纳的回答
Paul
2022-9-11
Can't say for sure w/o seeing the code, but I supsect the fftshifted curve will be close to the blue curve if you mulitply the fftshifted result by the sampling period.
6 个评论
Paul
2022-9-15
Q2: Correct. The output of an N-point FFT are frequency domains samples with indepedent variable n = 0:(N-1) (the samples are zero outside this range thought not shown explicitly). The sample values n = 0:(N-1) can also be mapped to frequencies by multiplying n by 2*pi/N (rad/sample), or 1/N (cycles/sample), or 2*pi/N/Ts (rad/sec), or 1/N/Ts (Hz) depending on whatever is preferred. After applying fftshift, the independent variable is n = -N/2:(N/2 -1) for N even and n = ( (N-1)/2 ) : ( (N-1)/2 ) for N odd. However, keep in mind that if doing phase adjustment that the "frequency," w, used in exp(1j*n0*w) must be in rad (aka rad/sample)
Q3:Correct. Translation in the time domain doesn't affect the magnitude of the Fourier transform. However, keep in mind that magnitude and phase don't have clear meaning for signals with FTs that include Dirac deltas. But even in this case, the time translation still only results in a multiplication by a complex exponential of the FT of the unshifted signal.
syms t w
f(t) = cos(t);
F(w) = fourier(f(t))
% show that the FT of the shifted signal is an exp*FT of the unshifted
% signal
simplify(fourier(f(t-0.5)) - exp(-1j*sym(0.5)*w)*F(w))
Also, for the N-point DFT, instead of using the explicit phase adjustment for an N-point signal that doesn't start at n = 0 (as done above) we can use a circular shift on the input to fft. For example, suppose we have a signal with N = 8 values
rng(100)
N = 8;
x = rand(1,N);
that correspond to discrete-time values n of
n = -17:10;
If we want to use the DFT to get N samples of the DTFT we can do either
w = (0:(N-1))/N*2*pi;
X1 = fft(x).*exp(-1j*w*n(1));
or
X2 = fft(circshift(x,n(1)));
% show equal results
max(abs(X2-X1))
I suspect the latter is more numerically robust.
更多回答(1 个)
David Goodmanson
2022-9-11
编辑:David Goodmanson
2022-9-11
Hi ST,
Your frequency grid runs from -5 to 5, which for an fft is -fs/2 to fs/2 (fs being the sampling frequency), so fs = 10. The sampling interval delta_t = 1/fs = 1/10. It appears that you are trying to approximate a continuous Riemann integral
Int g(t) e^(-2pi i f t) dt
by using the fft. That approximation is a sum over indices (done by the fft) times the width of the intervals.
Sum (stuff) * delta_t
So if you multiply by 1/10, that takes the fft result down by exactly the right amount.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Transforms 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!