滞后超前型低通滤波器 (2)

我以前写过篇博客,讨论了《锁相环电路设计与应用》书中提到的滞后超前型低通滤波器的特性。http://blog.csdn.net/liyuanbhu/article/details/7831863

不过当时没有仔细计算书后附录给出的曲线。最近有点空闲时间,研究了一下那几条曲线是如何计算得来的。在这里记录一下。

 

首先,相位返回量与两个因素有关,第一个是M,第二个是fH/fL的比值(这个比值在程序中用A表示,A=fH/fL)。

给出和 R1 的值,就可以确定 R2 的值。

滞后超前型低通滤波器 (2)_第1张图片

再给个 fm 值和A值就可以确定fH 和 fL的值。

到这里 C1 C2 的值就可以确定了。

滞后超前型低通滤波器 (2)_第2张图片

至此,公式中所有的参数就都确定了。

下面给出个函数,可以计算任何一个频率下的相位滞后。

R1MAfm 是滤波器参数,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取值1000fm取值也为 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,因为fdHfdL 好计算的多。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

利用类似的方法,用个循环就能求出附录的表格了。

下面是程序,A2100 之间变化,也就是 fH/fL2100 之间变化。然后查找相位滞后为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"]);

滞后超前型低通滤波器 (2)_第3张图片

 

 

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"]);


你可能感兴趣的:(编程,c,算法,语言,plot)