gpt4 book ai didi

matlab - 如何在 Matlab 中绘制带通滤波器传递函数的频率响应?

转载 作者:行者123 更新时间:2023-12-03 08:00:10 25 4
gpt4 key购买 nike

我想编写一个脚本来绘制带通滤波器的传递函数 [H(f)] 的图形,|H(f)|相对于频率和 H(f)(度)相对于频率的相位,我对 matlab 非常陌生,所以语法不是 100%,我很困惑,因为一切都以矩阵形式自动格式化。下面是我的脚本:

% RCL circuit: band-pass filter
R=55590; L=0.9571; C=48.811*10.^(-9); % values of the Resistor and Capacitor
f=(0:60e3); w=2*pi*f; % frequency (f) range of measurements
H=(R./(sqrt(R^2+(w*L-(1./(w*C))).^2))); % Transfer Function

% Magnitude (absolute value) of the transfer function
plot(f,abs(H),'LineWidth',2); grid on; hold on
xlabel('Frequency [Hz]','FontSize',20); ylabel('|H(f)|','FontSize',20)

plot(f,angle(H)*180/pi,'LineWidth',2); grid on; hold on
xlabel('Frequency [Hz]','FontSize',18);
ylabel('phase of H(f) [degrees]','FontSize',20)

这是我使用的传递函数公式 enter image description here

下面是我的实验结果和预期图表的另一张图片,我只是不明白为什么 MATLAB 没有绘制出我想要的结果? enter image description here

最佳答案

您知道bodeplot吗?功能?

简单二阶带通的传递函数为:

enter image description here

您只需将值插入 Matlab 的 tf 函数并使用 bodeplot 绘制它:

R = 55590;
L = 0.9571;
C = 48.811*10.^(-9);

% tf creates transfer function object
sys = tf( [R*C 0] , [L*C R*C 1]); % [R*C 0] vector of numerator coeffcients
% R*C*s + 0*1
% [L*C R*C 1] vector of denominator coeff.
% L*C*s^2 + R*C*s + 0*1

bodeplot(sys) % plot command to plot frequency response
% of magnitude and phase

它绘制了:

enter image description here

或者,如果您需要更多输出(例如幅度和相位)作为变量,请使用 bode ,情节相等。但 bodeplot 提供了更多额外的绘图自定义选项。


关于您的评论,您需要一个线性轴:

您只需在绘图命令之前添加以下几行:

P = bodeoptions;           % handle to plot options
P.MagScale = 'linear';
P.MagUnits = 'abs';
bodeplot(sys,P) % plot command with custom options

所以看起来如下:

enter image description here

要调整频率轴限制,请使用:

P.XLim = [1 60e3];

或类似的大小:

P.YLim = [0 1];

我建议不要使用线性频率轴,但如果你真的想要它,你可以使用:

P.FreqScale = 'linear';
P.FreqUnits = 'Hz'; % optional

如果您想将实验数据与上图一起绘制,请按照 this example 操作.

使用 bode 从传递函数中获取同等格式的数据,例如实验数据,并使用 semilogx 绘制它。

freqVec = logspace(-1, 3, 5000);
[mag, phs] = bode(sys, freqVec * (2*pi));
mag = db(mag(:));
phs = phs(:);
figure;
subplot(211)
semilogx(freqVec, mag); hold on
semilogx(freqVec, experimentalDataMagnitude); hold off
grid on
title('System Bode Plot')
ylabel('Magnitude (dB)')
subplot(212)
semilogx(freqVec, phs); hold on
semilogx(freqVec, experimentalDataPhase); hold off
grid on
ylabel('Phase (deg)')
xlabel('Frequency (Hz)')

关于matlab - 如何在 Matlab 中绘制带通滤波器传递函数的频率响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com