www.gusucode.com > signal 案例源码程序 matlab代码 > signal/ResampleNonuniformlySampledDataSetExample.m

    %% Resample a Nonuniformly Sampled Data Set
% Use the data recorded by Galileo Galilei in 1610 to determine the orbital
% period of Callisto, the outermost of Jupiter's four largest satellites.

%%
% Galileo observed the satellites' motion for six weeks, starting on 15
% January. The observations have several gaps because Jupiter was not
% visible on cloudy nights. Generate a |datetime| array of observation
% times.

t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
    41 42 43 44 45]'+1;

yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
    10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
    -10.5 -10.5 -10.0 -8.0]';

obsv = datetime(1610,1,15+t);

%%
% Resample the data onto a regular grid using a sample rate of one
% observation per day. Use a moderate upsampling factor of 3 to avoid
% overfitting.

fs = 1;

[y,ty] = resample(yg,t,fs,3,1);

%%
% Plot the data and the resampled signal.

plot(t,yg,'o',ty,y,'.-')
xlabel('Day')

%%
% Repeat the procedure using spline interpolation and displaying the
% observation dates. Express the sample rate in inverse days.

fs = 1/86400;

[ys,tys] = resample(yg,obsv,fs,3,1,'spline');

plot(t,yg,'o')
hold on
plot(ys,'.-')
hold off

ax = gca;
ax.XTick = t(1:9:end);
ax.XTickLabel = char(obsv(1:9:end));

%%
% Compute the periodogram power spectrum estimate of the uniformly spaced,
% linearly interpolated data. Choose a DFT length of 1024. The signal peaks
% at the inverse of the orbital period.

[pxx,f] = periodogram(ys,[],1024,1,'power');
[pk,i0] = max(pxx);

f0 = f(i0);
T0 = 1/f0

plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')