ドキュメンテーション

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

designfilt

デジタル フィルターの設計

構文

d = designfilt(resp,Name,Value)
designfilt(d)

説明

d = designfilt(resp,Name,Value) は、応答タイプ respdigitalFilter オブジェクト d を設計します。さらに、Name,Value ペアのセットを使用してフィルターを規定します。どのような仕様セットが使用可能であるかは、応答タイプ resp によって異なり、以下の組み合わせにより構成されます。

  • "周波数制約" は、フィルターにより目的の動作が提示される周波数に相当します。例としては 'PassbandFrequency''CutoffFrequency' があります (名前と値の引数ペアにある一覧を参照)。周波数制約は常に指定しなければなりません。

  • "振幅の制約" では、特定の周波数範囲でのフィルターの動作を記述します。例としては 'PassbandRipple''StopbandAttenuation' があります (名前と値の引数ペアにある一覧を参照)。未指定の振幅の制約には、designfilt により既定値が設定されます。任意振幅の設計では、目的の振幅のベクトルを必ず指定しなければなりません。

  • 'FilterOrder'。一部の設計法では次数を指定できます。それ以外では最小次数設計が生成されます。つまり、指定された制約を満たす最小のフィルターが生成されます。

  • 'DesignMethod' はフィルターの設計に使用されるアルゴリズムです。例としては、制約付き最小二乗 ('cls') とカイザー ウィンドウ処理 ('kaiserwin') があります。仕様セットによっては、選択可能な設計法は複数あります。それ以外の場合、目的の仕様を満たすために利用できる設計法は 1 つのみです。

  • "設計オプション" は、特定の設計法に特有のパラメーターです。例としては、'window' 法の 'Window' と、任意振幅等リップル設計の最適化用の 'Weights' があります (名前と値の引数ペアにある一覧を参照)。指定されなかった設計オプションに対しては、designfilt により既定値が設定されます。

  • 'SampleRate' は、フィルター処理の対象となる周波数です。designfilt の既定サンプルレートは 2 Hz です。この値を使用することで、正規化周波数による処理相当になります。

メモ

コマンド ラインに不完全なまたは矛盾する名前と値のペアのセットを指定すると、フィルター設計アシスタント を開くよう、designfilt により提案されます。このアシスタントは、フィルターの設計を支援し、修正した MATLAB® コードをコマンド ラインに貼り付けます。

正しくない仕様セットを使用してスクリプトまたは関数から designfilt を呼び出すと、designfiltフィルター設計アシスタント を開くリンクのついたエラー メッセージを発行します。このアシスタントは、フィルターの設計を支援し、関数やスクリプト内の欠陥コードをコメント アウトして、修正した MATLAB コードをその次の行に貼り付けます。

  • digitalFilterd を使用して信号をフィルター処理するには、dataOut = filter(d,dataIn) の型の filter を使用します。

  • digitalFilterd の可視化には、fvtool を使用します。

  • d.Coefficients と入力すると digitalFilter d の係数が得られます。IIR フィルターでは、係数は 2 次セクション型として表されます。

  • digitalFilter オブジェクトで使用可能なフィルター処理関数および解析関数のリストについては、digitalFilter を参照してください。

designfilt(d) を使用することにより既存のデジタル フィルター d の編集が可能です。フィルターの仕様が読み込まれた フィルター設計アシスタント が開かれ、その内容を変更できます。この方法によってのみ、digitalFilter オブジェクトは編集できます。それ以外の場合、このオブジェクトのプロパティは読み取り専用です。

すべて折りたたむ

正規化された通過帯域周波数 ラジアン/サンプル、阻止帯域周波数 ラジアン/サンプル、通過帯域リップル 0.5 dB、阻止帯域の減衰量 65 dB をもつ最小次数ローパス FIR フィルターを設計します。フィルターの設計にはカイザー ウィンドウを使用します。振幅応答を可視化します。これを使用して、ランダム データで構成されるベクトルをフィルター処理します。

lpFilt = designfilt('lowpassfir','PassbandFrequency',0.25, ...
         'StopbandFrequency',0.35,'PassbandRipple',0.5, ...
         'StopbandAttenuation',65,'DesignMethod','kaiserwin');
fvtool(lpFilt)

dataIn = rand(1000,1);
dataOut = filter(lpFilt,dataIn);

