diff m-toolbox/classes/+utils/@math/welchdft.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/+utils/@math/welchdft.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,76 @@
+% WELCHDFT welch method with dft
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% WELCHDFT comput welch'averaged periodogram with dft
+% 
+% CALL 
+% Sf = welchdft(x,fs,f,Ns,olap,navs,order,win,psll)
+% Sf = welchdft(x,fs,f,Ns,olap,navs,order,win,[])
+% Sf = welchdft(x,fs,f,[],olap,navs,order,win,psll)
+% Sf = welchdft(x,fs,f,[],olap,navs,order,win,[])
+% 
+% 
+% INPUT
+% 
+% - x, data series, Nx1 double
+% - fs, sampling frequency Hz, 1x1 double
+% - f, frequenci vector Hz, 1x1 double
+% - Ns, length of overlapping segments
+% - olap, overlap percentage
+% - navs, number of desired averages
+% - order, detrend order, -1,0,1,2,3,4,...
+% - win, window name. e.g 'BH92'
+% - psll, for Kaiser window only
+% 
+% REFERENCES
+% 
+% D. B. Percival and A. T. Walden, Spectral Analysis for Physical
+% Applications (Cambridge University Press, Cambridge, 1993) p 291.
+% 
+% L Ferraioli 28-03-2011
+%
+% $Id: welchdft.m,v 1.1 2011/03/28 16:37:23 luigi Exp $
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function Sf = welchdft(x,fs,f,Ns,olap,navs,order,win,psll)
+
+  N = numel(x);
+  if isempty(olap)
+    % compute shift factor
+    n = floor((N-Ns)/(navs-1));
+  else
+    if olap>1
+      olap = olap/100;
+    end
+    % compute Ns
+    Ns = floor(N/(olap*(navs-1)+1));
+    % compute shift factor
+    n = olap*Ns;
+  end
+  
+  Nf = numel(f);
+  Sf = zeros(Nf,1);
+  
+  % run welch averages
+  for ii=1:navs
+    idx1 = n*(ii-1)+1;
+    idx2 = n*(ii-1)+Ns;
+    if idx2>N
+      break
+    end
+    seg = x(idx1:idx2);
+    
+    % get estimate for a segment
+    segxx = utils.math.computeDftPeriodogram(seg,fs,f,order,win,psll);
+    % update sum
+    Sf = Sf + segxx;
+  end
+  % complete average
+  Sf = Sf./navs;
+
+
+
+
+
+
+
+
+end
\ No newline at end of file