tomwalters@0: % tool tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % tomwalters@0: % bleeck@3: % (c) 2011, University of Southampton bleeck@3: % Maintained by Stefan Bleeck (bleeck@gmail.com) bleeck@3: % download of current version is on the soundsoftware site: bleeck@3: % http://code.soundsoftware.ac.uk/projects/aimmat bleeck@3: % documentation and everything is on http://www.acousticscale.org bleeck@3: tomwalters@0: tomwalters@0: function sp=GenerateSpiralFrom(input,spiral_struct) tomwalters@0: tomwalters@0: global threshold; tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'threshold'); tomwalters@0: threshold=20; % all pitches below this value are cut off tomwalters@0: else tomwalters@0: threshold=spiral_struct.threshold; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'tilt_amount'); tomwalters@0: tilt_amount=0; % bedeutet fall of 2500% per second, eg 100% in 40 ms tomwalters@0: else tomwalters@0: tilt_amount=spiral_struct.tilt_amount; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'max_frequency'); tomwalters@0: max_frequency=5000; % the outer end of the pitch spiral tomwalters@0: else tomwalters@0: max_frequency=spiral_struct.max_frequency; tomwalters@0: max_time=-1/max_frequency; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'overlap'); tomwalters@0: overlap=0; % the outer end of the pitch spiral tomwalters@0: else tomwalters@0: overlap=spiral_struct.overlap; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'tilt'); tomwalters@0: tilt=0; % the outer end of the pitch spiral tomwalters@0: else tomwalters@0: tilt=spiral_struct.tilt; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'start_radius'); tomwalters@0: start_radius=3; % the outer end of the pitch spiral tomwalters@0: else tomwalters@0: start_radius=spiral_struct.start_radius; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'biggest_dot'); tomwalters@0: biggest_dot=10; % points tomwalters@0: else tomwalters@0: biggest_dot=spiral_struct.biggest_dot; tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'min_frequency'); tomwalters@0: fr=input; tomwalters@0: max_time=getmaximumtime(fr); tomwalters@0: min_time=getminimumtime(fr); tomwalters@0: tomwalters@0: absmax_time=getmaximumtime(fr); tomwalters@0: absmin_time=getminimumtime(fr); tomwalters@0: tomwalters@0: if min_time < 0 & max_time > 0 % normalfall: -35 bis 5 tomwalters@0: absmin_time=abs(min_time); % die ist normalerweise -35 ms tomwalters@0: absmax_time=1/max_frequency; % Standartwert, entspricht 5 kHz tomwalters@0: max_time=-absmax_time; tomwalters@0: end tomwalters@0: tomwalters@0: if absmin_time<0 tomwalters@0: error('generatefrom(frame): minimum time must be greater 0!'); tomwalters@0: end tomwalters@0: if absmax_time<0 tomwalters@0: error('generatefrom(frame): maximum time must be greater 0!'); tomwalters@0: end tomwalters@0: tomwalters@0: min_frequency=1/absmin_time; tomwalters@0: max_frequency=1/absmax_time; tomwalters@0: else tomwalters@0: min_frequency=spiral_struct.min_frequency; tomwalters@0: min_time=-1/min_frequency; tomwalters@0: end tomwalters@0: tomwalters@0: if min_frequency>max_frequency tomwalters@0: error('generateSpiralFrom: minfre > maxfre!') tomwalters@0: end tomwalters@0: tomwalters@0: sp=spiral(min_frequency,max_frequency); tomwalters@0: sp=setoverlap(sp,overlap); tomwalters@0: sp=settilt(sp,tilt); tomwalters@0: sp=setstartradius(sp,start_radius); tomwalters@0: heightscaler=getnroctaves(sp); tomwalters@0: sp=setscaleheight(sp,heightscaler); tomwalters@0: sp=setorginalvalues(sp,input); tomwalters@0: tomwalters@0: if ~isfield(spiral_struct,'plotwithdots'); tomwalters@0: sp=setplotwithdots(sp,'y'); % all pitches below this value are cut off tomwalters@0: else tomwalters@0: sp=setplotwithdots(sp,spiral_struct.plotwithdots); % all pitches below this value are cut off tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if isoftype(input,'frame') tomwalters@0: nr_chan=getnrchannels(input); tomwalters@0: for i=1:nr_chan tomwalters@0: sig=getsinglechannel(input,i); tomwalters@0: if tilt_amount>0 tomwalters@0: sig=tilt(sig,tilt_amount); tomwalters@0: end tomwalters@0: [heights,maxima]=getlocalmaxima(sig); tomwalters@0: tomwalters@0: nr=length(heights); tomwalters@0: for j=1:nr tomwalters@0: if maxima(j) > min_time & maxima(j) < max_time tomwalters@0: shift=1-(i-1)/(nr_chan+1); tomwalters@0: sp=addmax(sp,shift,heights(j),maxima(j)); tomwalters@0: end tomwalters@0: end tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: if isoftype(input,'signal') tomwalters@0: if tilt_amount>0 tomwalters@0: sig=tilt(input,tilt_amount); tomwalters@0: else tomwalters@0: sig=input; tomwalters@0: end tomwalters@0: [heights,maxima]=getlocalmaxima(sig,min_time,max_time); tomwalters@0: sp=addmax(sp,0,heights,maxima); tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: % now all points are there, but we have to find out about the real size tomwalters@0: lmin=log(getminimumfrequency(sp)); tomwalters@0: lmax=log(getmaximumfrequency(sp)); tomwalters@0: step=(lmax-lmin)/200; tomwalters@0: ran=lmin:step:lmax; tomwalters@0: range=exp(ran); tomwalters@0: tomwalters@0: [x,y,z]=getcoordinates(sp,getmaximumfrequency(sp)); tomwalters@0: if abs(y) > abs(x) tomwalters@0: maxscale=abs(y); tomwalters@0: else tomwalters@0: maxscale=abs(x); tomwalters@0: end tomwalters@0: tomwalters@0: % first find the size of the unscaled version tomwalters@0: scale_x=0.15*(getscreensize(sp)-2*getedgemargin(sp))/maxscale; tomwalters@0: scale_y=0.15*(getscreensize(sp)-2*getedgemargin(sp))/maxscale; tomwalters@0: % and set this as the scale tomwalters@0: sp=setscalex(sp,scale_x); tomwalters@0: sp=setscaley(sp,scale_y); tomwalters@0: tomwalters@0: tomwalters@0: % add the spiral itself tomwalters@0: tomwalters@0: [x1,y1,z1]=getcoordinates(sp,range); % inner circel tomwalters@0: [x2,y2,z2]=getcoordinates(sp,range,1); % outer circel tomwalters@0: tomwalters@0: cords.x=[];cords.y=[];cords.z=[]; tomwalters@0: nr=max(size(y1)); tomwalters@0: tomwalters@0: for i=1:nr tomwalters@0: cords.x=[cords.x; x1(i) x2(i)]; tomwalters@0: cords.y=[cords.y; y1(i) y2(i)]; tomwalters@0: cords.z=[cords.z; z1(i) z2(i)]; tomwalters@0: end tomwalters@0: tomwalters@0: obj.coordinates=cords; tomwalters@0: obj.type='spiral'; tomwalters@0: tomwalters@0: sp=addsurfobject(sp,obj); tomwalters@0: tomwalters@0: return tomwalters@0: tomwalters@0: tomwalters@0: function sp=addmax(sp,shift,heights,maxima) tomwalters@0: global threshold; tomwalters@0: nr=size(heights,2); tomwalters@0: for i=1:nr tomwalters@0: if heights(i) > threshold tomwalters@0: mafre=maxima(i); tomwalters@0: if mafre > 0 tomwalters@0: error('GenerateSpiralFrom: addmax: error: frequency negativ'); tomwalters@0: end tomwalters@0: newdot.frequency=1/-mafre; tomwalters@0: newdot.pitchstrength=heights(i); tomwalters@0: newdot.octave_shift=shift; tomwalters@0: newdot.color='r'; tomwalters@0: sp=adddots(sp,newdot); tomwalters@0: end tomwalters@0: end