annotate aim-mat/tools/GenerateSpiralFrom.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
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