view aim-mat/modules/usermodule/mellin/MIpack/CalMI.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
%
%	Calculation of Mellin Image from SAI3d
%	IRINO T
%	10 Jan. 2002
%  
% function  [MI3d, MIparam] = CalMI(SAI3d,NAPparam,SAIparam,MIparam)
%
%   INPUT:  SAI3d : 3D SAI
%	    NAPparam: Parameter for NAP
%	    SAIparam: Parameter for SAI
%	    MIparam: Parameter for MI
%   OUTPUT: MI3d: 3D Mellin Image
%
function  [MI3d, MIparam] = CalMI(SAI3d,NAPparam,SAIparam,MIparam)

%%%%%%%%%
if nargin < 4, MIparam = []; end;
if isfield(MIparam,'NSAIPhsCmp') == 0,  MIparam.NSAIPhsCmp = [];   end;
if length(MIparam.NSAIPhsCmp) == 0, 
	MIparam.NSAIPhsCmp  = 0; %was 2 but now window is causal - Rich
end;
if isfield(MIparam,'F0mode') == 0,  MIparam.F0mode = [];   end;
if length(MIparam.F0mode) == 0, 
	MIparam.F0mode = 300;   
end;
if isfield(MIparam,'TFval') == 0,  MIparam.TFval = [];   end;
if length(MIparam.TFval) == 0, 
	MIparam.TFval =  [0:0.05:15];   %was 15
end;
if isfield(MIparam,'c_2pi') == 0,  MIparam.c_2pi = [];   end;
if length(MIparam.c_2pi) == 0, 
	MIparam.c_2pi =  [0:0.05:30];
end;
if isfield(MIparam,'Mu') == 0,  MIparam.Mu = [];   end;
if length(MIparam.Mu) == 0, 
	MIparam.Mu = 0.5; % flat   if Mu <0.5: high pass, Mu>0.5 low pass
end;

[NumCh, LenSAI, LenFrame] = size(SAI3d);

Lenc2pi = length(MIparam.c_2pi);
LenTF   = length(MIparam.TFval);
%MI3d    = zeros(Lenc2pi,LenTF,LenFrame); 

disp('*** MI Calculation ***');
MIparam.RangeAudFig = [];
disp(MIparam)

%saving the SAI3d for comparison with AIM's
     savefile = 'SAI3d_Irino.mat';
     SAI3d_Irino=SAI3d/max(max(max(SAI3d)));
     save(savefile,'SAI3d_Irino');

tic
%%%%%%%% For each frame %%%%%%%%% 
for nfr = 1:LenFrame,

    SAIval = SAI3d(:,:,nfr);

    SAIPhsCmp = zeros(size(SAIval));
    for nch = 1:NumCh,
	NPeriod = NAPparam.fs/NAPparam.Frs(nch) * MIparam.NSAIPhsCmp;
	vv = [zeros(1,fix(NPeriod)), SAIval(nch,:)];
	SAIPhsCmp(nch,1:LenSAI) = vv(1:LenSAI);
 %   MI3d(:,:,nfr) = SAIPhsCmp;
    end;	

    if MIparam.F0mode == 0
	%%% F0 estimation if necessary
    else
	F0est(nfr) = MIparam.F0mode; % No estimation of F0
    end;
    ZeroLoc = abs(SAIparam.Nwidth)*NAPparam.fs/1000+1;
    % MarginAF = fix(0.3 * NAPparam.fs/1000);       % 0.3 ms margin
    MarginAF = 0;  % No margin by introducing WinAF 
    MIparam.RangeAudFig = ...
	 [ZeroLoc+[0 , (fix(NAPparam.fs/F0est(nfr))-MarginAF)]];
    %RangeAudFigKeep(1:2,nfr) = MIparam.RangeAudFig(:);
%MIparam.RangeAudFig=[1 300] %added as an experiment
    %%%%%%%% Mellin Coefficients %%%%%%%%% 

    [MImtrx] = CalMellinCoef(SAIPhsCmp,NAPparam,MIparam);
	%% 80 times faster than showSSI + showMI

    %MI3d(1:Lenc2pi,1:LenTF,nfr) = MImtrx; 
    MI3d(:,:,nfr) = MImtrx; %added line - should behave no different
    if rem(nfr, 20) == 0 | nfr == LenFrame
       disp(['Mellin Image Frame #' int2str(nfr) '/#' int2str(LenFrame) ...
	     ':  elapsed_time = ' num2str(toc,3) ' (sec)']);
	%   if SwPlot > 0, CalMI_plotImage; end;   drawnow; 
    end;


    if 0
    subplot(3,1,1)
    image(flipud(SAI3d(:,:,nfr))*5)
    subplot(3,1,2)
    image(flipud(SAIPhsCmp)*5)
    subplot(3,1,3)
    image(flipud(abs(MI3d(:,:,nfr)))*20)
    drawnow
    end;


end; %    for nfr = 1:LenFrame