FlexPro サポート > データ解析チュートリアル
更新日: 23/12/06

デジタルフィルターチュートリアル

本チュートリアルでは、FlexPro における FIR フィルターと IIR フィルターの設計について説明します。

信号のサンプルデータ

シグナル解析オブジェクトを使えば、フィルター特性のデモンストレーションとして非常に適した合成信号を生成することができます。挿入 [データ] > シグナル > スイープ周波数コサインを選択します。生成された「シグナル」オブジェクトを右クリックして「プロパティ」を選択したら、スイープ周波数コサイン関数を周波数 1、2番目の周波数 10000 に設定します。「サンプリング」タブを選択して、X 成分を開始値 0、最終値 0.5、値の数 10000 に設定します。

 

IIR フィルター

「シグナル」データセットを選択状態にします。

挿入 [解析] > 解析ウィザードをクリックします。

「フィルタ」カテゴリにある「IIR フィルタ」を選択します。次に、「IIR フィルタ」アイコンを選択したら、「次へ」をクリックします。

解析ウィザードの2つ目のステップには、様々なフィルタタイプとフィルタ特性を選択できるインタラクティブなダイアログが用意されています。解析ウィザードには、プレビューウィンドウに3つのダイアグラムが表示されます。プレビューには、入力信号、フィルタ特性、フィルタされたシグナル、フィルタ係数を使ったときのダイアグラムを表示できます。「振幅応答を表示」オプションを使えば、フィルタ仕様を使用した振幅応答をダイアグラムに表示したり非表示にすることができます。振幅応答は、対数表記で表示することもできます。

フィルタタイプに「ハイパス」を、フィルタ特性に「チェビシェフ」を選択してみましょう。このフィルタを使えば、通過帯域 (passband) にあるリップルを変化させることができます。「正規化周波数を使用」オプションを有効にします。フィルタ仕様の次数を 7 に、正規化されたカットオフ周波数 Fc1 を 0.25 に、パスバンド誤差を 0.2 に指定します。このとき生成されるフィルタ仕様に注目してください。このフィルタのリップルは通過帯域の 0.8 から 1 の範囲、つまり、最大誤差 0.2 の範囲で変化することを示します。リップルを低減すると (次数を減らすと)、リップルの遷移幅が変化するとともに、それに応じてフィルタの急峻さも損なわれます。

逆チェビシェフフィルタを使えば、チェビシェフフィルタとは異なり、阻止帯域 (stopband) 側のリップルを定義できます。「楕円/カウアー」フィルタを使えば、通過帯域と阻止帯域の両方のリップルを定義できることから、より柔軟なフィルタ設計を行うことができます。

IIR の各種フィルタでは、フィルタの固定次数を選択できます。また、仕様を定義することで計算による次数を選択することも可能です。カットオフ周波数には正規化された周波数の代わりに、遷移域の上限と下限を指定できます。さらに、通過帯域 (パスバンド) と阻止帯域 (ストップバンド) の両方の誤差を指定できます。フィルタリングする信号にこれらの誤差の上限と下限を上回ったり下回ったりする帯域範囲を定義することは仕様によりできません。

「次数」に「計算...」を選択し、「正規化周波数を使用」にチェックを入れて、第一遷移に 0.240.26 を指定します。パスバンドとストップバンドの両方の誤差には 0.1 を入力します。2つの誤差を指定する代わりに、通過帯域 (パスバンド) のリップルや阻止帯域 (ストップバンド) の減衰をデシベル単位で指定することもできます。この値は、「モード」の変更に応じて変換されます。

 

解析ウィザードの出力オプション

「次へ」をクリックして、FlexPro の解析ウィザードで自動的に作成されるオブジェクトを表示します。ステップ3では、選択可能な2つのオプション (「結果を表示するダイアグラムと表」と「解析を含むドキュメント」) にチェックを入れて「完了」をクリックします。

7つのオブジェクトが FlexPro のプロジェクトデータベースに生成されます。

「IIRフィルタ」は解析オブジェクトです。フィルタリングを実行するオブジェクトがこれになります。このオブジェクトをダブルクリックすると、オブジェクトが開きます。

「設定」は、ダイアグラム表現で使用する仕様を作成するための公式です。

「振幅応答」は、フィルタの振幅応答を作成するための公式です。この公式もダイアグラム表現で使用します。

