Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

resample

均一または不均一なデータを新しい固定レートでリサンプリング

説明

y = resample(x,p,q) は、元のサンプル レートの p/q 倍で入力シーケンス x をリサンプリングします。resample は FIR アンチエイリアシング ローパス フィルターx に適用し、フィルターによって生じる遅延を補正します。関数はサイズが 1 より大きい最初の配列次元に沿って動作します。

y = resample(x,p,q,n) は、2 × n × max(p,q) 次のアンチエイリアシング フィルターを使用します。

y = resample(x,p,q,n,beta) では、ローパス フィルターの設計に使用するカイザー ウィンドウの形状パラメーターを指定します。

y = resample(x,p,q,b) は、b で指定したフィルター係数を使用して x をフィルター処理します。

[y,b] = resample(x,p,q,___) は、リサンプリングの際に x に適用されるフィルターの係数も返します。

[yTT,b] = resample(xTT,p,q,___) は、MATLAB® timetable xTT の等間隔サンプリング データを元のサンプルレートの p/q 倍でリサンプリングし、timetable yTT を返します。追加の引数 nbeta、または b を指定します。

y = resample(x,tx) は、ベクトル tx で指定した時点でサンプリングされた信号の値 x をリサンプリングします。この関数は、tx と同じ端点とサンプル数をもつ、間隔が均一な時点のベクトルに x を線形内挿します。NaN は欠損データとして扱われ、無視されます。

y = resample(x,tx,fs) は、ポリフェーズ アンチエイリアシング フィルターを使用し、fs で指定した一定のサンプルレートで信号をリサンプリングします。

y = resample(x,tx,fs,p,q) は、入力信号を (p/q)/fs のサンプル間隔で中間等間隔グリッドに内挿します。この関数は、次に p によってアップサンプリングするためおよび q によってダウンサンプリングするために結果をフィルター処理します。これにより fs の最終サンプルレートが得られます。最良の結果を得るには、fs × q/p が少なくとも x の最も高い周波数成分の 2 倍の大きさであるようにします。

y = resample(x,tx,___,method) は、内挿法を、このグループの前の構文の任意の引数とともに指定します。内挿法は 'linear''pchip' または 'spline' のいずれかです。

[y,ty] = resample(x,tx,___) は、リサンプリングされた信号に対応する時点を ty に返します。

[y,ty,b] = resample(x,tx,___) は、アンチエイリアシング フィルターの係数を b に返します。

yTT = resample(xTT) は、xTT の不等間隔サンプリング データをリサンプリングし、等間隔サンプリング データを返します。yTT のエンドポイントとサンプル数は xTT と同じです。

[yTT,b] = resample(xTT,___) は、xTT の不等間隔サンプリング データをリサンプリングし、b のアンチエイリアシング フィルターの係数も返します。入力 xtx と同じ引数オプションを指定できます。

[___] = resample(___,'Dimension',dim) は次元 dim に沿って入力をリサンプリングします。

すべて折りたたむ

単純な線形シーケンスを元のサンプルレート 10 Hz の 3/2 倍でリサンプリングします。同じ Figure 内で元の信号とリサンプリングされた信号をプロットします。

fs = 10;
t1 = 0:1/fs:1;
x = t1;
y = resample(x,3,2);
t2 = (0:(length(y)-1))*2/(3*fs);

plot(t1,x,'*',t2,y,'o')
xlabel('Time (s)')
ylabel('Signal')
legend('Original','Resampled', ...
    'Location','NorthWest')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Resampled.

フィルター処理の際、resample は、この関数に与えられたサンプルの範囲外では、入力シーケンス x をゼロと見なします。x の両端でゼロから大きく逸脱すると、y の値が予期しないものになることがあります。

非ゼロの端点をもつ三角形のシーケンスとそれを垂直シフトしたシーケンスをリサンプリングして、これらの逸脱を表示します。

x = [1:10 9:-1:1;
    10:-1:1 2:10]';
y = resample(x,3,2);

subplot(2,1,1)
plot(1:19,x(:,1),'*',(0:28)*2/3 + 1,y(:,1),'o')
title('Edge Effects Not Noticeable')
legend('Original','Resampled', ...
    'Location','South')

subplot(2,1,2)
plot(1:19,x(:,2),'*',(0:28)*2/3 + 1,y(:,2),'o')
title('Edge Effects Noticeable')
legend('Original','Resampled', ...
    'Location','North')

Figure contains 2 axes objects. Axes object 1 with title Edge Effects Not Noticeable contains 2 objects of type line. These objects represent Original, Resampled. Axes object 2 with title Edge Effects Noticeable contains 2 objects of type line. These objects represent Original, Resampled.

