メインコンテンツ

upfirdn

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

説明

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

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

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

すべて折りたたむ

R2026a 以降

アップサンプリングによるイメージング アーチファクトを抑制するために、50 次の FIR ローパス フィルターを設計します。アップサンプリング係数は 5 です。フィルターの群遅延とインパルス応答を計算します。

p = 5;

n = 50;
h = p*fir1(n,1/p);
dl = grpdelay(h,1,1);
freqz(h)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

サンプル レート 30 Hz で 1 秒間の線形スイープ余弦波 (チャープ) 信号を定義します。

Fs = 1e3;
t = single(0:1/Fs:1)';
x = chirp(t,20,t(end),150);

チャープ信号をフィルター処理し、アップサンプリングします。入力信号が単精度であるため、出力も単精度です。

xu = upfirdn(x,h,p);

入力信号と出力信号を比較します。フィルターによって生じた遅延を補正します。対応するリサンプリングした時間ベクトルを生成します。

xu = xu(dl+1:end);
tu = single(0:(length(xu)-1))/(Fs*p);
plot(t,x,".-",MarkerSize=10)
hold on
plot(tu,xu,".-",MarkerSize=4)
hold off
xlim([0 0.5])
xlabel("Time (s)")
legend(["x" "xu"])

Figure contains an axes object. The axes object with xlabel Time (s) contains 2 objects of type line. These objects represent x, xu.

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

Fdat = 48e3;
Fcd = 44.1e3;
[p,q] = rat(Fcd/Fdat)
p = 
147
q = 
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])
xlabel("Time (s)")
hold on

Figure contains an axes object. The axes object with xlabel Time (s) 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/p,1/q);
d = designfilt("lowpassfir", ...
    PassbandFrequency=0.9*f,StopbandFrequency=1.1*f, ...
    PassbandRipple=5,StopbandAttenuation=40, ...
    DesignMethod="kaiserwin",SampleRate=48e3);
h = p*tf(d);

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

y = upfirdn(x,h,p,q);

delay = floor(((filtord(d)-1)/2-(p-1))/p);
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 with xlabel Time (s) contains 2 objects of type stem. These objects represent Original, Resampled.

入力引数

すべて折りたたむ

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

データ型: single | double

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

データ型: single | double

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

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力引数

すべて折りたたむ

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

x または hsingle 型として指定した場合、upfirdn は単精度演算を使用してフィルター処理演算を実行し、y を単精度で返します。それ以外の場合、upfirdndouble 型として y を返します。

メモ

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

ヒント

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

  1. xh が共にベクトル

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

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

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

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

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

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

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

アルゴリズム

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

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

  1. 行列 x 内の入力データに対する、整数 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++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2006a より前に導入

すべて展開する