fft normalization and parseval
27 views (last 30 days)
Show older comments
h=complex(randi([-1 1],128,1),randi([-1 1],128,1));
h=h/std(h); % no h is normalized to unit pow thus var(h)=1
t=128*ifft(h);
k=var(t);
f=fft(t)/128
g=var(f);
my problem is that k(power in time ) not = g(power in freq) also i have done normalizatoin so that parseval therom applies
any help please
0 Comments
Accepted Answer
Matt J
on 25 May 2014
Edited: Matt J
on 25 May 2014
also i have done normalizatoin so that parseval therom applies
No, you haven't, I'm afraid. For a length-N fft, the proper normalization is
Y=fft(X)/sqrt(N);
XX=sqrt(N)*ifft(Y);
For example,
>> X=rand(1,10);
>> Y=fft(X)/sqrt(10); XX= sqrt(10)*ifft(Y);
>> norm(X), norm(Y), norm(XX)
ans =
2.3117
ans =
2.3117
ans =
2.3117
2 Comments
Matt J
on 25 May 2014
yasser Commented
@Matt J thanks but please provide a ref for your normalization factor as i saw lots of codes doing as i did without the sqrt issue
Matt J
on 25 May 2014
Edited: Matt J
on 25 May 2014
As you can see from the formula in the FFT documentation
![](https://www.mathworks.com/matlabcentral/images/broken_image.png)
the formula for the transform that MATLAB uses is non-orthogonal by a factor of sqrt(N). Normalizing by N and 1/N is what is needed when using FFTs to compute Fourier Series coefficients, see the formulas here
More Answers (2)
George Papazafeiropoulos
on 25 May 2014
In the following code:
var1=128;
h=complex(randi([-1 1],var1,1),randi([-1 1],var1,1));
h=h/std(h); % no h is normalized to unit pow thus var(h)=1
t=var1*ifft(h);
k=var(t)
f=fft(t)/var1;
g=var(f)
you have specified var1=128. Try to increase var from 128 to larger values. The two results will eventually converge.
0 Comments
See Also
Categories
Find more on Fourier Analysis and Filtering in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!