我以前写过篇博客,讨论了《锁相环电路设计与应用》书中提到的滞后超前型低通滤波器的特性。http://blog.csdn.net/liyuanbhu/article/details/7831863
不过当时没有仔细计算书后附录给出的曲线。最近有点空闲时间,研究了一下那几条曲线是如何计算得来的。在这里记录一下。
首先,相位返回量与两个因素有关,第一个是M,第二个是fH/fL的比值(这个比值在程序中用A表示,A=fH/fL)。
给出M 和 R1 的值,就可以确定 R2 的值。
再给个 fm 值和A值就可以确定fH 和 fL的值。
到这里 C1 和C2 的值就可以确定了。
至此,公式中所有的参数就都确定了。
下面给出个函数,可以计算任何一个频率下的相位滞后。
R1,M,A,fm 是滤波器参数,f是要计算的频率点。
编程语言采用 Maxima。
phase2(R1, M, A, fm, f):=block([pi, fH, fL, OmegaM, OmegaH, OmegaL, omega, C1, C2, R2, den, num],
pi:3.14159,
R2: M/(1-M)*R1,
fH: sqrt(A)*fm,
fL: fm/sqrt(A),
OmegaM: 2*pi*fm,
OmegaH: 2*pi*fH,
OmegaL: 2*pi*fL,
C2: 1/(R2*OmegaH),
C1: 1/(R2*OmegaL)-C2,
omega: 2*pi*f,
num: (C1+C2)*R2*%i*omega+1,
den: C1*R1*C2*R2*(%i*omega)^2+((C1+C2)*R2+C1*R1)*(%i*omega)+1,
ev(carg(num/den) / pi * 180.0, numer))$
下面所有计算中 R1取值1000,fm取值也为 1000。
首先计算fm频率处的相位滞后,因为这个频率出相位返回值最大。
R1:1000;
fm:1000;
y1:makelist ([A,phase2(R1, 10^(-10.0/20.0), A, fm, fm)], A, 1.5, 100, 0.5)$
y2:makelist ([A,phase2(R1, 10^(-20.0/20.0), A, fm, fm)], A, 1.5, 100, 0.5)$
y3:makelist ([A,phase2(R1, 10^(-30.0/20.0), A, fm, fm)], A, 1.5, 100, 0.5)$
y4:makelist ([A,phase2(R1, 10^(-40.0/20.0), A, fm, fm)], A, 1.5, 100, 0.5)$
wxplot2d([[discrete,y1],[discrete,y2],[discrete,y3],[discrete,y4]],
[style, points],
[legend, "-10dB", "-20dB", "-30dB", "-40dB"],
[xlabel, "fH/fL"],
[ylabel, "Phase lag at frequency fm"], [gnuplot_preamble,"set grid"]);
下图是计算出的结果。
下面给定确定的M和A,计算fdH 和fdL。实际上,我们只需要计算 fdH,因为fdH比fdL 好计算的多。fdH >fm,而相位变化在 f>fm 后是单调变化的,很容易用各种数值算法来计算,最简单的方法就是确定一个区间然后用二分查找法。而我们知道 fdH * fdL = fm^2,所以求出了 fdH 自然就可以确定 fdL了。
下面是个例子程序求 M=0.3162(对应-10dB),A= 2时 30°相位余量对应的 fdH。由于中心频率是1000,所以我们在1000 到100000之间肯定能找到 fdH。
R1:1000;
fm:1000;
fdH:find_root(phase2(R1, 10^(-10.0/20.0), 2, fm, f)=-60, f, 1000, 100000);
fdL:fm^2/fdH;
B:fdH/fdL;
结果是:
3291.133743180222
303.8466613738098
10.83156131549946
利用类似的方法,用个循环就能求出附录的表格了。
下面是程序,A在2到100 之间变化,也就是 fH/fL在2到100 之间变化。然后查找相位滞后为30度的点,也就是 fdH 点。
R1:1000;
fm:1000;
dHdL:makelist ((find_root(phase2(R1, 10^(-10.0/20.0), A, fm, f)=-60, f, 1000, 100000)/fm)^2, A, 2, 100, 2)$
fH:makelist (sqrt(A), A, 2, 100, 2)$
fL:1/fH$
plot2d([[discrete,dHdL, fH],[discrete,dHdL,fL]],[legend, "fH", "fL"], [gnuplot_preamble,"set logscale xy;set grid mxtics mytics; set mxtics"]);
R1:1000;
db:-10.0;
M:10^(db/20);
fm:1000;
dHdL:makelist ((find_root(phase2(R1, M, A, fm, f)=-30, f, 1000, 10000)/fm)^2, A, 6, 18, 2)$
fH:makelist (sqrt(A), A, 6, 18, 2)$
fL:1/fH$
wxplot2d([[discrete,dHdL, fH]],[legend, "fH"], [xlabel, "fdH/fdL"], [gnuplot_preamble,"set grid mxtics mytics; set mxtics; set mytics"]);
wxplot2d([[discrete,dHdL,fL]],[legend, "fL"], [xlabel, "fdH/fdL"],[gnuplot_preamble,"set grid mxtics mytics; set mxtics; set mytics"]);