通過帯域周波数 35 kHz、通過帯域リップル 0.2 dB をもつ、8 次のローパス IIR フィルターを設計します。サンプルレートを 200 kHz に指定します。フィルターの振幅応答を可視化します。これを使用して、1,000 サンプルのランダム信号をフィルター処理します。

lpFilt = designfilt('lowpassiir','FilterOrder',8, ...
         'PassbandFrequency',35e3,'PassbandRipple',0.2, ...
         'SampleRate',200e3);
fvtool(lpFilt)

dataIn = randn(1000,1);
dataOut = filter(lpFilt,dataIn);

フィルター係数を出力して、2 次セクション型として表します。

sos = lpFilt.Coefficients
sos = 4×6

    0.2666    0.5333    0.2666    1.0000   -0.8346    0.9073
    0.1943    0.3886    0.1943    1.0000   -0.9586    0.7403
    0.1012    0.2023    0.1012    1.0000   -1.1912    0.5983
    0.0318    0.0636    0.0318    1.0000   -1.3810    0.5090

正規化された阻止帯域周波数 ラジアン/サンプル、通過帯域周波数 ラジアン/サンプル、通過帯域リップル 0.5 dB、阻止帯域の減衰量 65 dB をもつ最小次数ハイパス FIR フィルターを設計します。フィルターの設計にはカイザー ウィンドウを使用します。振幅応答を可視化します。これを使用して、1,000 サンプルのランダム データをフィルター処理します。

hpFilt = designfilt('highpassfir','StopbandFrequency',0.25, ...
         'PassbandFrequency',0.35,'PassbandRipple',0.5, ...
         'StopbandAttenuation',65,'DesignMethod','kaiserwin');
fvtool(hpFilt)

dataIn = randn(1000,1);
dataOut = filter(hpFilt,dataIn);

通過帯域周波数 75 kHz、通過帯域リップル 0.2 dB をもつ、8 次のハイパス IIR フィルターを設計します。サンプルレートを 200 kHz に指定します。フィルターの振幅応答を可視化します。1,000 サンプルのランダム データで構成されるベクトルにフィルターを適用します。

hpFilt = designfilt('highpassiir','FilterOrder',8, ...
         'PassbandFrequency',75e3,'PassbandRipple',0.2, ...
         'SampleRate',200e3);
fvtool(hpFilt)

dataIn = randn(1000,1);
dataOut = filter(hpFilt,dataIn);

低域カットオフ周波数が 500 Hz で、高域カットオフ周波数が 560 Hz である 20 次のバンドパス FIR フィルターを設計します。サンプルレートは 1500 Hz です。フィルターの振幅応答を可視化します。これを使用して、1,000 サンプルのランダム信号をフィルター処理します。

bpFilt = designfilt('bandpassfir','FilterOrder',20, ...
         'CutoffFrequency1',500,'CutoffFrequency2',560, ...
         'SampleRate',1500);
fvtool(bpFilt)

dataIn = randn(1000,1);
dataOut = filter(bpFilt,dataIn);

フィルター係数を出力します。

b = bpFilt.Coefficients
b = 1×21

   -0.0113    0.0067    0.0125   -0.0445    0.0504    0.0101   -0.1070    0.1407   -0.0464   -0.1127    0.1913   -0.1127   -0.0464    0.1407   -0.1070    0.0101    0.0504   -0.0445    0.0125    0.0067   -0.0113 ⋯

低域側の 3 dB の周波数が 500 Hz で、高域側の 3 dB の周波数が 560 Hz である 20 次のバンドパス IIR フィルターを設計します。サンプルレートは 1500 Hz です。フィルターの周波数応答を可視化します。これを使用して、1,000 サンプルのランダム信号をフィルター処理します。

bpFilt = designfilt('bandpassiir','FilterOrder',20, ...
         'HalfPowerFrequency1',500,'HalfPowerFrequency2',560, ...
         'SampleRate',1500);
fvtool(bpFilt)

dataIn = randn(1000,1);
dataOut = filter(bpFilt,dataIn);

低域カットオフ周波数が 500 Hz で、高域カットオフ周波数が 560 Hz である 20 次のバンドストップ FIR フィルターを設計します。サンプルレートは 1500 Hz です。フィルターの振幅応答を可視化します。これを使用して、1,000 サンプルのランダム データをフィルター処理します。