「シグナル」ダイアグラムは入力信号を、「IIRフィルタ」ダイアグラムはフィルタリングされた信号又はフィルタの係数を、そして、「設定」ダイアグラムはフィルタ仕様をそれぞれダイアグラムとしてあらわす 2Dダイアグラムオブジェクトです。

「IIRフィルタ」ドキュメントの内容は、生成された3つのダイアグラムです。

「IIRフィルタ」の次数の最大値は 10 に制限されています (※訳注:現行バージョンでは 20)。これは、次数を高くするほど不安定になるからです。従って、次に FIR フィルタ設計を見ることにしましょう。FIR フィルタでは、より高い次数を使用可能で、IIR フィルタに比べてより柔軟な設計を行うことができます。

 

FIR フィルタ

FIR フィルタ設計では、IIR フィルタ設計とは異なり、2種類の計算法を選択することができます。窓関数を使う方法と、FIR 等リップルアルゴリズム (Parks-McClellan 法) によるフィルタ設計です。

 

窓関数を使った FIR フィルタ設計

ここでも、先ほど使用した合成信号を使うことにしましょう。「シグナル」データセットを選択状態にしてください。

挿入 [解析] > 解析ウィザードをクリックします。

「フィルタ」の中にある「FIR フィルタ」カテゴリを選択します。次に、「ウィンドウ法」アイコンをクリックします。「次へ」をクリックします。

「結果」に「フィルタされたシグナル」を選択し、「フィルタタイプ」には「バンドパス」を選択します。設定で「正規化周波数を使用」にチェックを入れます。ウィンドウには、「ハミング」を使用し、カットオフ周波数の Fc1 には 0.1 を、Fc2 には 0.4 を指定します。フィルタ長には 71 を指定します。ここで「完了」をクリックします。

ここで、入力信号「シグナル」と今作成した「FIRフィルタ」オブジェクトを選択状態にして、「ライン」ダイアグラムを作成すると、2つの信号の位相にずれがあること (phase shift) を確認できます。

ウィザードの2番目のページで「位相補正を伴うフィルタされたシグナル」を選択すれば、この位相のずれを取り除くことができます。FIR フィルタには、フィルタ長と信号のサンプリングレートによってのみ変化する一定の位相シフトが存在します。位相補正は、IIR フィルタの設計でも行うことができますが、この場合の位相補正は、信号を2回フィルタリングするとき、すなわち1回は順方向、もう1回は逆方向でフィルタリングするときに行われます。

ここで、もういちど「シグナル」を選択状態にして、ウィザードに戻って窓関数を使用したフィルタ設計をおこないます。「ウィンドウ」のタイプを変えると、減衰の仕方も変わります。「振幅応答を表示」オプションが有効になっている場合、「一般化ハミング」ウィンドウを除いて、ダイアグラムにはフィルタ仕様とともに阻止帯域の減衰が水平線で描画されます。この減衰は、矩形、バートレット、ハミング、ハニング、ブラックマンのウィンドウタイプで一定となります(ヘルプの「ウィンドウ法」参照)。「一般化ハミング」ウィンドウの阻止帯域の減衰は、0 から 1 の範囲で変化する「アルファ」パラメータによって変わります。最も柔軟なウィンドウは、「カイザー」と「チェビシェフ」です。これらのウィンドウでは、3つのパラメータ、すなわち、フィルタ長、減衰、遷移のうち、いずれか2つの値を指定すれば、それらを元に第3のパラメータの値が計算されるからです。

ウィザードの2番目のページで、「結果」に「フィルタ係数」を選択してください。一番下のダイアグラムの内容がフィルタされたシグナルから (フィルタ係数に対応する) インパルス応答に変わります。バンドパスを作成するには、ウィンドウに「カイザー」を選択し、カットオフ周波数 Fc1 に 0.1 を、Fc2 に 0.4 を指定します。「計算」には「フィルタ長」を選択します。「減衰」に 20 dB を、「遷移」に 0.01 を指定してフィルタ長の値を計算で求めます。この場合は、フィルタ長の値として 94 が得られます。

次に、FIR 等リップル法を使用して上記のフィルタ特性を持つフィルタを設計したいと思います。これにより、FIR フィルタ設計の2つの手法を比較できるようになります。

 

等リップル法を使った FIR フィルタ設計

「フィルタ」から「FIRフィルタ」カテゴリを選択します。次に、「等リップル法」アイコンを選択したら、「次へ」をクリックします。

