1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) 2010 - INRIA - Serge STEER
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution. The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
function hallchart(modules,args,colors)
defaultmodules=[-20 -10 -6 -4 -2 2 4 6 10 20];//in dB
defaultargs=[-90 -60 -45 -30 -15 15 30 45 60 90]; //in degree
defaultbounds=[-3.5 -2;3 2];
if exists("modules","local")==0 then
modules=defaultmodules
else
if type(modules)|~isreal(modules)<>1 then
error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","modules");
end
modules=matrix(modules,1,-1)
end
if exists("args","local")==0 then
args=defaultargs
else
if type(args)<>1|~isreal(args) then
error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","args");
end
args=matrix(args,1,-1)
end
if exists("colors","local")==0 then
colors=[4 12];
else
if type(colors)<>1|~isreal(colors) then
error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","colors");
end
if size(colors,"*")==1 then
colors=colors*ones(1,2)
end
end
fig=gcf();
immediate_drawing=fig.immediate_drawing;
fig.immediate_drawing="off";
ax=gca();
nc=size(ax.children,"*")
if nc==0 then
ax.data_bounds=defaultbounds;
ax.axes_visible="on";
ax.x_label.text=_("Real axis");
ax.y_label.text=_("Imaginary axis");
ax.title.text=_("Hall chart")
ax.box="on";
end
//iso modules circles. Circles whose center are (-M^2/(M^2-1),0) and
//radius M/(M^2-1) with M=|H(jw)| and H=G/(1+G)
M=exp(log(10)*modules/20)
radius=M./(M.*M-ones(M))
xc=-M.*radius
yc=0
radius=abs(radius)
//arcs replaced by polylines to be able to use datatips
// xarcs([xc-radius;yc+radius;2*radius;2*radius;0*M;360*64*ones(M)])
// A=gce()
// E=unglue(A);
w=linspace(0,2*%pi,200)
c=cos(w);s=sin(w)
chart_handles=[]
for i=1:size(M,"*")
xpoly(xc(i)+radius(i)*c,yc+radius(i)*s)
ec=gce();
ec.foreground=colors(1);
ec.line_style=7;
ec.clip_state="clipgrf";
ec.display_function = "formatHallModuleTip";
ec.display_function_data = modules(i);
if 2*int(i/2)==i then
xs=xc(i)+radius(i)*cos(%pi/6)
ys=yc+radius(i)*sin(%pi/6)
else
xs=xc(i)+radius(i)*cos(-%pi/6)
ys=yc+radius(i)*sin(-%pi/6)
end
xstring(xs,ys,string(modules(i))+_("dB"));
el=gce();
el.font_foreground=colors(1);
el.clip_state="clipgrf";
chart_handles=[glue([el ec]) chart_handles];
end
//iso phase circles. Circles whose center are (-1/2, 1/(2*N)) and
//radius sqrt(1+N^2)/(2*N) with N=tan(arg(H(-jw)))
N=tan(args*%pi/180);
radius=sqrt(1+N.^2)./(2*N);
xc=-1/2;
yc=1 ./(2*N);
// xarcs([xc-radius;yc+radius;2*radius;2*radius;0*N;360*64*ones(N)])
// E=unglue(gce());
for i=1:size(N,"*")
xpoly(xc+radius(i)*c,yc(i)+radius(i)*s);ec=gce();
ec.foreground=colors(2);
ec.line_style=7;
ec.clip_state="clipgrf";
ec.display_function = "formatHallPhaseTip";
ec.display_function_data = args(i);
xstring(xc,yc(i)+radius(i),msprintf("%g°",args(i)));
el=gce();
el.font_foreground=colors(2);
el.clip_state="clipgrf";
chart_handles=[glue([el ec]) chart_handles];
end
chart_handles=glue(chart_handles)
//reorder axes children to make chart drawn before the previously
// drawn curves if any
for k=1:nc
swap_handles(ax.children(k),ax.children(k+1))
end
fig.immediate_drawing=immediate_drawing;
endfunction
|