interp1 | MATLAB関数1

便利な関数とその使い方

MATLABでよく使う便利な関数とその使い方を説明します。

interp1の使い方

「interp1」は内挿補完を行う関数です。使い時としては、サンプリング周期が異なるデータを扱う際に、一方のサンプリング周期をもう一方のデータに合わせる際に使用します。例えば下記の2データがあるとします。

データ1:0~5secまで0.05sec間隔のデータ

データ2:0.02~4.82secまで0.1sec間隔のデータ

これらのデータの概要を確認するだけであれば、figureにplotすれば完了します。しかし、データ処理でこれら2つのデータの合計値を計算したいとき、2データのサンプリング周期やスタート時間が異なるため計算することができません。しかし、データ2をデータ1のサンプリング周期に内挿処理することでおおよその値を計算することが可能です。こういった場合に便利な関数が「interp1」になります。それでは実際にコードを書いて確認します。

まず初めに、データ1とデータ2を作成します。タイムスタンプを作成し、角周波数をπに設定しました。y1=sin(ωt), y2 = 0.5*sin(ωt)とします。ただし、y1とy2のタイムスタンプは異なります。最終的にy1 + y2の計算を行いたいとします。

MATLAB
time1 = 0:0.05:5;
time2 = 0.02:0.1:4.9;
omega = pi;
y1 = sin(time1*omega);
y2 = 0.5*sin(time2*omega);

ここで早速、y2をy1のタイムスタンプに合わせるためにinterp1を使って内挿補完を実施します。

MATLAB
y2_interp = interp1(time2,y2,time1);

入力引数は3つで、「y2のタイムスタンプ(ここではtime2)」、「y2」、「合わせたいタイムスタンプ(ここではtime1)」です。内挿補完後のデータをy2_interpとしました。

これでy2_interpとy1のタイムスタンプがそろったため足し算を行うことができます。元のy1, y2, y2_interp,y1 + y2_interpをグラフに表示します。

MATLAB
figure(1)
subplot(2,1,1)
hold on;
plot(time1,y1,'k.-')
plot(time2,y2,'bx-')
plot(time1,y2_interp,'ro-')
legend('y1','y2','y2 interp');

subplot(2,1,2)
plot(time1,y1 + y2_interp,'.-')
legend('y1 + y2 interp');

10行目でy1 + y2_interpの計算をしています。配列数が一致しているため、エラーになることはありません。

出力結果は下図のとおりです。

上y1, y2, y2_interp、下y1+y2_interp

上図はy1, y2, y2_interpをplotしたものです。拡大すると下図の通りy1(黒)とy2(青)はサンプリングが異なりますが、y1(黒)とy2_interp(赤)は同じサンプリングになっていることがわかります。

figure y1, y2, y2_interpの拡大

その結果y1とy2_interpが計算でき、y=1.5*sin(ωt)のグラフを描くことができました。

まとめ

今回はinterp1関数について具体的な事例を挙げて説明しました。サンプリングが異なるデータに対する処理は通常かなり面倒ですが、たったの1行でリサンプリングが可能な便利な関数だったと思いますので是非活用してください。今回作成したコードは下記に乗せておきますので適宜ご利用ください。

MATLAB
close all;
clear; 
clc;

time1 = 0:0.05:5;
time2 = 0.02:0.1:4.9;
omega = pi;
y1 = sin(time1*omega);
y2 = 0.5*sin(time2*omega);

y2_interp = interp1(time2,y2,time1);

figure(1)
subplot(2,1,1)
hold on;
plot(time1,y1,'k.-')
plot(time2,y2,'bx-')
plot(time1,y2_interp,'ro-')
legend('y1','y2','y2 interp');

subplot(2,1,2)
plot(time1,y1 + y2_interp,'.-')
legend('y1 + y2 interp');

関連記事

コメント

この記事へのコメントはありません。