フィルターのクリア

how to resample non-linear breath-by-breath data (so inconsistant time)

6 ビュー (過去 30 日間)
KFrenkie
KFrenkie 2016 年 2 月 12 日
編集済み: Walter Roberson 2016 年 2 月 13 日
Hi all,
I have a question regarding my data (example random numbers). If the subject had two breaths within a second there are two datapoints at the same time value. I think the biggest problem is the non-linearity of the data?
x=[0 1 2 5 7 8 9 15 19 20 21 22 23 24 27 30 31 32 33 34 35 36 36 38]
y=[1 2 5 3 4 8 6 5 8 5 8 6 85 85 66 44 55 66 88 77 99 88 55 66]
However, I need to resample to a 5 second time scale with it's resampled y data
x2=[0 5 10 15 20]
I wanted to use timeseries but this gave me the following error:
Warning: Cannot extrapolate
> In tsinterp>linearinter (line 145)
In tsinterp>localInterpolate (line 240)
In tsinterp (line 89)
In tsarrayFcn (line 26)
In tsdata.interpolation/interpolate (line 72)
In timeseries/resample (line 106)

採用された回答

Star Strider
Star Strider 2016 年 2 月 12 日
For your sample data, this works:
x=[0 1 2 3 4 4 5 6 7 7 8 9 10 11 12 13 14 14 15 16 17 18 19 20];
y=[1 2 5 3 4 8 6 5 8 5 8 6 85 85 66 44 55 66 88 77 99 88 55 66];
xi=[0 5 10 15 20];
dup = find(diff([eps x]) == 0); % Find Duplicated ‘x’ Values
x(dup) = x(dup)+1E-8; % Add ‘sqrt(eps)’ To Duplicated Values
yi = interp1(x, y, xi, 'linear', 'extrap'); % Interploate
yi =
1 6 85 88 66
If you have more than one repeated consecutive ‘x’ value, this gets a bit more involved, but the same approach applies.
  2 件のコメント
KFrenkie
KFrenkie 2016 年 2 月 12 日
編集済み: KFrenkie 2016 年 2 月 12 日
Ok!
But now I stumble on a second problem. The function does not interpolate on NaN values, while timeseries with resample does. Is this also possible?
Now it gives me the following:
Green: Raw dataset of the oxygen uptake with outliers deleted
red: The procedure you provided
I used the function from the file-exchange inpaint_nans once, is this applicable or do you advice another way?
Greetings
Star Strider
Star Strider 2016 年 2 月 12 日
It can interpolate with NaN values. The trick is to create a continuous ‘xq’ (query) vector, then delete the entire row (or column) that contains the NaN values, and interpolate (and extrapolate if the NaN is at the end).
Example code:
M = [1:15; 2 8 7 6 NaN 8 4 9 7 2 NaN 7 1 3 5]'; % Original Data
Mn = M(~isnan(M(:,2)),:); % Delete Rows With ‘NaN’
xq = 1:max(M(:,1)); % Query Vector
yq = interp1(Mn(:,1), Mn(:,2), xq, 'linear', 'extrap');
figure(1)
plot(M(:,1), M(:,2), '-bp', 'LineWidth',1.5)
hold on
plot(xq, yq, '--+r', 'LineWidth',1)
hold off
grid
legend('Original Data', 'Interpolated Data')

サインインしてコメントする。

その他の回答 (1 件)

KFrenkie
KFrenkie 2016 年 2 月 12 日
編集済み: Walter Roberson 2016 年 2 月 13 日
Hmm.. Might have solved the problem. Can somebody comfirm my next try?
ts1 = timeseries(handles.OXY.VO2,handles.OXY.time);
time2=0:10:1110
res_ts=resample(ts1,time2,'zoh');
However, I don't know if "zero-order hold" is the right decision?

カテゴリ

Help Center および File ExchangeTime Series についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by