Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

upfirdn

アップサンプリング、FIR フィルターの適用、ダウンサンプリング

説明

yout = upfirdn(xin,h) では、インパルス応答 h をもつ FIR フィルターを使用して入力信号 xin がフィルター処理されます。この構文では、アップサンプリングとダウンサンプリングは実行されません。

yout = upfirdn(xin,h,p) は整数のアップサンプリング係数 p を指定します。

yout = upfirdn(xin,h,p,q) は、整数のダウンサンプリング係数 q を指定します。

すべて折りたたむ

有理因数変換による信号のサンプル レートを 48 kHz の DAT レートから 44.1 kHz の CD サンプル レートに変更します。関数 rat を使用して、有理因数の分子係数 L と分母係数 M を求めます。

Fdat = 48e3;
Fcd = 44.1e3;
[L,M] = rat(Fcd/Fdat)
L = 147
M = 160

fDAT で 0.25 秒間サンプリングされた 1.5 kHz の正弦波を生成します。信号の最初のミリ秒をプロットします。

t = 0:1/Fdat:0.25-1/Fdat;
x = sin(2*pi*1.5e3*t);
stem(t,x)
xlim([0 0.001])
hold on

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

カイザー ウィンドウを使用してアンチエイリアシングのローパス フィルターを設計します。フィルター バンド エッジをカットオフ周波数 (fDAT/2)×min(1/L,1/M) の 90% と 110% として設定します。5 dB の通過帯域リップルと 40 dB の阻止帯域の減衰量を指定します。通過帯域のゲインを L に設定します。

f = (Fdat/2)*min(1/L,1/M);
d = designfilt('lowpassfir', ...
    'PassbandFrequency',0.9*f,'StopbandFrequency',1.1*f, ...
    'PassbandRipple',5,'StopbandAttenuation',40, ...
    'DesignMethod','kaiserwin','SampleRate',48e3);
h = L*tf(d);

フィルター hupfirdn を使用して正弦波をリサンプリングします。フィルターによって生じた遅延を計算および補正します。対応するリサンプリングした時間ベクトルを生成します。

y = upfirdn(x,h,L,M);

delay = floor(((filtord(d)-1)/2-(L-1))/L);
y = y(delay+1:end);
t_res = (0:(length(y)-1))/Fcd;

プロット上のリサンプリングした信号を重ね合わせます。

stem(t_res,y,'*')
legend('Original','Resampled','Location','southeast')
hold off

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

入力引数

すべて折りたたむ

ベクトルまたは行列として指定される入力信号。xin がベクトルの場合は、1 つの信号を表しています。xin が行列の場合は、各列が別々にフィルター処理されます。詳細については、ヒントを参照してください。

データ型: single | double

フィルターのインパルス応答。ベクトルまたは行列として指定します。h がベクトルの場合は、1 つの FIR フィルターを表しています。h が行列の場合、各列は別々の独立した FIR インパルス応答シーケンスを表しています。詳細については、ヒントを参照してください。

データ型: single | double

アップサンプリング係数。正の整数で指定します。

データ型: single | double

ダウンサンプリング係数。正の整数で指定します。

データ型: single | double

出力引数

すべて折りたたむ

出力信号。ベクトルまたは行列として返されます。yout の各列の長さは ceil(((length(xin)-1)*p+length(h))/q) です。

upfirdn への入力が単精度の場合、関数は yout を単精度で返します。

メモ

upfirdn では畳み込みが行われ、レートが変更されるため、出力信号 yout は入力信号 xin とは異なる長さになります。yout の行数は、xin の行数の約 p/q 倍となります。

ヒント

xinh のサイズの有効な組み合わせは次のとおりです。

  1. xinh が共にベクトル

    入力はフィルターと信号が 1 つずつのため、関数で xinh の畳み込みが行われます。出力信号 yout は、xin が行ベクトルの場合は行ベクトル、その他の場合 yout は列ベクトルとなります。

  2. xin が行列、h がベクトル

    入力は 1 つのフィルターと複数の信号のため、関数では hxin の各列との畳み込みが行われます。結果として得られる yout は、xin と同数の列を持つ行列となります。

  3. xin がベクトルで、h が行列

    入力は複数のフィルターと 1 つの信号のため、関数では h の各列と xin の畳み込みが行われます。結果として得られる yout は、h と同数の列を持つ行列となります。

  4. xinh が、同じ列数をもつ行列

    入力はフィルターと信号が共に複数のため、関数では xinh の対応する列の畳み込みが行われます。結果として得られる yout は、xinh と同数の列をもつ行列となります。

アルゴリズム

upfirdn では、ポリフェーズ内挿構造が使用されます。ポリフェーズ構造での乗算-加算演算の回数は、約 (LhLx – pLx)/q となります。ここで、Lh と Lx は、それぞれ h(n) と x(n) の長さです。長い信号に対しては、この公式がだいたいの場合正確となります。

upfirdn では、以下の 3 つの操作が連続して実行されます。

  1. 行列 xin 内の入力データに対する、整数 p によるアップサンプリング (ゼロの挿入)

  2. ベクトルまたは行列 h で与えられたインパルス応答シーケンスによる、アップサンプリングした信号データの FIR フィルター

  3. 整数 q によるダウンサンプリング (サンプルの間引き)

FIR フィルターは通常ローパス フィルターで、firpmfir1 などの別の関数を使用して設計しなければなりません。

メモ

関数 resample では、firls を使用して FIR 設計が実行された後、upfirdn を使用してレートが変更されます。

参照

[1] Crochiere, R. E. "A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios." Programs for Digital Signal Processing (Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds.). New York: IEEE Press, 1979, Programs 8.2-1–8.2-7.

[2] Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入

すべて展開する