What's the fastest way to approximate the period of data using Octave?

后端 未结 2 2139
花落未央
花落未央 2021-02-10 16:45

I have a set of data that is periodic (but not sinusoidal). I have a set of time values in one vector and a set of amplitudes in a second vector. I\'d like to quickly approximat

2条回答
  •  悲&欢浪女
    2021-02-10 17:14

    The Discrete Fourier Transform can give you the periodicity. A longer time window gives you more frequency resolution so I changed your t definition to t = linspace(0, 500, 2000). time domain http://img402.imageshack.us/img402/8775/timedomain.png (here's a link to the plot, it looks better on the hosting site). You could do:

    h = hann(length(x), 'periodic'); %# use a Hann window to reduce leakage
    y = fft(x .* [h h]); %# window each time signal and calculate FFT
    df = 1/t(end); %# if t is in seconds, df is in Hz
    ym = abs(y(1:(length(y)/2), :)); %# we just want amplitude of 0..pi frequency components
    semilogy(((1:length(ym))-1)*df, ym);
    

    frequency domain http://img406.imageshack.us/img406/2696/freqdomain.png Plot link.

    Looking at the graph, the first peak is at around 0.06 Hz, corresponding to the 16 second period seen in plot(t,x).

    This isn't computationally that fast though. The FFT is N*log(N) operations.

提交回复
热议问题