ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

decimate

間引き — サンプルレートの低減

構文

  • y = decimate(x,r)
  • y = decimate(x,r,n)
  • y = decimate(x,r,'fir')
  • y = decimate(x,r,n,'fir')

説明

間引きでは、データ列の元のサンプルレートが低減されます。これは内挿の逆の操作です。decimate ローパスは、入力をフィルター処理してエイリアシングから保護し、結果をダウンサンプリングします。

y = decimate(x,r) は、入力信号 x のサンプルレートを r の係数分低減させます。間引きされたベクトル yr の係数分短くなります。つまり、length(y) = ceil(length(x)/r) となります。既定では、decimate は次数 8 のローパス チェビシェフ I 型 IIR フィルターを使用します。

y = decimate(x,r,n) では、次数 n のチェビシェフ フィルターが使用されます。13 次を超える次数は数値的に不安定となるため推奨されません。このような場合、この関数は警告を表示します。

y = decimate(x,r,'fir') では、ハミング ウィンドウのウィンドウ法で設計された FIR フィルターが使用されます。フィルターの次数は 30 です。

y = decimate(x,r,n,'fir') では、次数 n の FIR フィルターが使用されます。

    メモ:   r が 13 より大きい場合により良好な結果を得るには、r を小さな係数に分割し、decimate を複数回呼び出します。

入力引数

すべて折りたたむ

x — 入力信号ベクトル

入力信号。ベクトルとして指定。

データ型: double

r — 間引き係数正の整数スカラー

間引き係数。正の整数スカラーとして指定。

データ型: double

n — フィルター次数正の整数スカラー

フィルター次数。正の整数スカラーとして指定。IIR フィルターを使用する場合、13 より大きい値は避けてください。結果が信頼できない場合があるためです。

データ型: double

出力引数

すべて折りたたむ

y — 間引き後の信号ベクトル

ベクトルとして返される間引き後の信号。

データ型: double

すべて折りたたむ

信号の間引き

4 kHz でサンプリングされた正弦波信号を作成します。4 の係数で信号を間引きます。

t = 0:.00025:1;
x = sin(2*pi*30*t) + sin(2*pi*60*t);
y = decimate(x,4);

元の信号と間引き後の信号をプロットします。

subplot 211
stem(0:120,x(1:121),'filled','markersize',3)
grid on
xlabel 'Sample number',ylabel 'Original'
subplot 212
stem(0:30,y(1:31),'filled','markersize',3)
grid on
xlabel 'Sample number',ylabel 'Decimated'

チェビシェフ フィルターを使用した信号の間引き

2 つの正弦波を使用して信号を作成します。次数 5 のチェビシェフ IIR フィルターを使用して、13 の係数で信号を間引きします。元の信号と間引き後の信号をプロットします。

r = 13;
n = 16:365;
lx = length(n);
x = sin(2*pi*n/153) + cos(2*pi*n/127);

plot(0:lx-1,x,'o')
hold on
y = decimate(x,r,5);
stem(lx-1:-r:0,fliplr(y),'ro','filled','markersize',4)

legend('Original','Decimated','Location','south')
xlabel('Sample number')
ylabel('Signal')

元の信号と間引き後の信号は、"最後の" 要素が一致します。

FIR フィルターを使用した信号の間引き

2 つの正弦波を使用して信号を作成します。次数 82 の FIR フィルターを使用して、13 の係数で信号を間引きします。元の信号と間引き後の信号をプロットします。

r = 13;
n = 16:365;
lx = length(n);
x = sin(2*pi*n/153) + cos(2*pi*n/127);

plot(0:lx-1,x,'o')
hold on
y = decimate(x,r,82,'fir');
stem(0:r:lx-1,y,'ro','filled','markersize',4)

legend('Original','Decimated','Location','south')
xlabel('Sample number')
ylabel('Signal')

元の信号と間引き後の信号は、"最初の" 要素が一致します。

詳細

すべて折りたたむ

アルゴリズム

decimate は、参考文献 [1] の間引きアルゴリズム 8.2 および 8.3 を使用します。

  1. decimate はローパス フィルターを作成します。既定では、cheby1 を使用してチェビシェフ I 型フィルターが設計されます。このフィルターは、正規化されたカットオフ周波数 0.8/r と通過帯域リップル 0.05 dB をもちます。伝達関数の作成に必要なたたみ込みによる丸め誤差が蓄積されているために、指定したフィルター次数により、通過帯域の歪みが生じる場合があります。歪みにより、カットオフ周波数の振幅応答がリップルと 10–6 以上ずれる場合、フィルター次数は自動的に低く設定されます。

    'fir' オプションを指定した場合、decimatefir1 を使用して、カットオフ周波数 1/r をもつローパス FIR フィルターを設計します。

  2. FIR フィルターを使用する場合、decimate は入力データ列を一方向にのみフィルター処理します。これはメモリの消費を節約するため、長いデータ列の処理に有効です。IIR フィルターでは、decimatefiltfilt を使用して順方向と逆方向にフィルターを適用し、位相歪みを除去します。これにより、フィルター次数が実質的に 2 倍になります。いずれの場合も、この関数は、端点の条件の一致を確認して、信号の両端における過渡状態の影響を最小限にします。

  3. 最後に、decimate は、フィルター処理後のデータ内から r 個ごとに点を選択し、データをリサンプリングします。リサンプリングされたデータ列では、IIR フィルターが使用された場合は y(end)x(end) に一致し、FIR フィルターが使用された場合は y(1)x(1) に一致します。

参照

[1] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, chap. 8.

この情報は役に立ちましたか?