
パッシブ・フィルタの計算。別な「電子回路用電卓」をスマホに載せてあるので、わざわざMaxima様にお願いしなくても、と思っていたのです。しかし「その先」を計算するためには避けていられませぬ。機能重複しますがMaxima用のソースも作る(第72回のソースに継ぎ足し)ことにいたしました。鰻屋さんの秘伝のタレ式?
※「やっつけな日常」投稿順 Index はこちら
※動作確認は、パソコン上の wxMaxima 22.04.0 および Androidスマホ上の Maxima on Android 3.2.1 で行っています。
別な「電子回路用電卓」
スマホに載せてある「別な電子回路用電卓」はElectrodoc Pro(有料版)です。各種電卓に加えピン配その他、忘却力の年寄が自分じゃ計算できね~あるいは、覚えていられない各種の事柄を教えてくれる逸品であります。RLCフィルタ用の電卓画面が以下に。
これがあるので、わざわざ同じような機能をMaxima on Android用にこさえることもないか、と思っておりました。が、しかし「その先」を計算するとなると、重複機能部分とは言え、実装せざるを得ませんな。今回は先を考えて、重複機能を実装っと。
計算対象のフィルタ
フィルタといってもいろいろあり。まずは、
-
- デジタル
- アナログ
の区別があります。今回はアナログねたです。DSPじゃありません。さてアナログ・フィルタにも大きく2種類の区別あり。
-
- パッシブ
- アクティブ
今回は受動素子のみでフィルタを構成するパッシブ・フィルタです。アクティブ・フィルタの設計は何度かURLを貼り付けさせていただいているアナログ権化のアナデバさまの「アナログ・フィルター・ウィザード」をどうぞ。魔法使いが助けてくれることでしょう。知らんけど。
さてパッシブ・フィルタには、
-
- 1次のRCフィルタ、RLフィルタ
- 2次のLCフィルタ(RLC)フィルタ
ありです。今回はRC、RLフィルタに加えて、L型のLCフィルタ「まで」実装してみてます。π型フィルタ、T型フィルタなどはまた後で(いつやるのだ自分?)ほぼほぼ Electrodoc Pro がカバーしている範囲です。フィルタ機能としては、以下中心です。
-
- ローパスフィルタ
- ハイパスフィルタ
最後のRLCフィルタでは、
-
- バンドパスフィルタ
もやってます。なお、Electrodoc Pro以外に、『Analogista』様の以下のページも参考にさせていただきました。ありがとうございます。
Maximaソース
Windows上のMaxima、Android上のMaxima on Android共通に使用できるソースが以下に。(第72回のソースに継ぎ足し)
/* Maxima BATCH FILE 2024/05/31 J.Halfmoon */
/* Passive Filters */
algebraic:true$
/*- Utilities -----------------------------------*/
log10(x) := log(x)/log(10)$
roundF(x, p) := float(round(x*10^p)/10^p)$
dB(Vout, Vin) := float(20*log10(Vout/Vin))$
phase(z) := 180*carg(z)/%pi$
vec2(x, y) := matrix([x],[y])$
mat22(a11, a12, a21, a22) := matrix([a11, a12],[a21, a22])$
vecP(v2) := vector([0, 0], [v2[1, 1], v2[2, 1]])$
vecLis(lis) := if listp(lis) then map(vecP, lis) else [vecP(lis)] $
vi: vec2(1, 0);
vj: vec2(0, 1);
I: mat22(1, 0, 0, 1);
/*- impedance calculation -----------------------*/
define(ser ([Lis]), '(apply ("+", Lis)))$
define(par ([Lis]), '(1 / (apply ("+", 1/Lis))))$
ci(C):= 1/(%i*2*%pi*f*C)$
ii(L):= %i*2*%pi*f*L$
/*- plot impedance vector -----------------------*/
plotImp(vP1, vP2, xR, yR) := draw2d(
xrange=xR, yrange=yR, proportional_axes=xy,
xaxis=true, yaxis=true, grid=true,
title = "Impedance Z",
xlabel = "Real", ylabel = "Imag",
color = blue, head_length = 0.2, head_angle = 20,
color = blue,
vecLis(vP1),
color = red,
vecLis(vP2)
)$
prSub(z) := ceiling(max(realpart(z), imagpart(z)) * 1.2)$
plotImpedance(z) := block([tmp],
tmp: prSub(z),
XR: [-0.1, tmp],
YR: [-tmp, tmp],
vZ: [vec2(realpart(z), 0), vec2(0, imagpart(z))],
vY: vec2(realpart(z), imagpart(z)),
plotImp(vZ, vY, XR, YR)
)$
/*- magnitude plot ------------------------------*/
plotMag(zf, fR) := draw2d(
xrange=fR,
xaxis=true, yaxis=true, grid=true, logx=true, logy=true,
title = "Magnitude plot",
xlabel = "Frequency[log(Hz)]", ylabel = "Magnitude[log(Z)]",
explicit(abs(ev(zf, f=x)), x, fR[1], fR[2])
)$
/*- phase plot ----------------------------------*/
plotPhase(zf, fR) := draw2d(
xrange=fR, yrange=[-180, 180],
xaxis=true, yaxis=true, grid=true, logx=true, logy=false,
title = "Phase plot",
xlabel = "Frequency[log(Hz)]", ylabel = "phase[degree]",
explicit(phase(ev(zf, f=x)), x, fR[1], fR[2])
)$
/*- Passive filter calculation ------------------*/
/*- L type filters */
/* RC LOW PASS (IN)--R1--+--(OUT) */
/* | */
/* C1 */
/* V */
/* RC HIGH PASS (IN)--C1--+--(OUT) */
/* | */
/* R1 */
/* V */
/* RL LOW PASS (IN)--L1--+--(OUT) */
/* | */
/* R1 */
/* V */
/* RL HIGHPASS (IN)--R1--+--(OUT) */
/* | */
/* L1 */
/* V */
/* LC LOW PASS (IN)--L1--+--(OUT) */
/* | */
/* C1 */
/* V */
/* LC HIGH PASS (IN)--+--C1--(OUT) */
/* | */
/* L1 */
/* V */
/* RLC BAND PASS (IN)--R1--+---+--(OUT) */
/* | | */
/* L1 C1 */
/* V V */
/*-----------------------------------------------*/
Frc: Fc1 = 1/(2*%pi*R1*C1);
Frl: Fc1 = R1/(2*%pi*L1);
Fcl: Fc1 = 1/(2*%pi*sqrt(L1*C1));
FANS(Ftype, X1) := solve(Ftype, X1);
FVAL(Ftype, X1, Y1, YV, Z1, ZV) := float(at(FANS(Ftype, X1), [Y1=YV, Z1=ZV]));
Qpar(R, C, L) := R*sqrt(C/L);
/*- Example -------------------------------------*/
FVAL(Frc, Fc1, R1, 1, C1, 10e-6);
FVAL(Frl, Fc1, R1, 1, L1, 100e-6);
FVAL(Fcl, Fc1, C1, 10e-6, L1, 100e-6);
Qpar(1, 10e-6, 100e-6);
コメント部分に、想定している回路形式をキャラクタで描いてあります。実際にスマホ上のエディタ(monospaceフォントの11ポイント)で見るとこんな感じ。
使い方は以下だけです。
FVAL(フィルタ、求める変数、既定変数1、1の値、既定変数2、2の値)
フィルタのところには、以下のどれかを指定します
-
- Frc、RCフィルタ、LPFでもHPFでも同じ
- Frl、RLフィルタ、LPFでもHPFでも同じ、
- Fcl、LCフィルタ、LPFでもHPFでも同じ
RLCバンドパスフィルタのときには上記の3つとも使用します。
求める変数は、以下のどれかを指定します。
-
- Fc1、遮断周波数[Hz]
- R1、抵抗の値[Ω]
- C1、コンデンサの値[F]
- L1、コイルの値[H]
例えば、RCフィルタで遮断周波数を求めようとする場合は、Fc1と指定します。そのとき、R1とC1の値を以下のようにして与えれば、Fc1が求まります。
FVAL(Frc, Fc1, R1, 1, C1, 10e-6)
なお、RLCバンドパスフィルタの時は、以下の実施例のように3項目全てを使います。
MoA上での実行
LTspiceでRLCバンドパスフィルタをシミュレーション
念のため、以下にLTspiceシミュレーションの結果を掲げます。回路が以下に。
こんなもんかいな~。やっつけ。



