PSoC1 (6) --- スイッチトキャパシタ・フィルタ (6)
フィルタのユーザモジュールのウィザードでは、フィルタ仕様を入力して設計するほかに、外部のプログラムでコーナー角周波数を 1 [rad/s] として設計したフィルタの s-平面上の「極」の配置を入力して使うこともできます。
ELPF ユーザモジュールでは、「ノッチ」となる「零点」の入力も必要ですが、こちらは s-平面上の位置ではなく、ノッチ周波数を入力します。
MATLAB および GNU Octave には、ディジタル / アナログ両方に対応した楕円フィルタ設計関数「ellip( )」があるので、これを試してみました。
GNU Octave で記述したプログラム (ELPF4.m) を下に示します。
# # Elliptic filter for PSoC1 ELPF4 user module # # load "signal" package pkg load signal # SCF corner frequency f_0 = 937.5; # prototype LPF corner angular frequency w_0 = 1.0; # order of LPF n_order = 4; # passband ripple [dB] r_p = 0.1; # stopband minimum attenuation [dB] r_s = 40; # design elliptic LPF at s-domain (zero-pole-gain format) [z, p, g] = ellip(n_order, r_p, r_s, w_0, "s"); # print pole location printf("Pole Location Real Part: "); printf("%.3f %.3f\n", abs(real(p(1))), abs(real(p(2)))) printf("Pole Location Imag Part: "); printf("%.3f %.3f\n", abs(imag(p(1))), abs(imag(p(2)))) printf("\n"); # print notch frequency printf("F notch, Low Pole (Hz): %.0f \n", f0*imag(z(1))) printf("F notch, High Pole (Hz): %.0f \n", f0*imag(z(2)))
ellip( ) 関数は「signal」パッケージに含まれているので、プログラム冒頭でパッケージをロードしています。
ellip( ) 関数は次のような形で呼び出しています。
[z, p, g] = ellip(N, rp, rs, ω0, "s")
ここで、N はフィルタ次数、rp は通過域リプル (dB 単位)、rp は阻止域最小減衰量 (dB 単位)、ω0 はフィルタの通過域端の角周波数です。
最後の引数 "s" により s-平面上のアナログ・フィルタ設計であることを示します。 (デフォルトでは z-平面上のディジタル・フィルタの設計を行う)
関数の結果を 3 要素のベクトル [z, p, g] で受け取ると、z には零点の座標 (N 要素の複素数)、p には極の座標 (N 要素の複素数)、g にはゲイン定数が入っています。
ELPF のウィザードでは、極の位置の数値として、符号のない小数点以下 3 桁の数しか受け付けないので、printf( ) 関数でフォーマットを変換しています。
零点の情報は、ノッチ周波数を Hz 単位の整数として入力するようになっているので、これも printf( ) 関数でフォーマットを整えています。
実行結果は次のようになります。
>> ELPF4 Pole Location Real Part: 0.673 0.212 Pole Location Imag Part: 0.542 1.116 F notch, Low Pole (Hz): 4430 F notch, High Pole (Hz): 1937
この結果をウィザードに入力します。 ウィザードの画面を下に示します。 (図をクリックすると拡大します。)
「極」と「零点」の「ペアリング」は、理論値の特性には影響しませんが、実際の SCF 回路ではキャパシタの値に制約があるので、ペアの相手を変えると特性も変わります。
周波数特性のグラフで、青色のプロットが理論値で、オレンジ色のプロットが実際に PSoC1 の SCF で実現されるであろう特性です。
通過域の特性を拡大したものを下に示します。
理論値 (青色のトレース) は等リプル特性になっていることが分かります。 ゲインの目盛りがないので読み取れませんが、設計上のスペックでは 0.1 dB のリプルを指定しています。
PSoC1 の SCF で実現される特性 (オレンジ色のトレース) は通過域端でゲインにピークを生じています。
WaveGene + WaveSpectra のリニア周波数スイープ + ピークホールドで PSoC1 の SCF 特性を実測した結果を下に示します。
通過域端にピークがあり、ウィザードのグラフと良く一致していることが分かります。
通過域での誤差を少なくするように、手動で極の位置をいじってみた例を次に示します。
いじった結果、理論的な「最適値」からはズレるので、理論値のグラフの特性は悪化しています。
全体の特性は次のようになります。
この手動で調整したパラメタでの PSoC1 SCF の実測値を下に示します。
2018 年 12 月 31 日の記事の結果 (逆チェビシェフ) と比べて、通過域端の「肩特性」が向上しています。
通過域のゲイン特性を拡大したものを下に示します。
低い周波数で振動的になっているのは周波数スイープ + ピークホールドの測定方法による「見かけ」の現象で、実際にゲイン特性が振動的になっているわけではありません。
阻止域の最小減衰量はスペックの 40 dB に対して 2 dB 程度足りませんが、通過域内のリプルは 0.2 dB 程度に抑えられています。