Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/mlpsd_mex.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/mlpsd_mex.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,103 @@ +% MLPSD_MEX calls the ltpda_dft.mex to compute the DFT part of the LPSD algorithm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: MLPSD_MEX calls the ltpda_dft.mex to compute the DFT part of the +% LPSD algorithm +% +% CALL: [S,Sxx,ENBW] = mlpsd_mex(x,f,r,m,L,fs,win,order,olap) +% +% VERSION: $Id: mlpsd_mex.m,v 1.13 2011/05/22 22:22:50 mauro Exp $ +% +% HISTORY: 19-05-2007 M Hewitson +% Creation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = mlpsd_mex(varargin) + + import utils.const.* + + utils.helper.msg(msg.PROC1, 'using ltpda_dft.mex to compute core DFT'); + + % Get inputs + x = varargin{1}; + f = varargin{2}; + r = varargin{3}; + m = varargin{4}; + L = varargin{5}; + fs = varargin{6}; + win = varargin{7}; + order = varargin{8}; + olap = varargin{9}; + Lmin = varargin{10}; + + twopi = 2.0*pi; + nf = length(f); + Sxx = zeros(nf,1); + S = zeros(nf,1); + ENBW = zeros(nf,1); + devxx = zeros(nf,1); + dev = zeros(nf,1); + + disp_each = round(nf/100)*10; + + winType = win.type; + winPsll = win.psll; + + minReached = 0; + + for jj = 1:nf + + if mod(jj, disp_each) == 0 || jj == 1 || jj == nf + utils.helper.msg(msg.PROC1, 'computing frequency %04d of %d: %f Hz', jj, nf, f(jj)); + end + + % compute DFT exponent and window + l = L(jj); + + % Check if we need to update the window values + % - once we reach Lmin, the window values don't change. + if ~minReached + switch lower(winType) + case 'kaiser' + win = specwin(winType, l, winPsll); + otherwise + win = specwin(winType, l); + end + if l == Lmin + minReached = 1; + end + end + + p = 1i * twopi * m(jj)/l.*(0:l-1); + C = win.win .* exp(p); + + % Core DFT part in C-mex file + [A, B,nsegs] = ltpda_dft(x, l, C, olap, order); + + if mod(jj, disp_each) == 0 || jj == 1 || jj == nf + utils.helper.msg(msg.PROC2, 'averaged %d segments', nsegs); + end + + A2ns = 2.0*A; + B2ns = 4.0*B/nsegs; + S1 = win.ws; + S12 = S1*S1; + S2 = win.ws2; + ENBW(jj) = fs*S2/S12; + % scale asd/psd + Sxx(jj) = A2ns/fs/S2; + S(jj) = A2ns/S12; + % scale sqrt(variance) + devxx(jj) = sqrt(B2ns/fs^2/S2^2); + dev(jj) = sqrt(B2ns/S12^2); + + end + + varargout{1} = S; + varargout{2} = Sxx; + varargout{3} = dev; + varargout{4} = devxx; + varargout{5} = ENBW; +end +