Home > Software engineering >  Matlab resample time series for specific times, rather than frequencies
Matlab resample time series for specific times, rather than frequencies

Time:05-10

I have the following problem in Matlab:

I have a time series which looks like this:

size(ts) = (n,2); % with n being the number of samples, the first column is the time, the second the value.

Let's say I have:

ts(:,1) = [0, 10, 20, 30, 40];
ts(:,2) = [1,  3, 10,  6, 11];

I would like to resample the signal above to get the interpolated values at different times. Say:

ts(:,1) = [0,  1,  3, 15, 40];
ts(:,2) = ???

I had a look at the Matlab functions for signal processing but they are all only relevant for regular sampling at various frequencies.

Is there a built in function which would give me the above, or do I have to compute the linear interpolation for each new desired time manually? If so, do you have a recommendation to do this efficiently using vecotrized code (just started Matlab a month ago so still 100% at ease with this and relying on for loops a lot still).

For a bit of context, I'm using a finite difference scheme in series to investigate a problem. The output of one FD scheme is fed into the following. Due to the nature of my problem, I have to change the time stepping from one FD to the next, and my time steps can be irregular.

Thanks.

CodePudding user response:

Since your data are 1-D you can use interp1 to perform the interpolation. The code would work as follow:

ts = [0, 10, 20, 30, 40;    % Time/step number
      1,  3, 10,  6, 11];   % Values

resampled_steps = [0,  1,  3, 15, 40];  % Time for which we want resample

resampled_values = interp1(ts(1, :), ts(2, :), resampled_step);

% Put everything in an array to match initial format
ts_resampled = [resampled_steps; resampled_values];

Or you can condensate a bit, following the same idea:

ts = [0, 10, 20, 30, 40;    % Time/step number
      1,  3, 10,  6, 11];   % Values

% Create resample array
ts_resampled = zeros(size(ts));
ts_resampled(1, :) = [0,  1,  3, 15, 40];

% Interpolate
ts_resampled(2, :) = interp1(ts(1, :), ts(2, :), ts_resampled(1, :));

You can even choose the interpolation method you want, by passing a string to the interp1 function. The methods are listed here

Note that this only work if you re-sample with time stamps within your original scope. If you want them outside you have to tell the function how to extrapolate using the key word 'extrap'. Detail here

  • Related