bsFilt = designfilt('bandstopfir','FilterOrder',20, ...
         'CutoffFrequency1',500,'CutoffFrequency2',560, ...
         'SampleRate',1500);
fvtool(bsFilt)

dataIn = randn(1000,1);
dataOut = filter(bsFilt,dataIn);

低域側の 3 dB の周波数が 500 Hz で、高域側の 3 dB の周波数が 560 Hz である 20 次のバンドストップ IIR フィルターを設計します。サンプルレートは 1500 Hz です。フィルターの振幅応答を可視化します。これを使用して、1,000 サンプルのランダム データをフィルター処理します。

bsFilt = designfilt('bandstopiir','FilterOrder',20, ...
         'HalfPowerFrequency1',500,'HalfPowerFrequency2',560, ...
         'SampleRate',1500);
fvtool(bsFilt)

dataIn = randn(1000,1);
dataOut = filter(bsFilt,dataIn);

7 次の全帯域微分器フィルターを設計します。そのゼロ位相応答を表示します。これを使用して、1,000 サンプルのランダム データで構成されるベクトルをフィルター処理します。

dFilt = designfilt('differentiatorfir','FilterOrder',7);
fvtool(dFilt,'MagnitudeDisplay','Zero-phase')

dataIn = randn(1000,1);
dataOut = filter(dFilt,dataIn);

次数が 18 のヒルベルト変換器を設計します。正規化された遷移幅 ラジアン/サンプルを指定します。フィルターの振幅応答を線形単位で表示します。これを使用して、1,000 サンプルのランダム データで構成されるベクトルをフィルター処理します。

hFilt = designfilt('hilbertfir','FilterOrder',18,'TransitionWidth',0.25);
fvtool(hFilt,'MagnitudeDisplay','magnitude')

dataIn = randn(1000,1);
dataOut = filter(hFilt,dataIn);

1 kHz でサンプリングされた信号があると仮定します。100 Hz と 350 Hz の間の周波数と 400 Hz より大きい周波数を阻止するフィルターを設計します。フィルター次数を 60 に指定します。フィルターの周波数応答を可視化します。これを使用して、1,000 サンプルのランダム信号をフィルター処理します。

mbFilt = designfilt('arbmagfir','FilterOrder',60, ...
         'Frequencies',0:50:500,'Amplitudes',[1 1 1 0 0 0 0 1 1 0 0], ...
         'SampleRate',1000);
fvtool(mbFilt)

dataIn = randn(1000,1);
dataOut = filter(mbFilt,dataIn);

入力引数

すべて折りたたむ

フィルター応答およびタイプ。文字ベクトルで指定します。resp の選択可能な値の 1 つをクリックすると、利用可能な仕様セットの表が展開されます。

 'lowpassfir'

 'lowpassiir'

 'highpassfir'

 'highpassiir'

 'bandpassfir'

 'bandpassiir'

 'bandstopfir'

 'bandstopiir'

 'differentiatorfir'

 'hilbertfir'

 'arbmagfir'

データ型: char

デジタル フィルター。designfilt によって生成される digitalFilter オブジェクトで指定します。この入力を使用して、既存の digitalFilter の仕様を変更します。

名前と値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 ' ' で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前/値のペア引数を、任意の順番で指定できます。

例: ローパス FIR フィルターを指定する場合は、'FilterOrder',20,'CutoffFrequency',0.4 で十分です。

Name,Value ペアのすべての組み合わせが有効なわけではありません。有効な組み合わせは、必要とするフィルター応答と設計の周波数および振幅の制約によって異なります。

フィルター次数

すべて折りたたむ

フィルター次数。'FilterOrder' と正の整数スカラーとで構成されるコンマ区切りペアで指定します。

データ型: double

IIR 設計の分子次数。'NumeratorOrder' と正の整数スカラーとで構成されるコンマ区切りペアで指定します。

データ型: double

IIR 設計の分母次数。'DenominatorOrder' と正の整数スカラーで構成されるコンマ区切りペアで指定します。

データ型: double

周波数制約

すべて折りたたむ

通過帯域周波数。'PassbandFrequency' と正のスカラーとで構成されるコンマ区切りペアで指定します。周波数値はナイキスト範囲内になければなりません。

