MATLAB ヘルプ センター
均一または不均一なデータを新しい固定レートでリサンプリング
y = resample(x,p,q)
y = resample(x,p,q,n)
y = resample(x,p,q,n,beta)
y = resample(x,p,q,b)
yTT = resample(xTT,p,q,___)
y = resample(x,tx)
y = resample(x,tx,fs)
y = resample(x,tx,fs,p,q)
y = resample(x,tx,___,method)
[y,ty] = resample(x,tx,___)
yTT = resample(xTT,___)
[y,b] = resample(x,p,q,___)
[y,ty,b] = resample(x,tx,___)
[yTT,b] = resample(xTT,___)
[___] = resample(___,Dimension=dim)
y = resample(x,p,q) は、元のサンプル レートの p/q 倍で入力シーケンス x をリサンプリングします。resample は FIR アンチエイリアシング ローパス フィルターを x に適用し、フィルターによって生じる遅延を補正します。関数はサイズが 1 より大きい最初の配列次元に沿って動作します。
y
x
p
q
resample
例
y = resample(x,p,q,n) は、2 × n × max(p,q) 次のアンチエイリアシング フィルターを使用します。
n
y = resample(x,p,q,n,beta) では、ローパス フィルターの設計に使用するカイザー ウィンドウの形状パラメーターを指定します。
beta
y = resample(x,p,q,b) は、b で指定したフィルター係数を使用して x をフィルター処理します。
b
yTT = resample(xTT,p,q,___) は、MATLAB® timetable xTT の等間隔サンプリング データを元のサンプル レートの p/q 倍でリサンプリングし、timetable yTT を返します。追加の引数 n、beta、または b を指定します。
yTT
xTT
y = resample(x,tx) は、ベクトル tx で指定した時点でサンプリングされた信号の値 x をリサンプリングします。この関数は、tx と同じ端点とサンプル数をもつ、間隔が均一な時点のベクトルに x を線形内挿します。NaN は欠損データとして扱われ、無視されます。
tx
NaN
y = resample(x,tx,fs) は、ポリフェーズ アンチエイリアシング フィルターを使用し、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" のいずれかです。
method
"linear"
"pchip"
"spline"
[y,ty] = resample(x,tx,___) は、リサンプリングされた信号に対応する時点を ty に返します。
ty
yTT = resample(xTT,___) は、xTT の不等間隔サンプリング データをリサンプリングし、等間隔サンプリング データを返します。yTT のエンドポイントとサンプル数は xTT と同じです。入力 x、tx と同じ引数オプションを指定できます。
[y,b] = resample(x,p,q,___) は、リサンプリングの際に x に適用されるフィルターの係数も返します。
[y,ty,b] = resample(x,tx,___) は、アンチエイリアシング フィルターの係数を b に返します。
[yTT,b] = resample(xTT,___) は、xTT の timetable データをリサンプリングし、b のアンチエイリアス フィルターの係数も返します。
[___] = resample(___,Dimension=dim) は次元 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')
フィルター処理の際、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')
正弦波信号を作成します。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
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")
計算を繰り返します。アンチエイリアシング フィルターの次数が 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")
リサンプリングした信号は、ウィンドウの相対的に広いメインローブおよび低いサイドローブ減衰量から生じるエイリアシングの影響を示します。
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")
長いウィンドウはより狭いメインローブをもち、エイリアシングの影響をより適切に減衰させます。さらに信号も減衰させます。
フィルターの次数は 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")
高いサイドローブの減衰量は、適切なリサンプリングにつながります。
フィルター次数を減らして 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")
メインローブが広い場合、リサンプリング時にかなりのアーチファクトが発生します。
正弦波のサンプルを 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')
アンチエイリアシング フィルターの周波数応答をプロットします。
freqz(by)
元のレートの 2/3 のレートで信号をリサンプリングします。元の信号とリサンプリングした信号を表示します。
tz = 0:9:360-9; [z,bz] = resample(x,2,3); plot(tx,x,'+-',tz,z,'o:') legend('original','resampled')
新しいローパス フィルターのインパルス応答をプロットします。
impz(bz)
ランダムに生成された 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')
ガリレオ・ガリレイが 1610 年に記録したデータを使用して、木星の最も大きい衛星 4 つのうち最外部にあるカリストの軌道周期を求めます。
ガリレオは、この衛星の動きを 1 月 15 日から 6 週間観測しました。曇りの夜には木星を見られなかったため、観測結果にはいくつかの欠落部分があります。観測時間の datetime 配列を生成します。
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')
スプライン内挿を使用してこの手順を繰り返し、観測日を表示します。サンプル レートを 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));
等間隔の線形内挿データのピリオドグラム パワー スペクトル推定を計算します。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})')
ある人が、うるう年の 2012 年のほぼ毎日、自分の体重をポンド単位で記録しました。欠損サンプルは NaN として入力されています。データを読み込み、測定値を MATLAB timetable に保存します。datetime ベクトルを使用して行時間を指定し、欠損サンプルを削除します。
load weight2012.dat rowTimes = datetime(2012,1,1:366)'; wt = weight2012(:,2); xTT = timetable(rowTimes,wt); xTT(isnan(wt),:) = [];
データをリサンプリングします。結果は、エンドポイントとサンプル数が wt と同じ等間隔サンプリング データを含む timetable になります。
wt
yTT = resample(xTT);
元のデータとリサンプリングされたデータの両方を比較用にプロットします。"x" 軸の範囲を調整して、8 月の測定値のみを表示します。
plot(xTT.rowTimes,xTT.wt,":o",yTT.Time,yTT.wt,"-*") aug = datetime([2012 08 01;2012 08 31]); xlim(aug) legend(["Original" "Resampled"])
3 次内挿を使用してデータを再度リサンプリングします。
yTTs = resample(xTT,"pchip"); plot(xTT.rowTimes,xTT.wt,":o",yTTs.Time,yTTs.wt,"-*") xlim(aug) legend(["Original" "Resampled"])
ここで、サンプル レートを 1 日 2 回の測定に増やし、スプライン内挿を使用します。結果をプロットします。
fs = 1/86400; yTTf = resample(xTT,2*fs,"spline"); plot(xTT.rowTimes,xTT.wt,":o",yTTf.Time,yTTf.wt,'-*') xlim(aug) legend(["Original" "Resampled"])
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])
正弦波を 2 番目の次元に沿って 3/2 だけアップサンプリングします。プロット上のリサンプリングした信号を重ね合わせます。
ty = 0:q:300-q; y = resample(x,p,q,'Dimension',2); plot(ty,y,'.:') title('Upsampled')
時間が 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')
入力信号。ベクトル、行列、または N 次元配列として指定します。時間情報が指定された場合、x に NaN が含まれることがあります。NaN は欠損データとして扱われ、リサンプリングから除外されます。
例: cos(pi/4*(0:159))+randn(1,160) は単一チャネルの行ベクトル信号です。
cos(pi/4*(0:159))+randn(1,160)
例: cos(pi./[4;2]*(0:159))'+randn(160,2) は 2 チャネル信号です。
cos(pi./[4;2]*(0:159))'+randn(160,2)
データ型: single | double
single
double
リサンプリング係数。正の整数として指定します。
近傍項の数。非負の整数として指定します。n = 0 の場合、resample は最近傍内挿を実行します。アンチエイリアシング FIR フィルターの長さは n に比例します。n の値を大きくすると計算時間が長くなりますが、精度は高くなります。
カイザー ウィンドウの形状パラメーター。正の実数スカラーとして指定します。beta を大きくすると、アンチエイリアシング フィルターの設計に使用するウィンドウのメインローブが広くなり、ウィンドウのサイドローブの振幅が小さくなります。
FIR フィルター係数。ベクトルとして指定します。既定では、resample は、カイザー ウィンドウを使用した firls でフィルターを設計します。遅延を補正する場合、resample は b の長さが奇数長で、線形位相をもっていると仮定します。詳細については、アンチエイリアシング ローパス フィルターを参照してください。
firls
timetable
2 行以上の入力 timetable。timetable として指定します。xTT の各変数が独立した信号として扱われます。timetable の変数が N 次元配列の場合、resample は最初の次元に沿って機能します。
メモ
RowTimes は duration ベクトルか、一意かつ有限の値をもつ datetime オブジェクトでなければなりません。無限の時間値は欠損データとして取り扱われ、無視されます。
RowTimes
ソートされていない場合、resample は RowTimes を昇順に並べ替えます。
詳細については、timetableを参照してください。
非負の実数ベクトルまたは datetime 配列として指定される時点。tx は単調増加しなければなりませんが、その間隔は均一である必要はありません。tx には NaN または NaT を含めることができます。これらの値は欠損データとして取り扱われ、リサンプリングからは除外されます。tx は入力 x に対してのみ有効です。
NaT
データ型: single | double | datetime
サンプル レート。正のスカラーで指定します。サンプル レートは単位時間あたりのサンプル数です。時間の単位が秒の場合、サンプル レートの単位は Hz です。
内挿法。"linear"、"pchip" または "spline" のいずれかとして指定します。
"linear" — 線形内挿。
"pchip" — 形状維持区分的 3 次内挿。
"spline" — ノットなしの端点条件を使用したスプライン内挿。
詳細については、interp1 のリファレンス ページを参照してください。
interp1
x がゆるやかに変化しない場合は、"pchip" 内挿法で interp1 を使用することを検討してください。
動作する対象の次元。正の整数スカラーとして指定します。dim が指定されていない場合、resample はサイズが 1 より大きい最初の配列次元に沿って動作します。入力が timetable である場合、dim は 1 でなければなりません。
リサンプリングされた信号。ベクトル、行列、または N 次元配列として返されます。x の長さが次元 dim に沿った N であり、p と q を指定している場合、y の長さは dim に沿った ⌈N × p/q⌉ になります。
FIR フィルター係数。ベクトルとして返されます。
出力瞬時。非負の実数ベクトルとして返されます。ty は入力 x にのみ適用されます。
リサンプリングされた timetable。timetable として返されます。
有理因数 p/q で信号をリサンプリングするには、resample で upfirdn を呼び出し、以下のステップを概念的に実行します。
upfirdn
ゼロを挿入して信号を p でアップサンプリングします。
アップサンプリングされた信号に FIR アンチエイリアシング フィルターを適用します。
サンプルを破棄し、フィルター処理された信号を q でダウンサンプリングします。
理想のアンチエイリアシング フィルターは、正規化されたカットオフ周波数 fc = π/max(p,q) ラジアン/サンプルとゲイン p をもちます。アンチエイリアシング フィルターを近似するには、resample でカイザー ウィンドウ法を使用します。
フィルター次数は 2 × n × max(p,q) です。n の既定値は 10 です。
カイザー ウィンドウは、遷移幅と阻止帯域の減衰量の間のトレードオフを制御する形状パラメーター beta をもちます。beta の既定値は 5 です。
フィルター係数を正規化して、ウィンドウの処理ゲインを考慮します。
例として、信号を元のサンプル レートの 3/2 倍にリサンプリングするようにアンチエイリアシング フィルターを設計します。
p = 3; q = 2; maxpq = max(p,q); fc = 1/maxpq; n = 10; order = 2*n*maxpq; beta = 5; b = fir1(order,fc,kaiser(order+1,beta)); b = p*b/sum(b);
関数 isregular を使用して、timetable が等間隔でサンプリングされているかどうかを判定します。
isregular
resample は、firls を使用して FIR 設計を行い、ウィンドウの処理ゲインを考慮して結果を正規化した後に upfirdn を使用してレート変更を実行します。
すべて展開する
使用上の注意および制限:
関数 resample は、コード生成で timetable 入力をサポートしません。
SIMD 内部パラメーターを使用し、ARM® Cortex®-A 32 ビット/64 ビット プロセッサで動作する最適化コードを生成するには、Embedded Coder® Support Package for AMD SoC Devices をインストールしなければなりません。Xilinx® Zynq® Platform 用のサポート パッケージには ARM クロスコンパイラ ツールチェーンが含まれており、ARM Cortex-A プロセッサへの展開が可能です。MATLAB Support Package for Raspberry Pi® Hardware により、最適化コードを ARM デバイスに直接展開できます。例については、Generate Optimized Code on Raspberry Pi Targetを参照してください。 (R2022b 以降)
ARM アーキテクチャの場合、関数 resample は単精度入力をサポートしません。
timetable 入力はコード生成でサポートされていません。
resample 関数は GPU 配列入力をサポートしますが、次の使用上の注意および制限があります。
"pchip" 内挿法はサポートされていません。
gpuArray を含む入力 timetable はサポートされていません。
gpuArray
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
関数 resample は、コード生成で datetime 配列をサポートします。この機能を使用するには、MATLAB Coder™ が必要です。
関数 resample は単精度入力をサポートします。
関数 resample には、演算の対象となる次元を指定するために使用できる dim 引数があります。dim 引数を指定しない場合、resample はサイズが 1 より大きい最初の配列次元に沿って動作します。出力の次元数は入力と同じです。
decimate | downsample | fillgaps | firls | interp | interp1 | intfilt | kaiser | spline | upfirdn | upsample
decimate
downsample
fillgaps
interp
intfilt
kaiser
spline
upsample
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
ヨーロッパ
アジア太平洋地域
最寄りの営業オフィスへのお問い合わせ