RC高通滤波器Bode图分析(传递函数&零极点)
RC高通滤波器Bode图分析(传递函数&零极点)
RC高通滤波器是一种常见的电子滤波器,广泛应用于信号处理领域。本文将详细介绍RC高通滤波器的Bode图分析,包括传递函数、零极点、截止频率等关键概念,并通过Matlab代码展示具体实现过程。
RC高通滤波器
我们设定电阻R为1K欧姆,电容C为1微法;电容C的阻抗为Xc。
传递函数
$$
H(s) = \frac{u_{o}}{u_{i}} = \frac{R}{X_{C}+R} = \frac{R}{\frac{1}{sC}+R} = \frac{sRC}{1+sRC} \quad (其中 s = j\omega)
$$
将传递函数进一步整理可得:
$$
H = \frac{\left ( \omega RC \right ) ^{2} +j\omega RC}{1+\left ( \omega RC \right ) ^{2} }
$$
由上式可得出传递函数的实部和虚部:
$$
\begin{matrix}
real=\frac{\left ( \omega RC \right ) ^{2} }{1+\left ( \omega RC \right ) ^{2} } \
image=\frac{\omega RC}{1+\left ( \omega RC \right ) ^{2} }
\end{matrix}
$$
进一步求出幅值和相位表达式:
$$
\begin{matrix}
幅值=\sqrt{real^{2}+image^{2} } =\sqrt{\frac{\left ( \omega RC \right ) ^{2}}{1+( \omega RC)^{2} } } \
相位=arctan\left (\frac{image}{real} \right ) =arctan\left (\frac{1}{\omega RC} \right ) \
(其中 \omega =2\pi f)
\end{matrix}
$$
截止频率
$$
f_{r}=\frac{1}{2\pi RC}
$$
有关截止频率的计算可以参考之前的文章:https://editor.csdn.net/md/?articleId=139279203
零点与极点
由传递函数可求出零点与极点:
$$
H(s)=\frac{u_{o} }{u_{i} } =\frac{R }{X_{C}+R} =\frac{R }{\frac{1}{sC}+R} =\frac{sRC}{1+sRC} \quad (其中 s = j\omega)
$$
零点:令传递函数的分子为0可求出零点,得:
$$
s = 0 \quad (注意单位问题,我们平常计算时需要计算出频率;如果计算出负值,需要取其绝对值)
$$
极点:令传递函数的分子为0可求出极点,得:
$$
s = -\frac{1 }{RC } \quad (注意单位问题,我们平常计算时需要计算出频率;如果计算出负值,需要取其绝对值)
$$
Bode图绘制与分析
现在,我们使用Matlab来画出这个RC滤波器的Bode图:
我们来进一步分析这个Bode图:
- 在截止频率处$f=f_r \approx 159.15Hz$处,对应的幅值和相位计算如下:
$$
\begin{matrix}
幅值=\sqrt{\frac{\left ( \omega RC \right ) ^{2}}{1+( RC)^{2} } } =\sqrt{\frac{(2\pi f_{r}RC)^{2}}{1+ (2\pi f_{r}RC)^{2} } } =\frac{\sqrt{2} }{2} \quad (即-3dB) \
相位=arctan\left (\frac{1}{\omega RC} \right ) =arctan\left (\frac{1}{2\pi f_{r} RC} \right ) =arctan\left (1 \right )=45°
\end{matrix}
$$
- 在截止频率左侧,当$f<<f_r$时,对应的幅值和相位计算如下:
$$
\begin{matrix}
幅值=\sqrt{\frac{\left ( \omega RC \right ) ^{2}}{1+( \omega RC)^{2} } } =\sqrt{\frac{(2\pi fRC)^{2} }{1+ (2\pi fRC)^{2} } } \
(随着频率减小幅值减小,斜率为20dB/10dec,即频率每减小10倍,幅值衰减20dB) \
相位=arctan\left (\frac{1}{\omega RC} \right ) =arctan\left (\frac{1}{2\pi fRC} \right ) =arctan(∞ )=90°
\end{matrix}
$$
- 在截止频率右侧,当$f>>f_r$时,对应的幅值和相位计算如下:
$$
\begin{matrix}
幅值=\sqrt{\frac{\left ( \omega RC \right ) ^{2}}{1+( \omega RC)^{2} } } =\sqrt{\frac{(2\pi fRC)^{2} }{1+ (2\pi fRC)^{2} } }≈1(即0dB) \
相位=arctan\left (\frac{1}{\omega RC} \right ) =arctan\left (\frac{1}{2\pi fRC} \right ) =arctan(∞0)=0°
\end{matrix}
$$
- 对于RC高通滤波器来说,其极点对应的频率与截止频率数值上相等,Bode图上也可以看出,均为159.19Hz;
每增加一个极点,可以使得Bode图的幅值变化-20dB/dec,相位变化-90°;
每增加一个零点,可以使得Bode图的幅值变化20dB/dec,相位变化90°;
Bode图上:
极点前后幅值由20dB/dec变为0dB/dec,变化-20dB/dec,左侧幅值变化-20dB/dec;极点前后相位由90°变化为0°,变化-90°;
零点右侧幅值为20dB/dec,变化20dB/dec;零点相位为90°,变化90°;
Matlab代码
R=1000;
C=1*10^(-6);
H=tf([(R*C) 0],[(R*C) 1]);
% 获取零极点
z = zero(H);
p = pole(H);
opts = bodeoptions;
opts.FreqUnits = 'Hz'; % 设置频率单位为Hz
bode(H, opts);
grid on
% 获取当前坐标轴
h = findobj(gcf, 'Type', 'axes');
% 设置增益图的横纵坐标显示值
set(h(1), 'XScale', 'log'); % 设置横坐标为对数刻度
set(h(1), 'XLim', [0,1000000]);
set(h(1), 'XTick', [0,1,10,100,1000,10000,100000,1000000]); % 设置横坐标刻度
set(h(1), 'YLim', [-40, 0]); % 设置纵坐标范围
set(h(1), 'YTick',[-40,-30,-20,-10,0]); % 设置纵坐标刻度
% 设置相位图的横纵坐标显示值
set(h(2), 'XScale', 'log'); % 设置横坐标为对数刻度
set(h(1), 'XLim', [1,1000000]);
set(h(2), 'XTick', [0,1,10,100,1000,10000,100000,1000000]); % 设置横坐标刻度
%set(h(2), 'YLim', [0, 90]); % 设置纵坐标范围
set(h(2), 'YTick', [0,15,30,45,60,75,90]); % 设置纵坐标刻度
% 计算截止频率
%RC = 1 / abs(p); % 截止频率为极点的绝对值的倒数
cutoff_freq = 1 / (2 * pi * R*C); % 截止频率(Hz)
% 在增益图上标示零点和极点
for i = 1:length(h)
if i == 1 % 增益图
% 标示零点
for j = 1:length(z)
if ~isinf(z(j)) % 排除无穷大
hold on;
% 将零点从弧度转换为赫兹
freq_hz = real(z(j)) / (2 * pi);
plot([freq_hz, freq_hz], [-90, 90], 'r--'); % 画虚线
text(freq_hz, 90, sprintf('Zero: %.2f Hz', freq_hz), 'Color', 'r'); % 添加文本标注
end
end
% 标示极点
for j = 1:length(p)
if ~isinf(p(j)) % 排除无穷大
hold on;
% 计算频率
freq_hz = (p(j)) / (2 * pi); % 使用虚部计算频率
% 处理负频率
if freq_hz < 0
freq_hz_positive = -freq_hz; % 转换为正频率
else
freq_hz_positive = freq_hz; % 保持正频率
end
% 标示正频率
plot([freq_hz_positive, freq_hz_positive], [-100, 10], 'g--'); % 画虚线
text(freq_hz_positive, 80, sprintf('Pole: %.2f Hz', freq_hz_positive), 'Color', 'g'); % 添加文本标注
end
end
% 标示截止频率
%hold on;
%plot([cutoff_freq, cutoff_freq], [-90, 90], ':'); % 画截止频率虚线
%text(cutoff_freq, -70, sprintf('Cutoff: %.2f Hz', cutoff_freq), 'Color', 'b');
elseif i == 2 % 增益图
% 标示零点
for j = 1:length(z)
if ~isinf(z(j)) % 排除无穷大
hold on;
% 将零点从弧度转换为赫兹
freq_hz = real(z(j)) / (2 * pi);
plot([freq_hz, freq_hz], [-90, 90], 'r--'); % 画虚线
text(freq_hz, 90, sprintf('Zero: %.2f Hz', freq_hz), 'Color', 'r'); % 添加文本标注
end
end
% 标示极点
for j = 1:length(p)
if ~isinf(p(j)) % 排除无穷大
hold on;
% 计算频率
freq_hz = (p(j)) / (2 * pi); % 使用虚部计算频率
% 处理负频率
if freq_hz < 0
freq_hz_positive = -freq_hz; % 转换为正频率
else
freq_hz_positive = freq_hz; % 保持正频率
end
% 标示正频率
plot([freq_hz_positive, freq_hz_positive], [-100, 10], 'g--'); % 画虚线
text(freq_hz_positive, -80, sprintf('Pole: %.2f Hz', freq_hz_positive), 'Color', 'g'); % 添加文本标注
end
end
% 标示截止频率
hold on;
plot([cutoff_freq, cutoff_freq], [-90, 90], ':'); % 画截止频率虚线
text(cutoff_freq, 70, sprintf('Cutoff: %.2f Hz', cutoff_freq), 'Color', 'b');
end
end