正弦波信号を作成します。16 サンプルといった、信号のちょうど 1 周期に対応するサンプルレートを指定します。信号のステム プロットを描画します。サンプル アンド ホールドを可視化するために階段状グラフを重ね合わせます。

fs = 16;
t = 0:1/fs:1-1/fs;

x = 0.75*sin(2*pi*t);

stem(t,x)
hold on
stairs(t,x)
hold off

Figure contains an axes object. The axes object contains 2 objects of type stem, stair.

resample を使用して信号を係数 4 でアップサンプリングします。既定の設定を使用します。結果を元の信号とともにプロットします。

ups = 4;
dns = 1;

fu = fs*ups;
tu = 0:1/fu:1-1/fu;

y = resample(x,ups,dns);

stem(tu,y)
hold on
stairs(t,x)
hold off
legend('Resampled','Original')

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. These objects represent Resampled, Original.

計算を繰り返します。アンチエイリアシング フィルターの次数が 2×1×4=8 となるように n = 1 を指定します。カイザー ウィンドウに形状パラメーター β=0 を指定します。リサンプリングした信号と同様にフィルターも出力します。

n = 1;
beta = 0;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 8
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 0')

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 1, \beta = 0.

リサンプリングした信号は、ウィンドウの相対的に広いメインローブおよび低いサイドローブ減衰量から生じるエイリアシングの影響を示します。

n は 5 に増やし、β=0 はそのままにします。フィルターの次数が 40 であることを確認します。リサンプリングした信号をプロットします。

n = 5;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 40
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 0')

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 5, \beta = 0.

長いウィンドウはより狭いメインローブをもち、エイリアシングの影響をより適切に減衰させます。さらに信号も減衰させます。

フィルターの次数は 2×5×4=40 のままにして、形状パラメーターを β=20 に増やします。

beta = 20;

y = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 20')

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 5, \beta = 20.

高いサイドローブの減衰量は、適切なリサンプリングにつながります。

フィルター次数を減らして 2×1×4=8 に戻し、β=20 はそのままにします。

n = 1;

[y,b] = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 20')

Figure contains an axes object. The axes object contains 2 objects of type stem, stair. This object represents n = 1, \beta = 20.

メインローブが広い場合、リサンプリング時にかなりのアーチファクトが発生します。

正弦波のサンプルを 60 個生成し、元のレートの 3/2 のレートでリサンプリングします。元の信号とリサンプリングした信号を表示します。

tx = 0:6:360-3;
x = sin(2*pi*tx/120);

ty = 0:4:360-2;
[y,by] = resample(x,3,2);

plot(tx,x,'+-',ty,y,'o:')
legend('original','resampled')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent original, resampled.

アンチエイリアシング フィルターの周波数応答をプロットします。

freqz(by)

Figure contains 2 axes objects. Axes object 1 contains an object of type line. Axes object 2 contains an object of type line.

元のレートの 2/3 のレートで信号をリサンプリングします。元の信号とリサンプリングした信号を表示します。

tz = 0:9:360-9;
[z,bz] = resample(x,2,3);

plot(tx,x,'+-',tz,z,'o:')
legend('original','resampled')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent original, resampled.

新しいローパス フィルターのインパルス応答をプロットします。

impz(bz)

Figure contains an axes object. The axes object with title Impulse Response contains an object of type stem.

ランダムに生成された 10 個の数字のベクトルを 2 つ作成します。ベクトルごとに 1 つの数字を 10 日間毎日記録したとします。MATLAB timetable にデータを保存します。

a = randn(10,1);
b = randn(10,1);

t = days(1:10);

xTT = timetable(t',[a b]);

関数 resample を使用して、サンプルレートを 1 日 1 回から 1 時間に 1 回に増やします。両方のデータセットをプロットします。

yTT = resample(xTT,24,1);

subplot(2,1,1)
plot(xTT.Time,xTT.Var1,'-o')
subplot(2,1,2)
plot(yTT.Time,yTT.Var1,'-o')

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. Axes object 2 contains 2 objects of type line.

ガリレオ・ガリレイが 1610 年に記録したデータを使用して、木星の最も大きい衛星 4 つのうち最外部にあるカリストの軌道周期を求めます。

ガリレオは、この衛星の動きを 1 月 15 日から 6 週間観測しました。曇りの夜には木星を見られなかったため、観測結果にはいくつかの欠落部分があります。観測時間の datetime 配列を生成します。

t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
    41 42 43 44 45]'+1;

yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
    10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
    -10.5 -10.5 -10.0 -8.0]';

obsv = datetime(1610,1,15+t);

1 日あたり 1 回の観測というサンプルレートを使用し、規則的なグリッドにデータをリサンプリングします。過剰適合を防ぐため、中程度のアップサンプリング係数 3 を使用します。

