0001 function [s,f,t]=nt_sgram(x,window,noverlap,nfft,sr,flags)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 nt_greetings;
0019
0020 if nargin<1; error('!'); end
0021 if nargin<2; window=[]; end
0022 if nargin<3; noverlap=[]; end
0023 if nargin<4; nfft=[]; end
0024 if nargin<5; sr=[]; end
0025 if nargin<6; flags=[]; end
0026
0027 if isempty(window)
0028 window=2^nextpow2(round(size(x,1)/8));
0029 end
0030 window=window(:);
0031 if numel(window)==1;
0032 window=hanning(window);
0033 end
0034 if isempty(noverlap)
0035 noverlap=floor(numel(window)/2);
0036 end
0037 if isempty(nfft)
0038 nfft=2^nextpow2(numel(window));
0039 end
0040 if isempty(sr)
0041 sr=1;
0042 end
0043
0044
0045 x=reshape(x,[size(x,1), prod(size(x))/size(x,1)]);
0046
0047 nframes=floor( (size(x,1)-numel(window))/noverlap ) + 1;
0048 if nframes<1; error('data too short for window size'); end
0049
0050 s=zeros(nfft/2+1,nframes);
0051
0052 for k=1:nframes
0053 start=(k-1)*noverlap;
0054 xx=nt_vecmult(x(start+1:start+size(window),:),window);
0055 if ~isempty(flags) & strcmp(flags,'demean');
0056 xx=nt_demean(xx);
0057 end
0058 XX=abs(fft(xx,nfft)).^2;
0059 s(:,k)=sum(XX(1:(nfft/2+1),:),2);
0060 end
0061
0062 f=(0:nfft/2)*sr/nfft;
0063 t= (numel(window)/2 + (0:nframes-1)*noverlap) / sr;
0064
0065
0066
0067 if nargout==0;
0068 ss=s.^(1/5);
0069
0070
0071
0072 imagesc(ss);
0073 ytick=niceticks(sr/2);
0074 set(gca,'ytick',1+ytick*nfft/sr, 'yticklabel',num2str(ytick'));
0075 ylabel('Hz');
0076 xtick=niceticks(size(x,1)/sr);
0077 set(gca,'xtick',1+xtick/noverlap*sr - nfft/2/noverlap, 'xticklabel',num2str(xtick'));
0078 xlabel('s');
0079 set(gca,'tickdir','out')
0080 s=[];t=[];f=[];
0081 axis xy
0082 end
0083
0084