Hello, im trying to perform tidal prediction. in order to do that i need to analyse the raw data from the mareograph and to get the amplitude and the phase of the first 20 frequencies (those ones have the most impact in the data).
i've used the following functions: Y=fft(X); %X is the raw data Ph=angle(Y); Amp=abs(Y);
the problem is that the values that im getting for the amplitudes are enormous (the original data has values up to 0.4 meters, the amplitude has valuse of tens sometimes hundreds of meters) wich is wrong.
how can i fix it? what am i doing wrong?
thanx for the help .....

1 commentaire

Alexandria
Alexandria le 29 Juin 2016
I want to perfom a tidal prediction, what data do you need to use?

Connectez-vous pour commenter.

 Réponse acceptée

Wayne King
Wayne King le 23 Mai 2012

1 vote

Hi Dany, you are most likely not scaling the estimates by the length of the input vector. For example.
t = 0:0.001:1-0.001;
x = cos(2*pi*100*t-pi/4)+0.5*randn(size(t));
xdft = fft(x);
xdft = xdft(1:length(x)/2+1);
xdft(2:end-1) = 2*xdft(2:end-1);
xdft = xdft./length(x);
fprintf('Amplitude at 100 Hz is %3.2f.\n',abs(xdft(101)))
fprintf('Phase at 100 Hz is %2.3f radians.\n',angle(xdft(101)))

3 commentaires

Daniel Shub
Daniel Shub le 23 Mai 2012
But then Parseval's theorem doesn't hold... Further, if you take the first 20 components, and do the inverse FFT, the magnitudes will be really screwed up. Scaling might be closer to what Dany wants though.
Wayne King
Wayne King le 23 Mai 2012
right, to make DFT as matlab implements it as a unitary operator, you have to multiply the output by 1/sqrt(length(x)). For the L2 norm:
x = randn(8,1);
norm(x,2)
xdft = 1/sqrt(length(x))*fft(x);
norm(xdft,2)
but 2/length(x) here for the positive frequencies gives you the MLE estimates of the sine wave amplitudes
Dany
Dany le 23 Mai 2012
Wayne,
thank you for your help, it seems ok now.

Connectez-vous pour commenter.

Plus de réponses (1)

Daniel Shub
Daniel Shub le 23 Mai 2012

0 votes

The concept of the first 20 frequencies doesn't make sense. The frequencies to which the first 20 components correspond depends on your sample rate and the number of samples in your signal/FFT. You might want to calculate the PSD instead of the FFT. Also, if all you want is the power in the low frequencies you might want to just lowpass filter your signal. Finally you might want to consider FREQZ instead of FFT.
There is no reason that the FFT of a waveform with a maximum magnitude of 0.4 cannot have values much much larger than 0.4. Consider
Amp = abs(fft(0.4*rand(1e5, 1)));

Community Treasure Hunt

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

Start Hunting!

Translated by