Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Scaling the FFT and the IFFT

Asked by Rick Rosson on 13 Sep 2011
Latest activity Commented on by omar thamer on 19 Dec 2013

What is the correct way to scale results when taking the Fast Fourier Transform (FFT) and/or the Inverse Fast Fourier Transform (IFFT)?

0 Comments

Rick Rosson

Products

2 Answers

Answer by Rick Rosson on 13 Sep 2011
Accepted answer

Does scaling matter?

In most situations, scaling is really not all that important. The overall shape of the spectrum matters much more than the absolute scale.

What are the conventions?

But if you really are worried about it, there are several different conventions from which you can choose (see definitions below):

  1. Scale by dt for the FFT, and by Fs for the IFFT
  2. Scale by 1/M for the FFT, and by M for the IFFT
  3. Scale by 1 for the FFT, and by 1 for the IFFT
  4. Scale by 1/sqrt(M) for the FFT, and by sqrt(M) for the IFFT.
  5. and so on.

I generally use either option #1 or option #2 depending on my mood and whether it's raining outside.

Definitions

Here I am assuming that I have a discrete-time signal x represented as an M x N matrix, where M is the number of samples and N is the number of channels.

   [M,N] = size(x);

Furthermore, I am assuming that the sampling rate is Fs and that I have defined the time increment as

   dt = 1/Fs;

and the frequency increment as:

   dF = Fs/M;

What do all these conventions have in common?

All of these conventions have one thing in common: The product of the two scaling factors is always 1. Please note that the ifft function in MATLAB includes a scaling factor of 1/M as part of the computation, so that the overall round-trip scaling is 1/M (as it should be).

HTH.

Rick

3 Comments

Eugene on 15 Feb 2012

If my scaling is 'dt', for 1-Dimension, is it should by dt^2 for 2-D, please ?

Elige Grant on 16 Feb 2012

Are you sure you are supposed to get 1. This reminds me of another post: http://www.mathworks.co.uk/matlabcentral/answers/25479-sdof-frf-fft-magnitude-discrepancy

Incidentally, you should probably turn this into another question.

omar thamer on 19 Dec 2013

answer worked in case the reconstruction has the same length with original signal. What if the reconstruction has more length in order to do some prediction, How would you scale the ifft ?

Rick Rosson
Answer by Elige Grant on 28 Jan 2012

You are right about scaling being unimportant if only the shape of the spectrum is desired. However, if it is necessary that the amplitudes in the frequency spectrum be correct, then there is only one option for scaling - your option #1. In order for Parseval's theorem to hold, the energy in the time domain must equal the energy in the frequency domain. The example below demonstrates this:

> N = 8;
> dt = 0.1;
> df = 1/(dt*N)
df =
         1.25
> a = randn(N,1)
a =
      0.70154
      -2.0518
     -0.35385
     -0.82359
      -1.5771
      0.50797
      0.28198
      0.03348
> b = fft(a)*dt
b =
     -0.32813              
      0.10746 +    0.30519i
    -0.080365 +   0.075374i
      0.34826 +    0.17802i
      0.13866              
      0.34826 -    0.17802i
    -0.080365 -   0.075374i
      0.10746 -    0.30519i
> energy_a = sum(a.*conj(a) * dt)  % Not necessary to use conj here
energy_a =
      0.83314
> energy_b = sum(b.*conj(b) * df) % Necessary to use conj here
energy_b =
      0.83314

5 Comments

Elige Grant on 15 Feb 2012

In general, if you have a 2D "image" that is sampled every dx along the x-direction and dy along the y-direction, then you would do:

A = rand(64,64);
B = fft2(A)*dx*dy;

In your case, if the increments in the x- and y-direction are equal, then yes either dx^2 or dy^2 will be appropriate.

Jonathan Dandy on 7 Sep 2013

This answer works out, but confuses what is actually going on.

The frequncy domain data (b) is first multiplied by dt (b=fft(a)*dt). It is then squared (b.*conj(b)) and finally multiplied by df. The net effect is dt^2*df. Since df is defined as 1/(dt*N), this reduces to dt/N.

The time-domain data (a) only has the multiplier dt. So, in the end, the ratio of coefficients on the frequency domain and time-domain energy is 1/N. This also agrees with the formulation of Parseval's theorem in the discrete domain. ( http://en.wikipedia.org/wiki/Parseval%27s_theorem )

The reason dt and df are not needed for Parseval's theorem in the discrete domain is because dt and df are associated with continuous integral.

I am still sorting out the scaling. It seems like option 4 from the original value satisfies Parseval's equation. However, option 2 seems to mainatin the relationship between amplitudes (looking at DC levels) and has been suggested in a Matlab technical note (1702). There is also some good discussion about 1702 in Matlab Central.

omar thamer on 19 Dec 2013

answer worked in case the reconstruction has the same length with original signal. What if the reconstruction has more length in order to do some prediction, How would you scale the ifft ?

Elige Grant

Contact us