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

 この結果をウィザードに入力します。 ウィザードの画面を下に示します。 (図をクリックすると拡大します。)

psoc1_ellip4_wiz_small.jpg

 「極」と「零点」の「ペアリング」は、理論値の特性には影響しませんが、実際の SCF 回路ではキャパシタの値に制約があるので、ペアの相手を変えると特性も変わります。
 周波数特性のグラフで、青色のプロットが理論値で、オレンジ色のプロットが実際に PSoC1 の SCF で実現されるであろう特性です。
 通過域の特性を拡大したものを下に示します。

 理論値 (青色のトレース) は等リプル特性になっていることが分かります。 ゲインの目盛りがないので読み取れませんが、設計上のスペックでは 0.1 dB のリプルを指定しています。
 PSoC1 の SCF で実現される特性 (オレンジ色のトレース) は通過域端でゲインにピークを生じています。
 WaveGene + WaveSpectra のリニア周波数スイープ + ピークホールドで PSoC1 の SCF 特性を実測した結果を下に示します。

 通過域端にピークがあり、ウィザードのグラフと良く一致していることが分かります。
 通過域での誤差を少なくするように、手動で極の位置をいじってみた例を次に示します。

 いじった結果、理論的な「最適値」からはズレるので、理論値のグラフの特性は悪化しています。
 全体の特性は次のようになります。

 この手動で調整したパラメタでの PSoC1 SCF の実測値を下に示します。

 2018 年 12 月 31 日の記事の結果 (逆チェビシェフ) と比べて、通過域端の「肩特性」が向上しています。
 通過域のゲイン特性を拡大したものを下に示します。

低い周波数で振動的になっているのは周波数スイープ + ピークホールドの測定方法による「見かけ」の現象で、実際にゲイン特性が振動的になっているわけではありません。
 阻止域の最小減衰量はスペックの 40 dB に対して 2 dB 程度足りませんが、通過域内のリプルは 0.2 dB 程度に抑えられています。