Matlab 重新采样特定时间的时间序列,而不是频率

Matlab resample time series for specific times, rather than frequencies

我在 Matlab 中遇到以下问题:

我有一个时间序列,如下所示:

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

假设我有:

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

我想对上面的信号重新采样以获得不同时间的插值。说:

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

我查看了用于信号处理的 Matlab 函数,但它们都只与各种频率的常规采样相关。

是否有内置函数可以提供上述信息,或者我是否必须手动为每个新的所需时间计算线性插值?如果是这样,您是否有建议使用向量化代码有效地执行此操作(一个月前刚开始使用 Matlab,所以仍然 100% 放心并且仍然大量依赖 for 循环)。

关于一些上下文,我正在使用串联的有限差分方案来研究问题。一个 FD 方案的输出被送入以下。由于我的问题的性质,我必须将时间步长从一个 FD 更改为下一个,我的时间步长可能是不规则的。

谢谢。

由于您的数据是一维的,因此您可以使用 interp1 来执行插值。该代码将按如下方式工作:

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];

或者您也可以按照相同的想法:

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, :));

您甚至可以通过将字符串传递给 interp1 函数来选择所需的插值方法。列出的方法 here

请注意,这仅在您 re-sample 在原始范围内使用时间戳时才有效。如果你想让它们在外面,你必须告诉函数如何使用关键字 'extrap' 进行推断。详情 here