Search code examples
matlabinterpolationresampling

Matlab resample time series for specific times, rather than frequencies


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.


Solution

  • 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 alternatively, 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