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):
I generally use either option #1 or option #2 depending on my mood and whether it's raining outside.
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).
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)
> a = randn(N,1)
0.70154 -2.0518 -0.35385 -0.82359 -1.5771 0.50797 0.28198 0.03348
> b = fft(a)*dt
-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_b = sum(b.*conj(b) * df) % Necessary to use conj here
MVDR in multipath environment with high resolution method hi,how to simulate in matlab doa by mvdr in multipath environment and better performance by high resoultion method(esprit-music-wsf-spatial smoothing....)?
I tried both options mentioned above, namely option #1 and option #2 with a simple sine curve. The results of both options confuse me and I am hoping you can help clear things up.
The code I am referring to is the following:
dt = 0.05; %Time step t = [0:dt:10]; %Time vector s = sin(2*pi*t); %Signal vector N = length(s); %Number of data points f_s = 1/dt; %Sampling frequency df = f_s/N; %Frequency increment
NFFT = N; %FFT length used as second argument of fft() y_option1 = fft(s,NFFT); %Compute FFT using sampling interval as scaling factor y_option1 = y_option1*dt; y_shiftOption1 = fftshift(y_option1);
y_option2 = fft(s); %Compute FFT using signal length as scaling factor y_option2 = y_option2/N; y_shiftOption2 = fftshift(y_option2);
if mod(N,2) == 0 %N is even f = -f_s/2 : df : f_s/2-df; else %N is odd f = [sort(-1*(df:df:f_s/2)) (0:df:f_s/2)]; end
Plotting the sine signal and both result vectors y_shiftOption1 and y_shiftOption2 leads to the following Figure:
From my point of view the result of option #2 exhibits the correct amplitude of 0.5V, since the time signal has an amplitude of 1V and this value is split into the two impulses on the negative and the positive frequency scale.
However, regarding Parseval's Theorem, the energy is only preserved using option #1:
sum(abs(s).^2)*dt = 5 sum(abs(y_shiftOption1).^2).*df = 5 sum(abs(y_shiftOption2).^2).*df = 0.0495
Does this mean, if I am interested in the real amplitude of the signal, I have to use option #2 and if I want to preserve the energy of the signal option #1 has to applied?
Thanks in advance for your help!
Best Regards Chani