ドキュメンテーション

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

upfirdn

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

構文

yout = upfirdn(xin,h)
yout = upfirdn(xin,h,p)
yout = upfirdn(xin,h,p,q)

説明

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

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

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

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

upfirdn は、処理を高速にするために MEX ファイルとして実装されているので、実際に必要な出力のみが計算されます。FIR フィルターは通常ローパス フィルターで、firpmfir1 などの別の関数を使用して設計しなければなりません。

メモ:

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

yout = upfirdn(xin,h) では、インパルス応答 h をもつ FIR フィルターで入力信号 xin がフィルター処理されます。xin が行ベクトルかまたは列ベクトルの場合は、1 つの信号を表しています。xin が行列の場合は、各列が別々にフィルター処理されます。h が行ベクトルまたは列ベクトルの場合は、1 つの FIR フィルターを表しています。h が行列の場合、各列は別々の独立した FIR インパルス応答シーケンスを表しています。yout が、1 つの行ベクトルまたは列ベクトルの場合、1 つの信号を表しています。yout が行列の場合は、各列が独立した出力になります。この構文では、アップサンプリングとダウンサンプリングは実行されません。

yout = upfirdn(xin,h,p) では、整数のアップサンプリング係数 p が指定されます。ここで、p の既定値は 1 です。

yout = upfirdn(xin,h,p,q) では、整数のダウンサンプリング係数 q が指定されます。ここで、q の既定値は 1 です。出力の長さ yout は、ceil(((length(xin)-1)*p+length(h))/q) となります。

メモ:

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

すべて折りたたむ

1 kHz の正弦波のサンプリング レートを 147/160 の比率で変更します。この比率を使用することで、48 kHz (DAT レート) が 44.1 kHz (CD サンプリング レート) に変換されます。

Fs = 48e3;                   % Original sampling frequency-48kHz
L = 147;                     % Interpolation/decimation factors
M = 160;
N = 24*L;
h = fir1(N-1,1/M,kaiser(N,7.8562));
h = L*h;                     % Passband gain is L

n = 0:10239;                 % 10240 samples, 0.213 seconds long
x = sin(2*pi*1e3/Fs*n);      % Original signal
y = upfirdn(x,h,L,M);        % 9430 samples, still 0.213 seconds

元の信号の最初のミリ秒をプロットし、リサンプリングされたバージョンをそれに重ね合わせます。

stem(n(1:49)/Fs,x(1:49))
hold on 
stem(n(2:45)/(Fs*L/M),y(13:56),'*')
hold off
xlabel('Time (s)')
ylabel('Signal')
legend('Original','Resampled')

ヒント

通常、入力 xin とフィルター h はベクトルで、1 つの出力信号のみが作成されます。ただし、これらの引数が配列の場合は、各列が別々の信号、または、フィルターとして扱われます。有効な組み合わせは、次のとおりです。

  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) に対しては、この公式がだいたいの場合正確となります。

参照

[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 より前に導入