在波德图中的特定点上添加标记
Adding markers on specific points in bodeplot
我目前正在设计一个 5 阶巴特沃斯滤波器,并在 Matlab 中查看其传递函数响应。我已经成功地计算了它并绘制了它的波德响应,如下所示:
% Butterworth Fifth Order Low Pass
figure(1)
h = bodeplot(FinalTF);
setoptions(h,'FreqUnits','Hz','PhaseVisible','off');
title('Butterworth LowPass Fifth Order');
grid on;
其中 FinalTF 是我所说的传递函数。我想要的是在此图中的特定点上添加标记(特别是我想突出显示频率 fp、fo、fs,你不需要知道它们是什么,它们只是 x 轴上的 3 个不同点, 以及每个频率的 dB) 和代码。我知道如何通过单击图表来完成此操作,但这太耗时了,因为我有很多图要浏览。我目前 运行 有两个基本问题:
1) 我不知道如何仅通过使用 TF 对象来获取每个频率的特定 dB。我尝试使用函数 evalfr(),但它 returns 的值似乎有点偏离。
2) 忽略前一点,即使我手动计算,我不能使用this method将它们添加到图上,我'我不确定是什么问题。也许是因为我使用的是 bodeplot 而不是常规图?不过我不知道还能怎么做。
我使用的是 Matlab 2015,如果它有什么不同的话。
如有任何帮助,我们将不胜感激。提前致谢。
您可以使用 [mag,~,wout] = bode(sys)
然后 plot(wout,mag)
来创建波德图。然后,使用 hold on
和 plot(...)
,您可以向图中添加任何需要的点。
请注意,wout
以每 TimeUnit
的弧度为单位,它是 sys
(source) 的 属性。要将 wout
转换为以赫兹为单位的频率轴,您可以在 sys
中设置 TimeUnit
使用 sys.TimeUnit = 'seconds'
(这是默认设置,因此可能没有必要)然后 f = wout/2/pi;
.使用 plot(f,mag)
绘制它,然后使用 hold on
绘制您的标记。
要计算特定频率的幅度,请使用 mag = bode(sys,w);
,其中 w
是每个 sys.TimeUnit
的弧度频率。如果 sys.TimeUnit
是 'seconds'
并且您的频率单位是赫兹,请使用 w = 2*pi*f
,其中 f
是您需要的频率。
我居然找到了解决办法。下面是一些示例代码来说明结果。在我做之前:
figure(3);
h = bodeplot(FinalTF);
setoptions(h,'FreqUnits','Hz','PhaseVisible','off');
grid on;
title('Chebyshev 2nd Order Band Pass');
它只是打印了传递函数的波特图。现在我设法将标记添加到我想要的特定频率:
figure(4);
myW = logspace(1,5,1000);
myW = 2*pi*myW;
[mag,~,wout] = bode(FinalTF,myW);
mag = squeeze(mag);
wout = squeeze(wout);
mag = 20*log10(mag);
wout = wout/2/pi;
semilogx(wout,mag,'-b');
axis([min(wout) max(wout) min(mag)-10 max(mag)+10]);
title('Chebyshev 2nd Order Band Pass');
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
grid on;
hold on;
freqMarkers = [w0 w1 w2 w3 w4];
[dbMarks,~,freqMarks] = bode(FinalTF,freqMarkers);
dbMarks = squeeze(dbMarks);
freqMarks = squeeze(freqMarks);
dbMarks = 20*log10(dbMarks);
freqMarks = freqMarks/2/pi;
semilogx(freqMarks,dbMarks,'r*');
而且效果很好!感谢@Erik 的帮助。
我目前正在设计一个 5 阶巴特沃斯滤波器,并在 Matlab 中查看其传递函数响应。我已经成功地计算了它并绘制了它的波德响应,如下所示:
% Butterworth Fifth Order Low Pass
figure(1)
h = bodeplot(FinalTF);
setoptions(h,'FreqUnits','Hz','PhaseVisible','off');
title('Butterworth LowPass Fifth Order');
grid on;
其中 FinalTF 是我所说的传递函数。我想要的是在此图中的特定点上添加标记(特别是我想突出显示频率 fp、fo、fs,你不需要知道它们是什么,它们只是 x 轴上的 3 个不同点, 以及每个频率的 dB) 和代码。我知道如何通过单击图表来完成此操作,但这太耗时了,因为我有很多图要浏览。我目前 运行 有两个基本问题:
1) 我不知道如何仅通过使用 TF 对象来获取每个频率的特定 dB。我尝试使用函数 evalfr(),但它 returns 的值似乎有点偏离。
2) 忽略前一点,即使我手动计算,我不能使用this method将它们添加到图上,我'我不确定是什么问题。也许是因为我使用的是 bodeplot 而不是常规图?不过我不知道还能怎么做。
我使用的是 Matlab 2015,如果它有什么不同的话。
如有任何帮助,我们将不胜感激。提前致谢。
您可以使用 [mag,~,wout] = bode(sys)
然后 plot(wout,mag)
来创建波德图。然后,使用 hold on
和 plot(...)
,您可以向图中添加任何需要的点。
请注意,wout
以每 TimeUnit
的弧度为单位,它是 sys
(source) 的 属性。要将 wout
转换为以赫兹为单位的频率轴,您可以在 sys
中设置 TimeUnit
使用 sys.TimeUnit = 'seconds'
(这是默认设置,因此可能没有必要)然后 f = wout/2/pi;
.使用 plot(f,mag)
绘制它,然后使用 hold on
绘制您的标记。
要计算特定频率的幅度,请使用 mag = bode(sys,w);
,其中 w
是每个 sys.TimeUnit
的弧度频率。如果 sys.TimeUnit
是 'seconds'
并且您的频率单位是赫兹,请使用 w = 2*pi*f
,其中 f
是您需要的频率。
我居然找到了解决办法。下面是一些示例代码来说明结果。在我做之前:
figure(3);
h = bodeplot(FinalTF);
setoptions(h,'FreqUnits','Hz','PhaseVisible','off');
grid on;
title('Chebyshev 2nd Order Band Pass');
它只是打印了传递函数的波特图。现在我设法将标记添加到我想要的特定频率:
figure(4);
myW = logspace(1,5,1000);
myW = 2*pi*myW;
[mag,~,wout] = bode(FinalTF,myW);
mag = squeeze(mag);
wout = squeeze(wout);
mag = 20*log10(mag);
wout = wout/2/pi;
semilogx(wout,mag,'-b');
axis([min(wout) max(wout) min(mag)-10 max(mag)+10]);
title('Chebyshev 2nd Order Band Pass');
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
grid on;
hold on;
freqMarkers = [w0 w1 w2 w3 w4];
[dbMarks,~,freqMarks] = bode(FinalTF,freqMarkers);
dbMarks = squeeze(dbMarks);
freqMarks = squeeze(freqMarks);
dbMarks = 20*log10(dbMarks);
freqMarks = freqMarks/2/pi;
semilogx(freqMarks,dbMarks,'r*');
而且效果很好!感谢@Erik 的帮助。