Mercurial > hg > aimmat
diff aim-mat/tools/@frame/frequencysharpening.m @ 0:74dedb26614d
Initial checkin of AIM-MAT version 1.5 (6.4.2011).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 12:32:31 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aim-mat/tools/@frame/frequencysharpening.m Fri May 20 12:32:31 2011 +0100 @@ -0,0 +1,125 @@ +% method of class @frame +% +% INPUT VALUES: +% +% RETURN VALUE: +% +% +% (c) 2003, University of Cambridge, Medical Research Council +% Stefan Bleeck (stefan@bleeck.de) +% http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual +% $Date: 2003/01/17 16:57:46 $ +% $Revision: 1.3 $ + +function ret=frequencysharpening(current_frame,options) +% frequency sharpening does local lateral inhibition according to its +% parameters + + +if nargin < 2 + options=[]; +end + + +if isfield(options,'excitatory_area') % how many erbs the excitation lasts + excitatory_area=options.excitatory_area; +else + excitatory_area=0.5; +end + +if isfield(options,'grafix') % how many erbs the excitation lasts + grafix=options.grafix; +else + grafix=0; +end + +if isfield(options,'inhibitory_area') % how many erbs the inhibition lasts + inhibitory_area=options.inhibitory_area; +else + inhibitory_area=1.5; +end + +if isfield(options,'inhibitory_influence') % how strong the inhibition is + inhibitory_influence=options.inhibitory_influence; +else + inhibitory_influence=0.2; +end + + +cfs=getcf(current_frame); +EarQ = 9.26449; % Glasberg and Moore Parameters +minBW = 24.7; +order = 1; +ERB = ((cfs/EarQ).^order + minBW^order).^(1/order); +B=1.019*2*pi.*ERB; + +vals=getvalues(current_frame); +nr_chan=size(vals,1); +nr_dots=size(vals,2); +new_vals=zeros(size(vals)); + +% calculate the interchannel crossinfluence for each channel +erb1=21.4*log10(4.73e-3*cfs(1)+1); % from Glasberg,Moore 1990 +erb2=21.4*log10(4.73e-3*cfs(nr_chan)+1); +nr_erbs=erb2-erb1; +erb_density=nr_chan/nr_erbs; +neighbourinfluence=zeros(nr_chan); +if grafix + figure(2) + clf +end +for i=1:nr_chan % through all channels: prepare working variable + count=1; + for j=i-nr_chan:i+nr_chan % calculate the influence of all channels + if j>0 & j< nr_chan + dist=abs(i-j); % we are symmetric + disterbs=dist/erb_density; % so many erbs between the channel and me + + % the function(disterbs) to describe the influence of + % neighbouring channels: + % final=1/disterbs; + + % Mexican hat function: + % p=disterbs*disterbs/(threshold_decay_halflife*threshold_decay_halflife); + % version with power + % final=(2-p)*exp(-0.5*p); + % version with difference from gaussians: + p1=disterbs*disterbs/(excitatory_area*excitatory_area); + p2=disterbs*disterbs/(inhibitory_area*inhibitory_area); + final=exp(-p1)-inhibitory_influence*exp(-p2); + + neighbourinfluence(i,count)=final; + count=count+1; + end + end + % normalize it + % scale=1/sum(neighbourinfluence(i,:)); + % neighbourinfluence(i,:)=neighbourinfluence(i,:)*scale; + if grafix + figure(2) + plot(neighbourinfluence(i,:)); hold on + if i==30 + plot(neighbourinfluence(i,:),'.-r','linewidth',3); hold on + end + end +end + +for i=1:nr_dots % through the time + for j=1:nr_chan % through all channels: prepare working variable + new_vals(:,i)=new_vals(:,i)+vals(:,i).*neighbourinfluence(:,j); + end +end + +s=getfrequencysum(current_frame); +current_frame=setvalues(current_frame,new_vals); + +ret=current_frame; + +if grafix + figure(3) ;clf; + s2=getfrequencysum(current_frame); + plot(s); hold on + ax=axis; + plot(s2,'.-r'); + axis([0 58 0 40000]); +end