fs = 1;

[y,ty] = resample(yg,t,fs,3,1);

データとリサンプリングされた信号をプロットします。

plot(t,yg,'o',ty,y,'.-')
xlabel('Day')

Figure contains an axes object. The axes object contains 2 objects of type line.

スプライン内挿を使用してこの手順を繰り返し、観測日を表示します。サンプルレートを 1 日の秒数の逆数で表します。

fs = 1/86400;

[ys,tys] = resample(yg,obsv,fs,3,1,'spline');

plot(t,yg,'o')
hold on
plot(ys,'.-')
hold off

ax = gca;
ax.XTick = t(1:9:end);
ax.XTickLabel = char(obsv(1:9:end));

Figure contains an axes object. The axes object contains 2 objects of type line.

等間隔の線形内挿データのピリオドグラム パワー スペクトル推定を計算します。1024 の DFT 長を選択します。信号は軌道周期の逆数で最大になります。

[pxx,f] = periodogram(ys,[],1024,1,'power');
[pk,i0] = max(pxx);

f0 = f(i0);
T0 = 1/f0
T0 = 16.7869
plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')

Figure contains an axes object. The axes object contains 2 objects of type line.

ある人は、うるう年の 2012 年にポンド単位で体重を記録しました。この人は自分の体重を毎日は記録していないため、そのデータは不等間隔です。データを読み込み、測定値を MATLAB timetable に保存します。datetime ベクトルを使用してRowTimesを指定します。

load weight2012.dat

rowTimes = datetime(2012,1,1:366)';
wt = weight2012(:,2);
xTT = timetable(rowTimes,wt);

データをリサンプリングします。結果は、エンドポイントとサンプル数が wt と同じ等間隔サンプリング データを含む timetable になります。

yTT = resample(xTT);

元のデータとリサンプリングされたデータの両方を比較用にプロットします。"x" 軸の範囲を調整して、8 月の測定値のみを表示します。

plot(xTT.rowTimes,xTT.wt,'-o',yTT.Time,yTT.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))
legend('Original','Resampled')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Resampled.

3 次内挿を使用してデータを再度リサンプリングします。

yTTs = resample(xTT,'pchip');

plot(xTT.rowTimes,xTT.wt,'o',yTTs.Time,yTTs.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))

Figure contains an axes object. The axes object contains 2 objects of type line.

ここで、サンプルレートを 1 日 2 回の測定に増やし、スプライン内挿を使用します。結果をプロットします。

fs = 1/86400;
yTTf = resample(xTT,2*fs,'spline');

plot(yTTf.Time,yTTf.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))

Figure contains an axes object. The axes object contains an object of type line.

5 チャネル、100 サンプルの正弦波信号を生成します。時間は列全体で増加し、周波数は下の行に向かって増加します。信号をプロットします。

p = 3;
q = 2;

tx = 0:p:300-p;

