Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/mltfe.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ao/mltfe.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,135 @@ +% MLTFE compute log-frequency space TF +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: MLTFE compute log-frequency space TF +% +% CALL: Txy = mltfe(X,f,r,m,L,fs,win,order,olap,Lmin,method,variance) +% +% VERSION: $Id: mltfe.m,v 1.25 2009/11/27 15:18:45 miquel Exp $ +% +% HISTORY: 19-05-2007 M Hewitson +% Creation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = mltfe(varargin) + + import utils.const.* + + % Get inputs + X = varargin{1}; + f = varargin{2}; + r = varargin{3}; + m = varargin{4}; + L = varargin{5}; + K = varargin{6}; + fs = varargin{7}; + win = varargin{8}; + order = varargin{9}; + olap = varargin{10}; + Lmin = varargin{11}; + method = varargin{12}; + + % --- Prepare some variables + si = size(X); + nc = si(1); + nf = length(f); + Txy = zeros(nf,1); + dev = zeros(nf,1); + disp_each = round(nf/100)*10; + + winType = win.type; + winPsll = win.psll; + + % ----- Loop over Frequency + for fi=1:nf + [Txy(fi) dev(fi)]= computeTF(fs, L(fi), K(fi), m, winType, winPsll, X, olap, order, nc, f(fi), fi, nf, disp_each, method); + end + + % Set output + varargout{1} = Txy; + varargout{2} = dev; +end + +%-------------------------------------------------------------------------- +% Function to run over channels +function [Txy,dev]= computeTF(fs, l, K, m, winType, winPsll, X, olap, order, nc, ffi, fi, nf, disp_each, method) + + switch lower(winType) + case 'kaiser' + lwin = specwin(winType, l, winPsll); + otherwise + lwin = specwin(winType, l); + end + + % Compute DFT coefficients + twopi = 2.0*pi; + p = 1i * twopi * m(fi)/l.*[0:l-1]; + C = lwin.win .* exp(p); + + if mod(fi,disp_each) == 0 || fi == 1 || fi == nf + utils.helper.msg(utils.const.msg.PROC1, 'computing frequency %04d of %04d: %f Hz', fi, nf, ffi); + end + % Loop over input channels + [Txy,dev] = in2out(l, X, K, olap, order, nc, method, C, lwin, fs); + +end + +%-------------------------------------------------------------------------- +% Compute 1 input to multiple outputs +function [Txy,dev]= in2out(l, X, K, olap, order, nc, method, C, lwin, fs) + + % if no errors are required the function returns zero but errors are not + % stored in the final ao + dev = 0; + + switch lower(method) + case 'tfe' + % Core cross-DFT part in C-mex file + % We need cross-spectrum and Power spectrum + [XY, XX, YY, M2, nsegs] = ltpda_dft(X(1,:), X(2,:), l, C, olap, order); + Txy = conj(XY)/(XX); + if nsegs == 1 + dev = Inf; + else + dev = sqrt((nsegs/(nsegs-1)^2)*(YY./XX).*(1 - (abs(XY).^2)./(XX.*YY))); +% dP = sqrt((k/(k-1)^2)*(Pyy./Pxx).*(1 - (abs(Pxy).^2)./(Pxx.*Pyy))); + end + + case 'cpsd' + % Core cross-DFT part in C-mex file + [XY, XX, YY, M2, nsegs] = ltpda_dft(X(1,:), X(2,:), l, C, olap, order); + S1 = lwin.ws; + S2 = lwin.ws2; + Txy = 2.0*XY/fs/S2; + Var = 4.0*M2/fs^2/S2^2/nsegs; + if nsegs == 1 + dev = Inf; + else + dev = sqrt(Var); + end + + case 'mscohere' + % Core cross-DFT part in C-mex file + % We need cross-spectrum and Power spectrum + [XY, XX, YY, M2, nsegs] = ltpda_dft(X(1,:), X(2,:), l, C, olap, order); + Txy = (abs(XY).^2)./(XX.*YY); % Magnitude-squared coherence + if nsegs == 1 + dev = Inf; + else + dev = sqrt((2*Txy/nsegs).*(1-Txy).^2); + end + + case 'cohere' + % Core cross-DFT part in C-mex file + % We need cross-spectrum and Power spectrum + [XY, XX, YY, M2, nsegs] = ltpda_dft(X(1,:), X(2,:), l, C, olap, order); + Txy = XY./sqrt(XX.*YY); % Complex coherence + if nsegs == 1 + dev = Inf; + else + dev = sqrt((2*abs(Txy)/nsegs).*(1-abs(Txy)).^2); + end + end + +end