ドキュメンテーション

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

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

カイザー ウィンドウを使用してアンチエイリアシングのローパス フィルターを設計します。フィルター バンド エッジをカットオフ周波数 (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

入力引数

すべて折りたたむ

入力信号。ベクトルまたは行列によって指定されます。xin がベクトルの場合は、1 つの信号を表しています。xin が行列の場合は、各列が別々にフィルター処理されます。

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

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

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

出力引数

すべて折りたたむ

ベクトルまたは行列として指定される出力信号。yout がベクトルの場合は、1 つの信号を表しています。yout が行列の場合は、各列が独立した出力になります。出力 yout の長さは ceil(((length(xin)-1)*p+length(h))/q) です。

メモ

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) の長さです。

プログラムではより正確な flops カウントが計算されますが、正確な回数はやはり近似値です。長い信号 x (n) に対しては、この公式がだいたいの場合正確となります。

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

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

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

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

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

メモ:

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

参照

[1] Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983, pp. 88–91.

[2] 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.

拡張機能

R2006a より前に導入