fft normalization and parseval

31 次查看(过去 30 天)
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

采纳的回答

Matt J
Matt J 2014-5-25
编辑:Matt J 2014-5-25
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 个评论
Matt J
Matt J 2014-5-25
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
Matt J 2014-5-25
编辑:Matt J 2014-5-25
As you can see from the formula in the FFT documentation
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

请先登录,再进行评论。

更多回答(2 个)

George Papazafeiropoulos
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.

yasser
yasser 2014-5-26
@Matt J please what do u mean by formula for the transform that MATLAB uses is non-orthogonal by a factor of sqrt(N)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by