tomwalters@0
|
1 % tool
|
tomwalters@0
|
2 %
|
tomwalters@0
|
3 % INPUT VALUES:
|
tomwalters@0
|
4 %
|
tomwalters@0
|
5 % RETURN VALUE:
|
tomwalters@0
|
6 %
|
tomwalters@0
|
7 %
|
bleeck@3
|
8 % (c) 2011, University of Southampton
|
bleeck@3
|
9 % Maintained by Stefan Bleeck (bleeck@gmail.com)
|
bleeck@3
|
10 % download of current version is on the soundsoftware site:
|
bleeck@3
|
11 % http://code.soundsoftware.ac.uk/projects/aimmat
|
bleeck@3
|
12 % documentation and everything is on http://www.acousticscale.org
|
bleeck@3
|
13
|
tomwalters@0
|
14
|
tomwalters@0
|
15 function sp=GenerateSpiralFrom(input,spiral_struct)
|
tomwalters@0
|
16
|
tomwalters@0
|
17 global threshold;
|
tomwalters@0
|
18
|
tomwalters@0
|
19 if ~isfield(spiral_struct,'threshold');
|
tomwalters@0
|
20 threshold=20; % all pitches below this value are cut off
|
tomwalters@0
|
21 else
|
tomwalters@0
|
22 threshold=spiral_struct.threshold;
|
tomwalters@0
|
23 end
|
tomwalters@0
|
24
|
tomwalters@0
|
25 if ~isfield(spiral_struct,'tilt_amount');
|
tomwalters@0
|
26 tilt_amount=0; % bedeutet fall of 2500% per second, eg 100% in 40 ms
|
tomwalters@0
|
27 else
|
tomwalters@0
|
28 tilt_amount=spiral_struct.tilt_amount;
|
tomwalters@0
|
29 end
|
tomwalters@0
|
30
|
tomwalters@0
|
31 if ~isfield(spiral_struct,'max_frequency');
|
tomwalters@0
|
32 max_frequency=5000; % the outer end of the pitch spiral
|
tomwalters@0
|
33 else
|
tomwalters@0
|
34 max_frequency=spiral_struct.max_frequency;
|
tomwalters@0
|
35 max_time=-1/max_frequency;
|
tomwalters@0
|
36 end
|
tomwalters@0
|
37
|
tomwalters@0
|
38 if ~isfield(spiral_struct,'overlap');
|
tomwalters@0
|
39 overlap=0; % the outer end of the pitch spiral
|
tomwalters@0
|
40 else
|
tomwalters@0
|
41 overlap=spiral_struct.overlap;
|
tomwalters@0
|
42 end
|
tomwalters@0
|
43
|
tomwalters@0
|
44 if ~isfield(spiral_struct,'tilt');
|
tomwalters@0
|
45 tilt=0; % the outer end of the pitch spiral
|
tomwalters@0
|
46 else
|
tomwalters@0
|
47 tilt=spiral_struct.tilt;
|
tomwalters@0
|
48 end
|
tomwalters@0
|
49
|
tomwalters@0
|
50 if ~isfield(spiral_struct,'start_radius');
|
tomwalters@0
|
51 start_radius=3; % the outer end of the pitch spiral
|
tomwalters@0
|
52 else
|
tomwalters@0
|
53 start_radius=spiral_struct.start_radius;
|
tomwalters@0
|
54 end
|
tomwalters@0
|
55
|
tomwalters@0
|
56 if ~isfield(spiral_struct,'biggest_dot');
|
tomwalters@0
|
57 biggest_dot=10; % points
|
tomwalters@0
|
58 else
|
tomwalters@0
|
59 biggest_dot=spiral_struct.biggest_dot;
|
tomwalters@0
|
60 end
|
tomwalters@0
|
61
|
tomwalters@0
|
62
|
tomwalters@0
|
63 if ~isfield(spiral_struct,'min_frequency');
|
tomwalters@0
|
64 fr=input;
|
tomwalters@0
|
65 max_time=getmaximumtime(fr);
|
tomwalters@0
|
66 min_time=getminimumtime(fr);
|
tomwalters@0
|
67
|
tomwalters@0
|
68 absmax_time=getmaximumtime(fr);
|
tomwalters@0
|
69 absmin_time=getminimumtime(fr);
|
tomwalters@0
|
70
|
tomwalters@0
|
71 if min_time < 0 & max_time > 0 % normalfall: -35 bis 5
|
tomwalters@0
|
72 absmin_time=abs(min_time); % die ist normalerweise -35 ms
|
tomwalters@0
|
73 absmax_time=1/max_frequency; % Standartwert, entspricht 5 kHz
|
tomwalters@0
|
74 max_time=-absmax_time;
|
tomwalters@0
|
75 end
|
tomwalters@0
|
76
|
tomwalters@0
|
77 if absmin_time<0
|
tomwalters@0
|
78 error('generatefrom(frame): minimum time must be greater 0!');
|
tomwalters@0
|
79 end
|
tomwalters@0
|
80 if absmax_time<0
|
tomwalters@0
|
81 error('generatefrom(frame): maximum time must be greater 0!');
|
tomwalters@0
|
82 end
|
tomwalters@0
|
83
|
tomwalters@0
|
84 min_frequency=1/absmin_time;
|
tomwalters@0
|
85 max_frequency=1/absmax_time;
|
tomwalters@0
|
86 else
|
tomwalters@0
|
87 min_frequency=spiral_struct.min_frequency;
|
tomwalters@0
|
88 min_time=-1/min_frequency;
|
tomwalters@0
|
89 end
|
tomwalters@0
|
90
|
tomwalters@0
|
91 if min_frequency>max_frequency
|
tomwalters@0
|
92 error('generateSpiralFrom: minfre > maxfre!')
|
tomwalters@0
|
93 end
|
tomwalters@0
|
94
|
tomwalters@0
|
95 sp=spiral(min_frequency,max_frequency);
|
tomwalters@0
|
96 sp=setoverlap(sp,overlap);
|
tomwalters@0
|
97 sp=settilt(sp,tilt);
|
tomwalters@0
|
98 sp=setstartradius(sp,start_radius);
|
tomwalters@0
|
99 heightscaler=getnroctaves(sp);
|
tomwalters@0
|
100 sp=setscaleheight(sp,heightscaler);
|
tomwalters@0
|
101 sp=setorginalvalues(sp,input);
|
tomwalters@0
|
102
|
tomwalters@0
|
103 if ~isfield(spiral_struct,'plotwithdots');
|
tomwalters@0
|
104 sp=setplotwithdots(sp,'y'); % all pitches below this value are cut off
|
tomwalters@0
|
105 else
|
tomwalters@0
|
106 sp=setplotwithdots(sp,spiral_struct.plotwithdots); % all pitches below this value are cut off
|
tomwalters@0
|
107 end
|
tomwalters@0
|
108
|
tomwalters@0
|
109
|
tomwalters@0
|
110 if isoftype(input,'frame')
|
tomwalters@0
|
111 nr_chan=getnrchannels(input);
|
tomwalters@0
|
112 for i=1:nr_chan
|
tomwalters@0
|
113 sig=getsinglechannel(input,i);
|
tomwalters@0
|
114 if tilt_amount>0
|
tomwalters@0
|
115 sig=tilt(sig,tilt_amount);
|
tomwalters@0
|
116 end
|
tomwalters@0
|
117 [heights,maxima]=getlocalmaxima(sig);
|
tomwalters@0
|
118
|
tomwalters@0
|
119 nr=length(heights);
|
tomwalters@0
|
120 for j=1:nr
|
tomwalters@0
|
121 if maxima(j) > min_time & maxima(j) < max_time
|
tomwalters@0
|
122 shift=1-(i-1)/(nr_chan+1);
|
tomwalters@0
|
123 sp=addmax(sp,shift,heights(j),maxima(j));
|
tomwalters@0
|
124 end
|
tomwalters@0
|
125 end
|
tomwalters@0
|
126 end
|
tomwalters@0
|
127 end
|
tomwalters@0
|
128
|
tomwalters@0
|
129 if isoftype(input,'signal')
|
tomwalters@0
|
130 if tilt_amount>0
|
tomwalters@0
|
131 sig=tilt(input,tilt_amount);
|
tomwalters@0
|
132 else
|
tomwalters@0
|
133 sig=input;
|
tomwalters@0
|
134 end
|
tomwalters@0
|
135 [heights,maxima]=getlocalmaxima(sig,min_time,max_time);
|
tomwalters@0
|
136 sp=addmax(sp,0,heights,maxima);
|
tomwalters@0
|
137 end
|
tomwalters@0
|
138
|
tomwalters@0
|
139
|
tomwalters@0
|
140 % now all points are there, but we have to find out about the real size
|
tomwalters@0
|
141 lmin=log(getminimumfrequency(sp));
|
tomwalters@0
|
142 lmax=log(getmaximumfrequency(sp));
|
tomwalters@0
|
143 step=(lmax-lmin)/200;
|
tomwalters@0
|
144 ran=lmin:step:lmax;
|
tomwalters@0
|
145 range=exp(ran);
|
tomwalters@0
|
146
|
tomwalters@0
|
147 [x,y,z]=getcoordinates(sp,getmaximumfrequency(sp));
|
tomwalters@0
|
148 if abs(y) > abs(x)
|
tomwalters@0
|
149 maxscale=abs(y);
|
tomwalters@0
|
150 else
|
tomwalters@0
|
151 maxscale=abs(x);
|
tomwalters@0
|
152 end
|
tomwalters@0
|
153
|
tomwalters@0
|
154 % first find the size of the unscaled version
|
tomwalters@0
|
155 scale_x=0.15*(getscreensize(sp)-2*getedgemargin(sp))/maxscale;
|
tomwalters@0
|
156 scale_y=0.15*(getscreensize(sp)-2*getedgemargin(sp))/maxscale;
|
tomwalters@0
|
157 % and set this as the scale
|
tomwalters@0
|
158 sp=setscalex(sp,scale_x);
|
tomwalters@0
|
159 sp=setscaley(sp,scale_y);
|
tomwalters@0
|
160
|
tomwalters@0
|
161
|
tomwalters@0
|
162 % add the spiral itself
|
tomwalters@0
|
163
|
tomwalters@0
|
164 [x1,y1,z1]=getcoordinates(sp,range); % inner circel
|
tomwalters@0
|
165 [x2,y2,z2]=getcoordinates(sp,range,1); % outer circel
|
tomwalters@0
|
166
|
tomwalters@0
|
167 cords.x=[];cords.y=[];cords.z=[];
|
tomwalters@0
|
168 nr=max(size(y1));
|
tomwalters@0
|
169
|
tomwalters@0
|
170 for i=1:nr
|
tomwalters@0
|
171 cords.x=[cords.x; x1(i) x2(i)];
|
tomwalters@0
|
172 cords.y=[cords.y; y1(i) y2(i)];
|
tomwalters@0
|
173 cords.z=[cords.z; z1(i) z2(i)];
|
tomwalters@0
|
174 end
|
tomwalters@0
|
175
|
tomwalters@0
|
176 obj.coordinates=cords;
|
tomwalters@0
|
177 obj.type='spiral';
|
tomwalters@0
|
178
|
tomwalters@0
|
179 sp=addsurfobject(sp,obj);
|
tomwalters@0
|
180
|
tomwalters@0
|
181 return
|
tomwalters@0
|
182
|
tomwalters@0
|
183
|
tomwalters@0
|
184 function sp=addmax(sp,shift,heights,maxima)
|
tomwalters@0
|
185 global threshold;
|
tomwalters@0
|
186 nr=size(heights,2);
|
tomwalters@0
|
187 for i=1:nr
|
tomwalters@0
|
188 if heights(i) > threshold
|
tomwalters@0
|
189 mafre=maxima(i);
|
tomwalters@0
|
190 if mafre > 0
|
tomwalters@0
|
191 error('GenerateSpiralFrom: addmax: error: frequency negativ');
|
tomwalters@0
|
192 end
|
tomwalters@0
|
193 newdot.frequency=1/-mafre;
|
tomwalters@0
|
194 newdot.pitchstrength=heights(i);
|
tomwalters@0
|
195 newdot.octave_shift=shift;
|
tomwalters@0
|
196 newdot.color='r';
|
tomwalters@0
|
197 sp=adddots(sp,newdot);
|
tomwalters@0
|
198 end
|
tomwalters@0
|
199 end
|