view aim-mat/tools/@frame/frequencysharpening.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 74dedb26614d
children
line wrap: on
line source
% 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