x = cos(2*pi*tx./(1:5)'/100);

plot(tx,x,'.:')
title('Original')
ylim([-1.5 1.5])

Figure contains an axes object. The axes object with title Original contains 5 objects of type line.

正弦波を 2 番目の次元に沿って 3/2 だけアップサンプリングします。プロット上のリサンプリングした信号を重ね合わせます。

ty = 0:q:300-q;

y = resample(x,p,q,'Dimension',2);

plot(ty,y,'.:')
title('Upsampled')

Figure contains an axes object. The axes object with title Upsampled contains 5 objects of type line.

時間が 3 番目の次元に沿って進むように、リサンプリングされた信号を形状変更します。

y = permute(y,[1 3 2]);
size(y)
ans = 1×3

     5     1   150

信号をダウンサンプリングして元のレートに戻し、プロットします。

z = resample(y,q,p,'Dimension',3);

plot(tx,squeeze(z),'.:')
title('Downsampled')

Figure contains an axes object. The axes object with title Downsampled contains 5 objects of type line.

入力引数

すべて折りたたむ

入力信号。ベクトル、行列、または N 次元配列として指定します。時間情報が指定された場合、xNaN が含まれることがあります。NaN は欠損データとして扱われ、リサンプリングから除外されます。

例: cos(pi/4*(0:159))+randn(1,160) は単一チャネルの行ベクトル信号です。

例: cos(pi./[4;2]*(0:159))'+randn(160,2) は 2 チャネル信号です。

データ型: double

リサンプリング係数。正の整数として指定します。

データ型: double

近傍項の数。正の整数として指定します。n = 0 の場合、resample は最近傍内挿を実行します。アンチエイリアシング FIR フィルターの長さは n に比例します。n の値を大きくすると計算時間が長くなりますが、精度は高くなります。

データ型: double

カイザー ウィンドウの形状パラメーター。正の実数スカラーとして指定します。beta を大きくすると、アンチエイリアシング フィルターの設計に使用するウィンドウのメインローブが広くなり、ウィンドウのサイドローブの振幅が小さくなります。

データ型: double

FIR フィルター係数。ベクトルとして指定します。既定では、resample は、カイザー ウィンドウを使用した firls でフィルターを設計します。遅延を補正する場合、resampleb の長さが奇数長で、線形位相をもっていると仮定します。詳細については、アンチエイリアシング ローパス フィルターを参照してください。

データ型: double

2 行以上の入力 timetable。timetable として指定します。xTT の各変数が独立した信号として扱われます。timetable の変数が N 次元配列の場合、resample は最初の次元に沿って機能します。

メモ

  • RowTimes は duration ベクトルか、一意かつ有限の値をもつ datetime オブジェクトでなければなりません。無限の時間値は欠損データとして取り扱われ、無視されます。

  • ソートされていない場合、resampleRowTimes を昇順に並べ替えます。

詳細については、timetableを参照してください。

データ型: double

非負の実数ベクトルまたは datetime 配列として指定される時点。tx は単調増加しなければなりませんが、その間隔は均一である必要はありません。tx には NaN または NaT を含めることができます。これらの値は欠損データとして取り扱われ、リサンプリングからは除外されます。tx は入力 x に対してのみ有効です。

データ型: double | datetime

サンプルレート。正のスカラーで指定します。サンプルレートは単位時間あたりのサンプル数です。時間の単位が秒の場合、サンプルレートの単位は Hz です。

データ型: double

内挿法。'linear''pchip' または 'spline' のいずれかで指定します。

  • 'linear' — 線形内挿。

  • 'pchip' — 形状維持区分的 3 次内挿。

  • 'spline' — 節点なしの端点条件を使用したスプライン内挿。

詳細は、interp1 のリファレンス ページを参照してください。

メモ

x がゆるやかに変化しない場合は、'pchip' 内挿法で interp1 を使用することを検討してください。

動作する対象の次元。正の整数スカラーとして指定します。dim が指定されていない場合、resample はサイズが 1 より大きい最初の配列次元に沿って動作します。入力が timetable である場合、dim は 1 でなければなりません。

データ型: single | double

出力引数

すべて折りたたむ

リサンプリングされた信号。ベクトル、行列、または N 次元配列として返されます。x の長さが次元 dim に沿った N であり、pq を指定している場合、y の長さは dim に沿った ⌈N × p/q になります。

FIR フィルター係数。ベクトルとして返されます。

出力瞬時。非負の実数ベクトルとして返されます。ty は入力 x にのみ適用されます。

リサンプリングされた timetable。timetable として返されます。

詳細

すべて折りたたむ

アンチエイリアシング ローパス フィルター

有理因数 p/q で信号をリサンプリングするには、resampleupfirdn を呼び出し、以下のステップを概念的に実行します。

  1. ゼロを挿入して信号を p でアップサンプリングします。

  2. アップサンプリングされた信号に FIR アンチエイリアシング フィルターを適用します。

  3. サンプルを破棄し、フィルター処理された信号を q でダウンサンプリングします。

理想のアンチエイリアシング フィルターは、正規化されたカットオフ周波数 fc = π/max(p,q) ラジアン/サンプルとゲイン p をもちます。アンチエイリアシング フィルターを近似するには、resample でカイザー ウィンドウ法を使用します。

  • フィルター次数は 2 × n × max(p,q) です。n の既定値は 50 です。

  • カイザー ウィンドウは、遷移幅と阻止帯域の減衰量の間のトレードオフを制御する形状パラメーター beta をもちます。beta の既定値は 5 です。

  • フィルター係数を正規化して、ウィンドウの処理ゲインを考慮します。

例として、信号を元のサンプル レートの 3/2 倍にリサンプリングするようにアンチエイリアシング フィルターを設計します。

p = 3;
q = 2;
maxpq = max(p,q);

fc = 1/maxpq;
n = 50;
order = 2*n*maxpq;
beta = 5;

b = fir1(order,fc,kaiser(order+1,beta));
b = p*b/sum(b);
詳細については、等間隔でサンプリングされている信号のリサンプリングを参照してください。

ヒント

  • 関数 isregular を使用して、timetable が等間隔でサンプリングされているかどうかを判定します。

アルゴリズム

resample は、firls を使用して FIR 設計を行い、ウィンドウの処理ゲインを考慮して結果を正規化した後に upfirdn を使用してレート変更を実行します。

拡張機能

バージョン履歴

R2006a より前に導入