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
我在 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