「結果」に「フィルタ係数」を選択します。「フィルタテンプレート」には「バンドパス」を、「フィルタ長」には「計算...」を選択します。「正規化周波数を使用」にチェックを入れます。バンドリストには、バンドパスとして3つのバンドがあらかじめ定義されています。各バンドについて、帯域の上限と下限、利得 (gain) に関連する各種係数と近似誤差や重みを入力できます。あるバンドの上限と次のバンドの下限の差から阻止帯域と通過帯域との間の遷移が形成されます。リスト内の個々の値は、エントリをダブルクリックすることで編集できます。ただし、あらかじめ定義されたフィルタテンプレートの場合は、特定のエントリ、例えば、利得係数 (Fc1 減衰、Fc2 減衰等) にアクセスすることはできません。ここで以下に示す値をリストに追加してください:

バンド Fc1 Fc2 Fc1 減衰 Fc2 減衰  誤差
1 0 0.095 0 0 0.1
2 0.105 0.395 1 1 0.1
3 0.405 0.5 0 0 0.1

このフィルタで FIR 等リップル法を使用するには、フィルタ長を 77 にする必要があります。通過帯域にも阻止帯域にも同じリップルがあることから、このフィルタを「等リップル」と言います。IIR フィルタを設計する場合は、「カウアー」フィルタを使用することで通過帯域と阻止帯域のリップルを同じにすることができます。ただし、この場合のリップルは、1-δ と 1 の間で移動することになります。1±δ の範囲内では移動しません。

FIR 等リップル法を使えば、仕様に合致する最適なフィルタを設計することができます。窓関数を使用するフィルタ設計よりも、フィルタ長の短いフィルタを設計ことができます。FIR 等リップル法を使うもう一つのメリットは、マルチバンドのフィルタについても設計できる点です。

マルチバンドのフィルタを設計する

このマルチバンドのフィルタ設計では、ナイキスト範囲全体でパワーの等しい4つの基準正弦波と、それらの間に配置する3つの低パワーの正弦波からなる1つの信号を使用します。低パワーの成分は、基準正弦波との差がそれぞれ -40 dB, -50 dB, -60 dB であるとします。その後、ノイズフロアが約 -75 dB になるようなホワイトノイズを加えます。

4つの基準正弦波と3つの低パワー正弦波を、以下のように定義します:

x (時間) 値は、サンプル増分 0.0001 で 0 から 0.1 の範囲で変化します。従って、ナイキスト周波数は 5000 になります (つまり、サンプリング周波数 10000 の半分)。4つの基準正弦波は、このナイキスト範囲全体に広がります。最初の低パワー正弦波 (-40 dB) の振幅は基準正弦波の 1%、パワーは基準正弦波の 0.01% です。次の低パワー正弦波 (-50 dB) のパワーは基準正弦波の 0.001% です。最後のテスト正弦波 (-60 dB) の振幅は基準正弦波のわずか 0.1%、パワーは 0.0001% です。0.15% のガウスノイズを加えて、約 -75dB のホワイトノイズフロアを作成しました。この信号は、Spectral Analysis Tutorial にもあります。

ファイル > 参照 から下記のパスにあるプロジェクトデータベースを開きます。

C:\Users\Public\Documents\Weisang\FlexPro\2021\Examples\Tutorials\Filter.fpd

または、日本語のフォルダ名で C: > ユーザー > パブリック > パブリックのドキュメント > Weisang > FlexPro > 2021>Examples>Tutorials>Filter.fpd に移動します。Filter.fpd を開いたら、Signal2 データセットを選択します。挿入 [解析] > 解析ウィザードをクリックします。「フィルタ」の中にある「FIR フィルタ」カテゴリを選択します。「等リップル法」アイコンを選択したら、「次へ」をクリックします。

ここで、1000 Hz と 3000 Hz の正弦波を除くすべての信号成分を除去するマルチバンドフィルターを設計したいと思います。これを行うには、「結果」に「位相補正を伴うフィルタされたシグナル」を選択して、「フィルタテンプレート」に「マルチバンド」を選択します。「正規化周波数を使用」にチェックを入れます。「フィルタ長」には「計算...」を指定します。全部で5つのバンドを利用できるように、リストに必要な数のバンドを追加します。その後、以下の値をリストに追加します:

バンド Fc1 Fc2 Fc1 減衰 Fc2 減衰  誤差
1 0 0.09 0 0 0.001
2 0.095 0.105 1 1 0.001
3 0.11 0.29 0 0 0.001
4 0.295 0.305 1 1 0.001
5 0.31 0.5 0 0 0.001

これらの設定内容をフィルタテンプレートとして保存することで、後の解析で再度利用することができるようになります。これを行うには、「フィルタテンプレート」に Multi1 という名称を入力して、「保存」ボタンをクリックしてください。このテンプレートに別の変更を加えた場合は、その内容を再度保存する必要があります。「完了」をクリックしてください。このテンプレートはユーザープロファイルに保存されることになります。

この結果は、簡単な FFT を使ってチェックできます。スペクトル解析モジュールには、入力信号とフィルタリングされた信号をもとに伝達関数を作成するなど、更に多くの解析オプションが用意されています。

 

あらかじめ定義された振幅応答を使用してフィルタを設計する

本チュートリアルの最後に、利得係数や振幅応答をデータセットとして指定する FIR 等リップル法を使ったフィルタを設計することにしましょう。「Signal2」データセットを選択状態にします。解析ウィザードを再度開き、「FIR フィルタ」の「等リップル法」を選択したら「次へ」をクリックします。次に、フィルタテンプレートに「(カスタム)」を、フィルタ長に「計算...」を、重み付けに「リストから」を指定します。「正規化周波数を使用」にチェックを入れたら、以下の内容でバンドを定義します:

バンド Fc1 Fc2  誤差
1 0 0.19 0.2
2 0.2 0.29 0.2
3 0.3 0.5 0.2

次に、利得係数に「Amplitude」を指定します。このデータセットの内容は、IIR バンドストップ (カウアーフィルタ) で作成した振幅応答です。ここで仕様を見てみると、このフィルタ仕様を定義しているのが阻止帯域と通過帯域の定数ではなく、指定したデータセットであることが分かります。

ここで、バンドの値を以下の内容に変更すると、結果は以下のように変わります。

バンド Fc1 Fc2  誤差
1 0 0.19 0.1
2 0.21 0.29 0.05
3 0.31 0.5 0.1

周波数の全領域 0 ~ 0.5 に及ぶ単一の帯域のみを定義することも可能です。ただし、個々のバンドに不連続な点が無いことを確認してください。不連続な点があるとアルゴリズムは収束できないからです。原則として、あらかじめ定義された振幅応答をフィルタ設計で使うことは、フィルタ長を計算によって求めるとすれば計算量が非常に多くなると言えます。さらに、あらかじめ定義された仕様によっては、アルゴリズムがうまく収束しないこともあります。この事例の場合は、近似誤差を増やすか、帯域のカットオフ周波数を変更します。

フィルタ長に固定値を指定していれば、バンドの重み付けをデータセットで指定することもできます。

複数の入力信号にフィルタをかける

解析ウィザードを使えば、複数の信号に対して同時にフィルタを掛けることができます。これを実行するには、フィルタリングする信号を複数選択状態にして、解析ウィザードを開いてください。その後「結果」に「フィルタされたシグナル」または「位相補正を伴うフィルタされたシグナル」を選択します。フィルタ係数を計算する解析オブジェクトが解析ウィザードによって生成されます。さらに、各入力信号について計算されたフィルター係数を使用して入力信号にフィルタをかける FPScript に基づく公式が作成されます。

IIR/FIR フィルタの比較

本チュートリアルでは、IIR フィルタと FIR フィルタに関する設計法を各種紹介してきました。そこで、今度は、IIR フィルタと FIR フィルタのどちらを選ぶべきかかという疑問が当然生じると思います。いずれのフィルタタイプにもメリットもあれば、デメリットもあります。従って、この疑問に明確な答えを出すことはできません。そこで、どちらを選ぶべきかの判断に役立つ幾つかのポイントを以下のリストにまとめました:

IIR フィルタ

メリット:

デメリット:

FIR フィルタ

メリット:

デメリット:

FIR 等リップル法は、窓関数を使用する方法と比べて次数の低いフィルタを実現できるとともに、フィルタ仕様の形状に関する多くのオプション (重み付け、近似誤差) を装備しています。さらに、FIR 等リップル法を使えばマルチバンドのフィルタを設計することができます。

参考文献

デジタルフィルタリングの入門に関する優れた参考文献:

FlexPro で使用するフィルタアルゴリズムについての記述:

 

 

 

前のページにもどる