'PassbandFrequency1' はバンドパスまたはバンドストップ設計の低域側の通過帯域周波数です。

'PassbandFrequency2' はバンドパスまたはバンドストップ設計の高域側の通過帯域周波数です。

データ型: double

阻止帯域周波数。'StopbandFrequency' と正のスカラーで構成されるコンマ区切りペアで指定します。周波数値はナイキスト範囲内になければなりません。

'StopbandFrequency1' はバンドパスまたはバンドストップ設計の低域側の阻止帯域周波数です。

'StopbandFrequency2' はバンドパスまたはバンドストップ設計の高域側の阻止帯域周波数です。

データ型: double

6 dB の周波数。'CutoffFrequency' と正のスカラーで構成されるコンマ区切りペアで指定します。周波数値はナイキスト範囲内になければなりません。

'CutoffFrequency1' はバンドパスまたはバンドストップ設計の低域側の 6 dB の周波数です。

'CutoffFrequency2' はバンドパスまたはバンドストップ設計の高域側の 6 dB の周波数です。

データ型: double

3 dB の周波数。'HalfPowerFrequency' と正のスカラーで構成されるコンマ区切りペアで指定します。周波数値はナイキスト範囲内になければなりません。

'HalfPowerFrequency1' はバンドパスまたはバンドストップ設計の低域側の 3 dB の周波数です。

'HalfPowerFrequency2' はバンドパスまたはバンドストップ設計の高域側の 3 dB の周波数です。

データ型: double

ヒルベルト変換器の通過帯域と阻止帯域の間の遷移領域の幅。'TransitionWidth' と正のスカラーとで構成されるコンマ区切りペアで指定します。

データ型: double

応答周波数。'Frequencies' とベクトルとで構成されるコンマ区切りのペアで指定します。この変数を使用して、任意振幅応答のフィルターにより目的の振幅が得られる周波数をリストします。周波数は単調増加し、ナイキスト範囲内になければなりません。ベクトルの最初の要素は 0 または –fs/2 でなければなりません。ここで、fs はサンプルレートです。また、最後の要素は fs/2 でなければなりません。サンプルレートを指定しない場合は、designfilt は既定値の 2 Hz を使用します。

データ型: double

マルチバンド設計の帯域数。'NumBands' と 10 以下の正の整数スカラーとで構成されるコンマ区切りペアで指定します。

データ型: double

マルチバンド応答周波数。'BandFrequenciesi' と数値ベクトルとで構成されるコンマ区切りのペアとで指定します。'BandFrequenciesi' (i は 1 から NumBands まで変化) は、マルチバンド設計の i 番目の帯域がそこで目的の値 'BandAmplitudesi' をもつ周波数を含むベクトルです。可能な NumBands は最大 10 です。周波数はナイキスト範囲内になければならず、単調増加の順に指定しなければなりません。隣接する周波数帯域はジャンクションで振幅が同じになっていなければなりません。

データ型: double

振幅の制約

すべて折りたたむ

通過帯域リップル。'PassbandRipple' と dB 単位表記の正のスカラーとで構成されるコンマ区切りペアで指定します。

'PassbandRipple1' はバンドストップ設計の低域側の通過帯域リップルです。

'PassbandRipple2' はバンドストップ設計の高域側の通過帯域リップルです。

データ型: double

阻止帯域の減衰量。'StopbandAttenuation' と、dB 単位表記の正のスカラーで構成されるコンマ区切りペアで指定します。

'StopbandAttenuation1' はバンドパス設計の低域側の阻止帯域の減衰量です。

'StopbandAttenuation2' はバンドパス設計の高域側の阻止帯域の減衰量です。

データ型: double

目的とする、任意振幅応答フィルターの応答振幅。'Amplitudes' とベクトルとで構成されるコンマ区切りのペアで指定します。振幅は線形単位で指定します。ベクトルは、'Frequencies' と同じ長さでなければなりません。

データ型: double

マルチバンド応答振幅。'BandAmplitudesi' と数値ベクトルとで構成されるコンマ区切りのペアで指定します。'BandAmplitudesi' (i は 1 から NumBands まで変化) は、マルチバンド設計の i 番目の帯域にある目的の振幅を含むベクトルです。可能な NumBands は最大 10 です。振幅は線形単位で指定します。'BandAmplitudesi' は、'BandFrequenciesi' と同じ長さでなければなりません。隣接する周波数帯域はジャンクションで振幅が同じになっていなければなりません。

