我暂时没有使用过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 Hz
和7500 Hz
标记值,或者更具体,点(600,20)
和(7500,-71)
,两者都应位于曲线。出于某种原因,freqs
不允许我这样做。
答案 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;
我们得到了这个:
如果你检查freqs
为你生成了什么,你会发现我们得到了同样的东西,但是幅度是增益(V / V)而不是dB。如果你想要它在V / V中,那么只需绘制没有20*log10()
调用的幅度。使用您的数据时,我绘制的标记不在图表上(wpt
和mpt
),因此请将点数调整为您认为合适的值。
答案 1 :(得分:0)
在我们尝试回答您的问题之前,有几个问题。首先,没有600Hz或7500Hz的数据点。使用freqs命令绘制图形时,这些频率落在数据点之间。请参见下图,交互式添加数据提示。我复制粘贴您的代码以生成此数据。
其次,似乎(600,20)或(7500,-71)不在曲线上,至少与您在上面输入的数据有关。
一种解决方案是在所需位置使用标记,并使用"文本" object添加描述该点的字符串。我使用你的数据整理了一个脚本,以生成这个数字:
代码如下:
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);