模拟滤波器工程设计

文章目录

    • 概要
    • 1. Matlab代码设计
    • 2. 参数仿真验证
    • 小结

概要

本文主要是为了验证一下滤波器零、极点对频响的具体影响。`

1. Matlab代码设计

matlab里面有自带的滤波器设计软件,设置参数就可以自动生成各种滤波器,不过我这里需要手动更改滤波器参数,所以用的命令行来实现。
代码如下所示,具体步骤为:
a)使用ellipord计算出滤波器阶数和截止频率(这一步可以省略,直接用第二步)
b)使用ellip命令计算出椭圆滤波器的极点、零点和增益(不同的滤波器命令不一样,具体可以查官方资料,比如切比雪夫1滤波器的命令是[z1,p1,k1] = cheby1(n,3,2pifc,“s”);)
c)使用zp2tf计算出传递函数的多项式系数
d)使用freqs计算出传递函数的频响

% 【例7-29】ellipord函数设计椭圆滤波器示例。
clc, clear, close all

Fp = 4e3;
Fs = 12e3;
Wp = 2*pi*Fp;
Ws = 2*pi*Fs;
rp = 3;
rs = 20; % 设计滤波器参数

[N, wc] = ellipord(Wp, Ws, rp, rs, 's'); % 计算滤波器阶数和阻带起始频率
[ze,pe,ke] = ellip(N,rp,rs,wc,"s");% 计算零点、极点、增益

% ze=[ 58870.5377192101i; - 58870.5377192101i];
% pe=[-7445.55073682723 + 20835.3687528983i;-7445.55073682723 - 20835.3687528983i];
% ke=0.1;

[be,ae] = zp2tf(ze,pe,ke);     % 计算系统函数系数多项式
[he,we] = freqs(be,ae,4096); % 模拟滤波器的频率响应

figure
plot(we/(2e3*pi), mag2db(abs(he)),'k');
axis([0 20 -100 5])
xlabel("Frequency (kHz)")
ylabel("Attenuation (dB)")
title('模拟椭圆低通滤波器幅频响应曲线');  grid on;

此代码画出来的幅频响应如下图所示:
模拟滤波器工程设计_第1张图片

2. 参数仿真验证

2.1 首先,我们把自动生成零、极点的代码屏蔽点,把开始生成的数据复制过去(就是上面被屏蔽的代码),然后把代码优化一下,方便修改参数。

clc, clear, close all
Wz=58870.5377192101; %零点虚部
fz=Wz/(2e3*pi);     %计算零点频率,单位kHz
Ap=-7445.55073682723; %极点实部
Wp=20835.3687528983; %极点虚部
fp=Wp/(2e3*pi);     %计算极点频率,单位kHz
ze=[ Wz*1i; - Wz*1i];
pe=[Ap + Wp*1i;Ap - Wp*1i];
ke=0.1;

[be,ae] = zp2tf(ze,pe,ke);     % 计算系统函数系数多项式
[he,we] = freqs(be,ae,4096); % 模拟滤波器的频率响应
x=we/(2e3*pi);
figure
plot(x, mag2db(abs(he)),fz,-80,'o',fp,0,'x');
axis([0 20 -100 5])
xlabel("Frequency (kHz)")
ylabel("Attenuation (dB)")
title('模拟椭圆低通滤波器幅频响应曲线');  grid on;

模拟滤波器工程设计_第2张图片
可以看出来,零点所在的频率表示频响处于最底端,极点所在的频率表示频响开始下降。

2.2 我们把代码再优化一下,方便按照频率修改,把零点频率改为12kHz,极点频率改居8kHz,可以看出频响跟着变化,但形状不变

clc, clear, close all
fz=12;     %零点频率,单位kHz
Wz=2e3*pi*fz; %零点虚部
Ap=-7445.55073682723; %极点实部
fp=8;     %计算极点频率,单位kHz
Wp=2e3*pi*fp; %极点虚部

模拟滤波器工程设计_第3张图片
2.3 我们把极点实点改为-2000,其它不变,可以看出只影响了极点处的增益
模拟滤波器工程设计_第4张图片
2.4 我们把极点改到12,零点改到8,可以看出从一个低通变成了一个类似高通的滤波器
模拟滤波器工程设计_第5张图片
2.5 我自己增加了一对极点,结果发现通带跑到了-150,可见这个也不是随便乱加的,还是需要在标准滤波器的参数基础上进行更改

clc, clear, close all
fz=12;     %零点频率,单位kHz
Wz=2e3*pi*fz; %零点虚部
Ap=-2000; %极点实部
fp1=3;     %计算极点频率,单位kHz
Wp1=2e3*pi*fp1; %极点虚部
fp2=6;     %计算极点频率,单位kHz
Wp2=2e3*pi*fp2; %极点虚部
ze=[ Wz*1i; - Wz*1i];
pe=[Ap + Wp1*1i;Ap - Wp1*1i;Wp2*1i;- Wp2*1i];
ke=0.1;

[be,ae] = zp2tf(ze,pe,ke);     % 计算系统函数系数多项式
[he,we] = freqs(be,ae,4096); % 模拟滤波器的频率响应
x=we/(2e3*pi);
figure
plot(x, mag2db(abs(he)),fz,-80,'o',fp1,0,'x',fp2,0,'x');
% axis([0 20 -100 5])
xlabel("Frequency (kHz)")
ylabel("Attenuation (dB)")
title('模拟椭圆低通滤波器幅频响应曲线');  grid on;

模拟滤波器工程设计_第6张图片
2.6 最后用公式生成了一个5阶的椭圆滤波器,把极点,零点标了一下,可以对比一下。五阶一共会有5个极点,其中2对共轭极点和一个实极点。所以我只画出了两个和频率有关的极点。

clc, clear, close all

n = 5;
fc = 2e3;
[ze,pe,ke] = ellip(n,3,30,2*pi*fc,"s");
fz1=imag(ze(1,1))/(2e3*pi);
fz2=imag(ze(3,1))/(2e3*pi);
fp1=imag(pe(1,1))/(2e3*pi);
fp2=imag(pe(3,1))/(2e3*pi);
[be,ae] = zp2tf(ze,pe,ke);     % 计算系统函数系数多项式
[he,we] = freqs(be,ae,4096); % 模拟滤波器的频率响应
x=we/(2e3*pi);
figure
plot(x, mag2db(abs(he)),fz1,-80,'o',fz2,-80,'o',fp1,0,'x',fp2,0,'x');

xlabel("Frequency (kHz)")
ylabel("Attenuation (dB)")
title('模拟椭圆低通滤波器幅频响应曲线');  grid on;

模拟滤波器工程设计_第7张图片

小结

总结下来,就是零极点的实部改变增益,虚部改变频率。多个零、极点会在图形上产生多个拐点。

你可能感兴趣的:(工程,matlab)