データ型: double

設計法

すべて折りたたむ

設計法。'DesignMethod' と文字ベクトルとで構成されるコンマ区切りのペアで指定します。設計法の選択は、指定する周波数と振幅の制約の組み合わせによって決まります。

  • 'butter' はバタワース IIR フィルターを設計します。バタワース フィルターでは、通過帯域で最大フラットであり、滑らかで単調な周波数応答になります。平坦さのために、急峻なロールオフを得ることができません。

  • 'cheby1' はチェビシェフ I 型 IIR フィルターを設計します。チェビシェフ I 型フィルターでは、通過帯域では等リップル、阻止帯域では最大フラットの周波数応答になります。ロールオフが急峻になると共に、この通過帯域リップルも増加します。

  • 'cheby2' はチェビシェフ II 型 IIR フィルターを設計します。チェビシェフ II 型フィルターでは、通過帯域では最大フラット、阻止帯域では等リップルの周波数応答になります。

  • 'cls' は制約付き最小二乗を使用する FIR フィルターを設計します。この設計法では、指定した任意の区分線形関数とフィルターの振幅応答との誤差が最小限になります。同時に、通過帯域のリップルと阻止帯域の減衰量に制約を設定することができます。

  • 'ellip' は楕円 IIR フィルターを設計します。楕円フィルターでは、通過帯域と阻止帯域の両方で等リップルである周波数応答になります。

  • 'equiripple' は、Parks-McClellan アルゴリズムを使用して、等リップル FIR フィルターを設計します。等リップル フィルターでは、すべての帯域のリップル最大振幅を最小限にする周波数応答になります。

  • 'freqsamp' は、周波数応答を一様にサンプリングし、逆フーリエ変換を行う、任意振幅応答の FIR フィルターを設計します。

  • 'kaiserwin' はカイザー ウィンドウ法を使用する FIR フィルターを設計します。この設計法では、理想的なフィルターのインパルス応答を切り捨て、カイザー ウィンドウを使用して切り捨て後の振動を減衰させます。

  • 'ls' では最小二乗を使用した FIR フィルターを設計します。この設計法では、指定した任意の区分線形関数とフィルターの振幅応答との誤差が最小限になります。

  • 'maxflat' は、最大フラット FIR フィルターを設計します。このフィルターでは、通過帯域で最大フラットであり、滑らかで単調な周波数応答になります。

  • 'window' は、最小二乗近似を使用して、フィルター係数を計算し、'Window' によりインパルス応答を平滑化します。

データ型: char

設計法オプション

すべて折りたたむ

ウィンドウ。'Window' と長さ N + 1 のベクトルとで構成されるコンマ区切りのペアで指定します。ここで N はフィルター次数です。'Window' とペアにする相手には、ウィンドウ名か、ウィンドウの生成に使用する関数を指定する関数ハンドルを設定できます。その場合、関数はすべて最初の入力として N + 1 を取らなければなりません。追加の入力は、cell 配列の指定により渡すことができます。既定では、'Window' は、'freqsamp' 設計法では空ベクトルで、'window' 設計法では @hamming です。

利用可能なウィンドウについては、ウィンドウを参照してください。

