MATLAB quickie:如何在频率图上绘制标记?

时间:2015-03-11 04:37:57

标签: matlab marker

我暂时没有使用过MATLAB,而且我只是停留在一个小细节上。如果有人能帮帮我,我真的很感激!

因此,我尝试使用名为freqs的特定函数绘制传递函数,但我无法弄清楚如何在图表上标记特定点。

b = [0 0 10.0455];      % Numerator coefficients
a = [(1/139344) (1/183.75) 1];    % Denominator coefficients
w = logspace(-3,5); % Frequency vector
freqs(b,a,w)
grid on

我希望使用标记在点x=600 Hz7500 Hz标记值,或者更具体,点(600,20)(7500,-71),两者都应位于曲线。出于某种原因,freqs不允许我这样做。

2 个答案:

答案 0 :(得分:2)

freqs非常有限,当你想依靠它为你绘制频率响应时。基本上,您无法控制如何在MATLAB为您生成的内容之上修改图形。

相反,您自己在矢量中生成输出响应,然后自己绘制输出的幅度和相位,以便您完全控制。如果在调用freqs时指定输出,您将获得系统的响应。

有了这个,你可以找到abs的输出幅度和angle的相位。 BTW,(600,20)(7500,-71)完全没有意义,除非你在谈论以dB为单位的幅度......我现在假设是这种情况。

因此,我们可以通过以下方式重现freqs给出的图。关键是使用semilogx在x轴上获得半对数图。除此之外,请声明要在幅度上标记的那些点,因此(600,20)(7500,-71)

%// Your code:
b = [0 0 10.0455];      % Numerator coefficients
a = [(1/139344) (1/183.75) 1];    % Denominator coefficients
w = logspace(-3,5); % Frequency vector

%// New code
h = freqs(b,a,w); %// Output of freqs
mag = 20*log10(abs(h)); %// Magnitude in dB
pha = (180/pi)*angle(h); %// Phase in degrees

%// Declare points
wpt = [600, 7500];
mpt = [20, -71];

%// Plot the magnitude as well as markers
figure;
subplot(2,1,1);
semilogx(w, mag, wpt, mpt, 'r.');
xlabel('Frequency');
ylabel('Magnitude (dB)');
grid;

%// Plot phase
subplot(2,1,2);
semilogx(w, pha);
xlabel('Frequency');
ylabel('Phase (Degrees)');
grid;

我们得到了这个:

enter image description here

如果你检查freqs为你生成了什么,你会发现我们得到了同样的东西,但是幅度是增益(V / V)而不是dB​​。如果你想要它在V / V中,那么只需绘制没有20*log10()调用的幅度。使用您的数据时,我绘制的标记不在图表上(wptmpt),因此请将点数调整为您认为合适的值。

答案 1 :(得分:0)

在我们尝试回答您的问题之前,有几个问题。首先,没有600Hz或7500Hz的数据点。使用freqs命令绘制图形时,这些频率落在数据点之间。请参见下图,交互式添加数据提示。我复制粘贴您的代码以生成此数据。

enter image description here

其次,似乎(600,20)或(7500,-71)不在曲线上,至少与您在上面输入的数据有关。

一种解决方案是在所需位置使用标记,并使用"文本" object添加描述该点的字符串。我使用你的数据整理了一个脚本,以生成这个数字:

enter image description here

代码如下:

b = [0 0 10.0455];
a = [(1/139344) (1/183.75) 1];
w = logspace(-3,5);
freqs(b,a,w)
grid on

figureHandle = gcf;
figureChildren = get ( figureHandle , 'children' ); % The children this returns may vary.
axes1Handle = figureChildren(1);
axes2Handle = figureChildren(2);
axes1Children = get(axes1Handle,'children'); % This should be a "line" object.
axes2Children = get(axes2Handle,'children'); % This should be a "line" object.

axes1XData = get(axes1Children,'xdata');
axes1YData = get(axes1Children,'ydata');

axes2XData = get(axes2Children,'xdata');
axes2YData = get(axes2Children,'ydata');

hold(axes1Handle,'on');
plot(axes1Handle,axes1XData(40),axes1YData(40),'m*');
pointString1 = ['(',num2str(axes1XData(40)),',',num2str(axes1YData(40)),')'];
handleText1 = text(axes1XData(40),axes1YData(40),pointString1,'parent',axes1Handle);

hold(axes2Handle,'on');
plot(axes2Handle,axes2XData(40),axes2YData(40),'m*');
pointString2 = ['(',num2str(axes2XData(40)),',',num2str(axes2YData(40)),')'];
handleText2 = text(axes2XData(40),axes2YData(40),pointString2,'parent',axes2Handle);
相关问题