Main Content

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

fir2

周波数サンプリングベースの FIR フィルターの設計

説明

b = fir2(n,f,m) は、ベクトル f および m で指定された周波数振幅特性をもつ n 次の FIR フィルターを返します。関数が目的の周波数応答を高密度グリッドに線形内挿し、次に逆フーリエ変換とハミング ウィンドウを使用してフィルター係数を入手します。

b = fir2(n,f,m,npt,lap) では、内挿グリッド内の点の数 npt と周波数応答のステップを指定する重複した周波数点の周囲に fir2 が挿入する領域の長さ lap を指定します。

b = fir2(___,window) では、前の構文の任意の入力引数に加えて設計に使用するウィンドウ ベクトルを指定します。

メモ: fir1 は、ウィンドウベースの標準的なローパス、バンドパス、ハイパス、バンドストップおよびマルチバンド構成に使用します。

すべて折りたたむ

MAT ファイル chirp を読み込みます。ファイルには、周波数 Fs = 8192 Hz でサンプリングされた信号 y が含まれています。信号のパワーの大部分は Fs/4 = 2048 Hz (ナイキスト周波数の半分) を超えています。ランダム ノイズを信号に追加します。

load chirp
y = y + randn(size(y))/25;
t = (0:length(y)-1)/Fs;

Fs/4 より低い信号成分を減衰させる 34 次の FIR ハイパス フィルターを設計します。正規化されたカットオフ周波数 0.48 を指定します。この値は約 1966 Hz に相当します。フィルターの周波数応答を可視化します。

f = [0 0.48 0.48 1];
mhi = [0 0 1 1];
bhi = fir2(34,f,mhi);