例: 'Window',hann(N+1)'Window',(1-cos(2*pi*(0:N)'/N))/2 はいずれも次数 N のフィルターと共に使用するハン ウィンドウを指定します。

例: 'Window','hamming' は、必要な次数のハミング ウィンドウを指定します。

例: 'Window',@mywindow では独自のウィンドウ関数が定義できます。

例: 'Window',{@kaiser,0.5} は、形状パラメーター 0.5 を使用して、必要な次数のカイザー ウィンドウを指定します。

データ型: double | char | function_handle | cell

厳密に一致する帯域。'MatchExactly''stopband''passband' または 'both' のいずれかとで構成されるコンマ区切りのペアで指定します。'both' は楕円設計法でのみ利用可能で、その既定の設定です。'stopband''butter' および 'cheby2' 設計法の既定の設定です。'passband''cheby1' の既定の設定です。

データ型: char

通過帯域オフセット。'PassbandOffset' と dB 単位表記の正のスカラーとで構成されるコンマ区切りペアで指定します。'PassbandOffset' は通過帯域のフィルター ゲインを指定します。

例: 'PassbandOffset',0 では、通過帯域の単位ゲインを得るフィルターが設計されます。

例: 'PassbandOffset',2 では 2 dB または 1.259 の通過帯域ゲインを得るフィルターが設計されます。

データ型: double

通過帯域のスケーリング。'ScalePassband' と logical スカラーとで構成されるコンマ区切りペアで指定します。'ScalePassband'true に設定すると、ウィンドウ処理後に、フィルターがゼロ周波数で単位ゲインを得るように、通過帯域がスケーリングされます。

例: 'Window',{@kaiser,0.1},'ScalePassband',true により、ゼロ周波数での振幅応答が厳密に 0 dB になるフィルターを指定できます。これは、'ScalePassband',false を指定した場合には該当しません。検証するには、fvtool を使用してフィルターを可視化し、拡大します。

データ型: logical

ゼロ位相。'ZeroPhase' と logical スカラーとで構成されるコンマ区切りペアで指定します。'ZeroPhase'true に設定すると、設計されるフィルターのゼロ位相応答が常に正になります。これにより、結果に対してスペクトル分解を実行し、その結果から最小位相フィルターを得ることができます。

データ型: logical

通過帯域の最適化の重み。'PassbandWeight' と正のスカラーとで構成されるコンマ区切りペアで指定します。

'PassbandWeight1' はバンドストップ FIR 設計の低域通過帯域の最適化の重みです。

'PassbandWeight2' はバンドストップ FIR 設計の高域通過帯域の最適化の重みです。

データ型: double

阻止帯域の最適化の重み。'StopbandWeight' と正のスカラーとで構成されるコンマ区切りペアで指定します。

'StopbandWeight1' はバンドパス FIR 設計の低域側阻止帯域の最適化の重みです。

'StopbandWeight2' はバンドパス FIR 設計の高域側阻止帯域の最適化の重みです。

データ型: double

最適化の重み。'Weights' と、正のスカラーまたは 'Amplitudes' と同じ長さのベクトルとで構成されるコンマ区切りペアで指定します。

データ型: double

マルチバンドの重み。'BandWeightsi' と、一連の正のスカラーまたはベクトルとで構成されるコンマ区切りペアで指定します。'BandWeightsi' (i は 1 から NumBands まで変化) は、マルチバンド設計の i 番目の帯域の最適化重みを含むスカラーまたはベクトルです。ベクトルとして指定する場合、'BandWeightsi''BandAmplitudesi' と同じ長さでなければなりません。

データ型: double

サンプルレート

すべて折りたたむ

サンプルレート。'SampleRate' と Hz 表記の正のスカラーとで構成されるコンマ区切りペアで指定します。正規化周波数を使用するには、'SampleRate' を 2 に設定するか、単に省略します。

データ型: double

出力引数

すべて折りたたむ

デジタル フィルター。digitalFilter オブジェクトとして返されます。

詳細

すべて折りたたむ

フィルター設計アシスタント

一連の設計パラメーターの指定に記入漏れや矛盾があると、designfilt によりフィルター設計アシスタントの開始が提案されます

(resp の引数の説明内に、利用可能な全応答タイプに対応する有効な仕様セットの一覧があります)。

アシスタントは、designfilt をコマンド ラインまたはスクリプトや関数のいずれで呼び出すかによって動作が異なります。

コマンド ラインでのフィルター設計アシスタント

2 kHz でサンプリングされた信号があると仮定します。650 Hz より高い周波数成分を抑えるローパス FIR フィルターを設計するとします。仕様パラメーターとして、"CutoffFrequency"が適切と考えられます。MATLAB コマンド ラインで、次のように入力します。

Fsamp = 2e3;
Fctff = 650;
dee = designfilt('lowpassfir','CutoffFrequency',Fctff, ...
                 'SampleRate',Fsamp);

何かが間違っているらしく、次のダイアログ ボックスが画面に表示されます。

[はい] をクリックすると、コード生成を提案する新しいダイアログ ボックスが表示されます。前に定義した変数が予想した場所に挿入されています。

提案されたオプションをいくつか調べた後、修正したフィルターをテストします。[OK] をクリックすると、コマンド ラインに以下のコードが表示されます。

dee = designfilt('lowpassfir', 'FilterOrder', 10, ...
                 'CutoffFrequency', Fctff, 'SampleRate', Fsamp);

フィルターの名前を入力すると、ダイアログ ボックス内の情報が再び繰り返されます。

dee
dee = 
 digitalFilter with properties:

    Coefficients: [1x11 double]
   Specifications:
    FrequencyResponse: 'lowpass'
      ImpulseResponse: 'fir'
           SampleRate: 2000
          FilterOrder: 10
      CutoffFrequency: 650
         DesignMethod: 'window'
 Use fvtool to visualize filter
 Use filter function to filter data

fvtool を呼び出し、dee の周波数応答をプロットします。

fvtool(dee)

カットオフ周波数は特に急峻には見えません。周波数の大部分で、応答が 40 dB を超えています。アシスタントには、[振幅の制約] に [阻止帯域の減衰量] を設定するオプションがあります。フィルター名を入力として designfilt を呼び出し、アシスタントを開きます。

designfilt(dee)

[振幅の制約] ドロップダウン メニューをクリックし、[通過帯域リップルと阻止帯域の減衰量] を選択します。設計法が [ウィンドウ] から [FIR 制約付き最小二乗] に変わります。減衰量の既定値は 60 dB で 40 より高くなっています。[OK] をクリックし、結果のフィルターを可視化します。

dee = designfilt('lowpassfir', 'FilterOrder', 10, ...
                 'CutoffFrequency', Fctff, ...
                 'PassbandRipple', 1, 'StopbandAttenuation', 60, ...
                 'SampleRate', Fsamp);
fvtool(dee)

カットオフ周波数は依然として急峻には見えません。減衰量は実際に 60 dB になっていますが、900 Hz を超える周波数に対してのみです。

再びフィルター名を入力に指定して designfilt を呼び出します。

designfilt(dee)

再度アシスタントが表示されます。

受け取る周波数と阻止する周波数の差を縮めるには、フィルターの次数を大きくするか、あるいは [周波数制約][カットオフ (6 dB) 周波数] から [通過帯域周波数と阻止帯域周波数] に変更します。フィルター次数を 10 から 50 に変更すると、急峻なフィルターが得られます。

dee = designfilt('lowpassfir', 'FilterOrder', 50, ...
                 'CutoffFrequency', 650, ...
                 'PassbandRipple', 1, 'StopbandAttenuation', 60, ...
                 'SampleRate', 2000);
fvtool(dee)

実験的に、通過帯域周波数および阻止帯域周波数をそれぞれ 600 Hz および 700 Hz に設定すると、類似のフィルターが得られることがわかります。

dee = designfilt('lowpassfir', 'PassbandFrequency', 600, ...
                 'StopbandFrequency', 700, ...
                 'PassbandRipple', 1, 'StopbandAttenuation', 60, ...
                 'SampleRate', 2000);
fvtool(dee)

スクリプトまたは関数内でのフィルター設計アシスタント

2 kHz でサンプリングされた信号があると仮定します。700 Hz を下回る周波数成分を阻止するハイパス フィルターを設計するとします。信号の位相は対象にしていません。低次のフィルターを使用する必要があります。したがって、IIR フィルターが適切であると思われます。最適なフィルター次数が不明なため、入力として次数をとる関数を記述します。MATLAB エディターを開き、次のファイルを作成します。

function dataOut = hipassfilt(N,dataIn)
hpFilter = designfilt('highpassiir','FilterOrder',N);
dataOut = filter(hpFilter,dataIn);
end

関数をテストするには、周波数が 500 Hz と 800 Hz の 2 つの正弦波で構成される信号を作成し、0.1 秒間のサンプルを生成します。初期推定として 5 次のフィルターが妥当と考えられます。driveHPfilt.m というスクリプトを作成します。

% script driveHPfilt.m
Fsamp = 2e3;
Fsm = 500;
Fbg = 800;
t = 0:1/Fsamp:0.1;
sgin = sin(2*pi*Fsm*t)+sin(2*pi*Fbg*t);
Order = 5;
sgout = hipassfilt(Order,sgin);

コマンド ラインでこのスクリプトを実行すると、エラー メッセージが表示されます。

エラー メッセージから、アシスタントを開いて MATLAB コードを訂正することを選択できます。Click here をクリックすると、フィルター設計アシスタントが表示されます。

問題点がわかります。周波数制約が指定されていません。サンプルレートも設定されていません。試した後、[周波数単位][Hz][通過帯域周波数] に 700 Hz、[入力サンプルレート] に 2000 Hz を指定できることがわかります。[設計法][バタワース] から [チェビシェフ I 型] に変わります。[OK] をクリックすると以下が表示されます。

アシスタントは designfilt が呼び出されたファイルを正しく特定しています。[はい] をクリックして変更を確定します。訂正された MATLAB コードが関数に設定されます。

function dataOut = hipassfilt(N,dataIn)
% hpFilter = designfilt('highpassiir','FilterOrder',N);
hpFilter = designfilt('highpassiir', 'FilterOrder', N, ...
                'PassbandFrequency', 700, 'PassbandRipple', 1, ...
                'SampleRate', 2000);
dataOut = filter(hpFilter,dataIn);
end

これでスクリプトを、フィルター次数値をさまざまに変えて実行できるようになりました。設計の制約によっては、仕様セットを変更できます。

フィルター設計アシスタントの設定

フィルター設計アシスタントが提案されないように designfilt を設定できます。このアクションにより、setpref を使用して設定解除できる MATLAB 設定が指定されます。

  • 毎回アシスタントが提案されるようにする場合は、setpref('dontshowmeagain','filterDesignAssistant',false) を使用します。このコマンドは、アシスタントを無効にした後に、再表示させるようにすることができます。

  • アシスタントを常に無効にする場合は、setpref('dontshowmeagain','filterDesignAssistant',true) を使用します。最初のダイアログ ボックスにある [次回からこのメッセージを表示しない] をクリックすることもできます。

欠陥のある仕様を常に確認なしで訂正するよう designfilt を設定できます。このアクションにより、setpref を使用して設定解除できる MATLAB 設定が指定されます。

  • 確認を求めずに MATLAB コードを訂正するよう designfilt を設定する場合は、setpref('dontshowmeagain','filterDesignAssistantCodeCorrection',false) を使用します。確認ダイアログ ボックスの [常に受け入れる] をクリックすることもできます。

  • 変更を確定した場合にのみ designfilt により MATLAB コードが訂正されるようにする場合は、setpref('dontshowmeagain','filterDesignAssistantCodeCorrection',true) を使用します。このコマンドでは、確認ダイアログ ボックスの [常に受け入れる] のクリックによる作用を取り消すことができます。

トラブルシューティング

不適切な仕様セットの指定に対し、designfilt により、ダイアログ ボックスまたはエラー メッセージ内のリンクを介したフィルター設計アシスタントの提案が行われない場合があります。

  • コード セクション実行の使用時は、それが MATLAB ツールストリップからか Ctrl+Enter キーを押すことによるかにかかわらず、アシスタントは提案されません (詳細は、ファイルのコード セクションへの分割 (MATLAB)を参照)。

  • コードに designfilt への呼び出しが複数あり、その中に正しくないものが含まれる場合、以下の状況ではアシスタントは提案されません。

    • コマンド ラインにコードを貼り付け、Enter キーを押して実行する場合

    • エディターでコードを選択し、F9 キーを押して実行する場合

  • 無名関数を使用して designfilt を実行する場合、アシスタントは提案されません (詳細は、無名関数 (MATLAB)を参照)。たとえば、次の入力ではアシスタントが提案されます。

    d = designfilt('lowpassfir','CutoffFrequency',0.6)
    こちらの入力ではそうなりません。
    myFilterDesigner = @designfilt;
    d = myFilterDesigner('lowpassfir','CutoffFrequency',0.6)

  • eval を使用して designfilt を実行する場合、アシスタントは提案されません。たとえば、次の入力ではアシスタントが提案されます。

    d = designfilt('lowpassfir','CutoffFrequency',0.6)
    こちらの入力ではそうなりません。
    myFilterDesigner = ...
        sprintf('designfilt(''%s'',''CutoffFrequency'',%f)', ...
                            'lowpassfir',0.6);
    d = eval(myFilterDesigner)

フィルター設計アシスタントでは、Java® ソフトウェアと MATLAB デスクトップを実行する必要があります。-nojvm-nodisplay または -nodesktop オプションを指定して MATLAB を実行する場合には、アシスタントはサポートされません。

R2014a で導入