Sie sind auf Seite 1von 5

New to MATLAB?

Learn MATLAB
today!

Asked by Mary Jon on 15 Nov 2014


Latest activity Commented on by Mary Jon on 26 Nov 2014
Accepted Answer by Matt
I have this code, I am suppose sin of amplitude 10 with frequency 200hz and
sampling frequency 20000 hz and do FFT on this signal,
why the Amplitude after FFT is 1000?? where the amplitude must be stay 10

Fs = 20000;
t = 0:1/Fs:0.01;
fc1=200;
x = 10*sin(pi*fc1*t)
x=x';
xFFT = abs(fft(x));
xDFT_psd = abs(fft(x).^2);

fft

MATLAB

Link
Answer by Matt on 15 Nov 2014
Edited by Matt on 17 Nov 2014
Accepted answer
Mary,
In general, to return a FFT amplitude equal to the amplitude signal
which you input to the FFT, you need to normalize FFTs by the
number of sample points you're inputting to the FFT.

Fs = 20000;
t = 0:1/Fs:0.01;
fc1=200;
x = 10*sin(pi*fc1*t)
x=x';
xFFT = abs(fft(x))/length(x);
xDFT_psd = abs(fft(x).^2);

Note that doing this will divide the power between the positive and
negative sides, so if you are only going to look at one side of the
FFT, you can multiply the xFFT by 2, and you'll get the magnitude
of 10 that you're expecting.
The fft documentation has a pretty good example that illustrates
this and some other fft best practices.
http://www.mathworks.com/help/matlab/ref/fft.html
*Edited for clarity, - see Matt J's comment for the original
statement.

Show 2 older comments


Matt J on 16
Nov 2014
Link
In general you need to normalize FFTs by the
number of points you're inputting to the FFT.

That's true if the FFT is being used to compute


Fourier Series coefficients. If the idea is to
approximate a continuous Fourier Transform
integral, the FFT needs to be scaled by the time
sampling interval 1/Fs. If the idea is to preserve
signal energy (Pareseval's theorem), the FFT
needs to be normalized by 1/sqrt(N).

Mary Jon on 16
Nov 2014

Link

how can I scale by time sampling interval please

Matt J on 17
Nov 2014

Link

As follows, but it doesn't sound like that is the type


of scaling your situation requires,

deltaT=1/Fs; %time sampling interval


xFFT = abs(fft(x)*deltaT);

Link
Answer by Matt J on 16 Nov 2014
Edited by Matt J on 16 Nov 2014
You also have to be careful about how you design your frequency
space sampling. In your current code, the frequency sampling
interval is Fs/length(t)=99.5025 Hz. But the frequency you are
trying to sample is at 100 Hz, so your Fourier Space sampling will
never hit this. And, because the spectrum is sharply peaked, you
can get significant errors with this deviation.

Mary Jon on 16
Nov 2014

Link

I need only calculate fft and PSD of sin wave with


frequency 200hz and sampling frequency
20000hz,
this code represent as a test on well known signal
(sin) to help me how do this (FFT) in signals of my
project

Matt J on 16
Nov 2014

Link

The signal you've shown is 100 Hz. A 200 Hz


sinewave would have fc1=400.
But I'm not sure you caught my point. The
amplitude of the FFT result will depend not only on
the sampling frequency Fs, but also the number of
samples length(x). Below, for example, we see
that the peak amplitude of xFFT is not really
exactly 1000 until you drop one sample:

>> max( abs(

fft(x)

ans =
1.0023e+03
>> max( abs(

fft(x(1:end-1))

ans =
1000

Mary Jon on 26
Nov 2014

Link

ok, matt the x-axis represent numbers of sample


(201)isnt it,How can I (modify in code) to made x
axis of xFFT in frequency unit? please

close
Direct link to this comment:
http://www.mathworks.com/matlabcentral
/answers/162846#comment_249975

Das könnte Ihnen auch gefallen