関数 > 信号処理 > デジタルフィルタ > 例: デジタルフィルタの時間応答
例: デジタルフィルタの時間応答
response関数とfftfilt関数を使用して、コンボリューションを直接計算することで、FIR フィルタと IIR フィルタの出力を計算します。これらの関数は、長さ n の複素ベクトルを出力として返します。
これらの関数に採用されている手法は十分な証明がなされており、信号処理に関するさまざまな文献で解説されています。A.V. Oppenheim/R. W. Schafer 著 Discrete-Time Signal Processing (1989) の 556 から 558 ページなどを参照してください。
ローパス IIR フィルタの次数
1. 低周波成分と高周波成分から成る入力信号を定義します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
2. カットオフ周波数 f の 2 次ローパス Butterworth フィルタの最初の 100 ステップの応答を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
関数定義に示されているように、カットオフ周波数は 0 から 0.5 の範囲でなければなりません。
3. iirlow関数を使用して、変換関数の係数を求めます。
クリックしてこの式をコピー
4. response 関数を使用して、フィルタの応答を求めます。
クリックしてこの式をコピー
クリックしてこの式をコピー
元の信号 x と比較した場合、応答信号 YA の方が滑らかで、振幅が小さく、時間シフトがわずかにあります。
5. カットオフ周波数 f が同じ 6 次ローパス Butterworth フィルタを指定します。response 関数は第 1 セクションの出力を第 2 セクションに渡し、第 2 セクションの出力を第 3 セクションに渡し、以降も出力を次のセクションに渡していきます。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
フィルタの次数が高くなるほど応答は滑らかになり、高周波のフィルタでの効果が上がるため、時間シフトが大きくなり、カットオフ周波数の遷移が急激になります。
帯域通過 FIR フィルタ
1. 上記で定義した 2 つの信号周波数のうちの高い方を伝送する FIR 帯域通過フィルタ F を設計します。
クリックしてこの式をコピー
クリックしてこの式をコピー
2. Blackman ウィンドウを使用して (最後の引数が 6)、上記の低周波数と高周波数の間を通過帯域とする長さ 51 の帯域通過フィルタの係数を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
3. フィルタによって生じる遅延を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
4. response 関数を適用して、最初の 100 ステップの応答を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
このフィルタでは入力開始時に信号がただちに伝送されませんが、高周波数 (f2=0.2、T=5) が非常に正確に選択されます。
帯域通過 FIR フィルタ 2
次のローパス FIR フィルタはその通過帯域内のいくつかの周波数で位相シフトがゼロです。
1. 2 つの入力信号を定義します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
2. FIR フィルタのカットオフ周波数と係数の数を定義します。
クリックしてこの式をコピー
クリックしてこの式をコピー
3. Hanning ウィンドウを使用して係数を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
4. フィルタによって生じる遅延を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
5. 2 つの遅延入力信号を定義します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
6. 1 つ目の遅延入力信号 x1d と x1 に対するフィルタの応答をプロットします。
クリックしてこの式をコピー
2 つの信号は同じであり、位相シフトがゼロです。
7. 2 つ目の遅延入力信号 x2d と x2 に対するフィルタの応答をプロットします。
クリックしてこの式をコピー
2 つの信号は同じであり、位相シフトがゼロです。
コンボリューションでの response の使用
フィルタの配列が 1 列の場合、response 関数はコンボリューションを実行します。このため、FFT ベースの関数convolveの代わりに response 関数を使用できます。2 つの長いシーケンスのコンボリューションの最初の数ステップでは response 関数の方がはるかに高速です。
1. 範囲と 2 つの配列を定義し、0 から 1 の乱数で配列を埋めます。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
2. convolve 関数を 2 つの配列に適用します。
クリックしてこの式をコピー
3. response 関数を使用して、最初の 8 ステップの応答を求めます。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
2 つの配列は同じです。
response 関数と fftfilt 関数の出力の比較
response 関数と fftfilt 関数によって返された結果が同じであることを確認します。
1. 範囲と 2 つの周波数を定義します。
クリックしてこの式をコピー
クリックしてこの式をコピー
クリックしてこの式をコピー
2. f1 と f2 を使用して入力信号を定義します。
クリックしてこの式をコピー
3. Hanning ウィンドウを使用して、カットオフ周波数 f の FIR ローパスフィルタを作成します。
クリックしてこの式をコピー
クリックしてこの式をコピー
4. 入力信号へのフィルタの応答を計算します。
クリックしてこの式をコピー
クリックしてこの式をコピー
5. 入力信号に fftfilt 関数を適用し、最初の 64 ステップの応答を求めます。
クリックしてこの式をコピー
クリックしてこの式をコピー
* 
y_f は複素成分のベクトルです。
クリックしてこの式をコピー
クリックしてこの式をコピー
6. フィルタの変換関数による入力信号のコンボリューションの結果と応答信号をプロットします。2 つのトレースは完全に重なっています。
クリックしてこの式をコピー
これは役に立ちましたか?