freqz(bhi,1,[],Fs)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (Hz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

チャープ信号をフィルター処理します。フィルター処理前後の信号をプロットします。

outhi = filter(bhi,1,y);

figure
subplot(2,1,1)
plot(t,y)
title('Original Signal')
ylim([-1.2 1.2])

subplot(2,1,2)
plot(t,outhi)
title('Highpass Filtered Signal')
xlabel('Time (s)')
ylim([-1.2 1.2])

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Highpass Filtered Signal, xlabel Time (s) contains an object of type line.

フィルターをハイパスからローパスに変更します。使用する次数とカットオフは同じです。信号を再度フィルター処理します。結果はほとんどがノイズです。

mlo = [1 1 0 0];
blo = fir2(34,f,mlo);
outlo = filter(blo,1,y);

subplot(2,1,1)
plot(t,y)
title('Original Signal')
ylim([-1.2 1.2])

subplot(2,1,2)
plot(t,outlo)
title('Lowpass Filtered Signal')
xlabel('Time (s)')
ylim([-1.2 1.2])

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Lowpass Filtered Signal, xlabel Time (s) contains an object of type line.

0.6π ラジアン/サンプルの正規化カットオフ周波数をもつ 30 次ローパス フィルターを設計します。理想的な周波数応答と実際の周波数応答を重ね合わせてプロットします。

f = [0 0.6 0.6 1];
m = [1 1 0 0];

b1 = fir2(30,f,m);
[h1,w] = freqz(b1,1);

plot(f,m,w/pi,abs(h1))
xlabel('\omega / \pi')
lgs = {'Ideal','fir2 default'};
legend(lgs)

Figure contains an axes object. The axes object with xlabel omega blank / blank pi contains 2 objects of type line. These objects represent Ideal, fir2 default.

64 点の内挿グリッドを使用してフィルターを再設計します。

b2 = fir2(30,f,m,64);
h2 = freqz(b2,1);

hold on
plot(w/pi,abs(h2))
lgs{3} = 'npt = 64';
legend(lgs)

Figure contains an axes object. The axes object with xlabel omega blank / blank pi contains 3 objects of type line. These objects represent Ideal, fir2 default, npt = 64.

64 点の内挿グリッドとカットオフ周波数の周囲の 13 点の区間を使用してフィルターを再設計します。

b3 = fir2(30,f,m,64,13);
h3 = freqz(b3,1);

plot(w/pi,abs(h3))
lgs{4} = 'lap = 13';
legend(lgs)

Figure contains an axes object. The axes object with xlabel omega blank / blank pi contains 4 objects of type line. These objects represent Ideal, fir2 default, npt = 64, lap = 13.

次の周波数応答で FIR フィルターを設計します。

  • 0 と 0.18π ラジアン/サンプルの間の正弦波。

F1 = 0:0.01:0.18;
A1 = 0.5+sin(2*pi*7.5*F1)/4;
  • 0.2π ラジアン/サンプルと 0.78π ラジアン/サンプルの間の区分的線形セクション。

F2 = [0.2 0.38 0.4 0.55 0.562 0.585 0.6 0.78];
A2 = [0.5 2.3 1 1 -0.2 -0.2 1 1];
  • 0.79π ラジアン/サンプルとナイキスト周波数の間の 2 次セクション。

F3 = 0.79:0.01:1;
A3 = 0.2+18*(1-F3).^2;

ハミング ウィンドウを使用してフィルターを設計します。フィルター次数を 50 に指定します。

N = 50;

FreqVect = [F1 F2 F3];
AmplVect = [A1 A2 A3];

ham = fir2(N,FreqVect,AmplVect);

形状パラメーターが 3 のカイザー ウィンドウを使用して計算を繰り返します。

kai = fir2(N,FreqVect,AmplVect,kaiser(N+1,3));

関数 designfilt を使用してフィルターを再設計します。既定では designfilt は箱型ウィンドウを使用します。フィルターのゼロ位相応答を 1024 点で計算します。

d = designfilt('arbmagfir','FilterOrder',N, ...
    'Frequencies',FreqVect,'Amplitudes',AmplVect);

[zd,wd] = zerophase(d,1024);

3 つのフィルターのゼロ位相応答を表示します。理想的な応答を重ね合わせます。

zerophase(ham,1)
hold on
zerophase(kai,1)
plot(wd/pi,zd)
plot(FreqVect,AmplVect,'k:')
legend('Hamming','Kaiser','designfilt','ideal')

Figure contains an axes object. The axes object with title Zero-Phase Response, xlabel Normalized Frequency ( times blank pi blank rad/sample), ylabel Amplitude contains 4 objects of type line. These objects represent Hamming, Kaiser, designfilt, ideal.

入力引数

すべて折りたたむ

フィルター次数。整数スカラーで指定します。

ナイキスト周波数に通過帯域をもつ構成に対し、fir2 は常に偶数の次数を使用します。これらの構成のいずれかに奇数の値 n を指定した場合、fir2n を 1 だけ増やします。

データ型: double

周波数-振幅特性。同じ長さのベクトルで指定します。

  • f は、0 ~ 1 の範囲の周波数点を表すベクトルで、1 はナイキスト周波数に対応します。f の最初の点は 0 で、最後の点は 1 でなければなりません。f は増加する順に並べ替えられなければなりません。周波数点は重複可能で、周波数応答のステップとして扱われます。

  • m は、f で指定された各点での希望する振幅応答を含むベクトルです。

データ型: double

グリッド点の数。正の整数スカラーとして指定します。nptnpt > n/2、つまり、フィルターの次数の 1/2 より大きくなければなりません。

データ型: double

重複した周波数点の周辺領域の長さ。正の整数スカラーとして指定します。

データ型: double

ウィンドウ。列ベクトルとして指定します。ウィンドウ ベクトルの要素数は n + 1 でなければなりません。window を指定しない場合、fir2 はハミング ウィンドウを使用します。利用可能なウィンドウのリストについては、ウィンドウを参照してください。

ナイキスト周波数に通過帯域をもち、次数が奇数のフィルターを設計しようとする場合、fir2 が自動的に window 長を増やすことはありません。

例: kaiser(n+1,0.5) は、形状パラメーター 0.5 のカイザー ウィンドウを n 次のフィルターで使用するように指定します。

例: hamming(n+1) は、ウィンドウを指定しない場合と同じです。

データ型: double

出力引数

すべて折りたたむ

フィルター係数。長さ n + 1 の行ベクトルとして返されます。係数は Z 変換変数 z の降べきの順に並べ替えられます。

B(z) = b(1) + b(2)z + … + b(n+1)z–n.

アルゴリズム

fir2 は、周波数サンプリングを使用してフィルターを設計します。この関数は、目的の周波数応答を npt の長さをもつ高密度で等間隔なグリッドに線形内挿します。また、fir2 は、反復する f の値の周囲に lap 点の領域を設定して急峻で滑らかな遷移を可能にします。フィルター係数を求めるため、関数は逆高速フーリエ変換をグリッドに適用し、window で乗算します。

参照

[1] Jackson, L. B. Digital Filters and Signal Processing. 3rd Ed. Boston: Kluwer Academic Publishers, 1996.

[2] Mitra, Sanjit K. Digital Signal Processing: A Computer Based Approach. New York: McGraw-Hill, 1998.

拡張機能

バージョン履歴

R2006a より前に導入