wolffd@0: function [array,raw] = spectrogram(wave,segsize,nlap,ntrans); wolffd@0: %function array = spectrogram(wave,segsize,nlap,ntrans); wolffd@0: % defaults spectrogram(wave,128,8,4) wolffd@0: % nlap is number of hamming windows overlapping a point; wolffd@0: % ntrans is factor by which transform is bigger than segment; wolffd@0: % returns a spectrogram 'array' with fourth root of power, wolffd@0: % filter smoothed and formatted for display. wolffd@0: wolffd@0: % Added option to return raw spectrogram.... Malcolm 5/26/95 wolffd@0: % Added code so that input could be any direction ... Malcolm 5/26/95 wolffd@0: % (c) 1998 Interval Research Corporation wolffd@0: wolffd@0: if nargin < 4; ntrans=4; end wolffd@0: if nargin < 3; nlap=8; end wolffd@0: if nargin < 2; segsize=128; end wolffd@0: wolffd@0: [r c] = size(wave); wolffd@0: if (r < c) wolffd@0: wave = filter([1 -0.95],[1],wave'); wolffd@0: else wolffd@0: wave = filter([1 -0.95],[1],wave); wolffd@0: end wolffd@0: wolffd@0: s = length(wave); wolffd@0: nsegs = floor(s/(segsize/nlap))-nlap+1; wolffd@0: array = zeros(ntrans/2*segsize,nsegs); wolffd@0: window = 0.54-0.46*cos(2*pi/(segsize+1)*(1:segsize)'); wolffd@0: for i = 1:nsegs wolffd@0: seg = zeros(ntrans*segsize,1); % leave half full of zeroes wolffd@0: seg(1:segsize) = ... wolffd@0: window.*wave(((i-1)*segsize/nlap+1):((i+nlap-1)*segsize/nlap)); wolffd@0: seg = abs(fft(seg)); wolffd@0: % reverse for image display wolffd@0: array(:,i) = seg(((ntrans/2*segsize)+1):(ntrans*segsize)); wolffd@0: end wolffd@0: wolffd@0: if nargout > 1 wolffd@0: raw = array; wolffd@0: end wolffd@0: wolffd@0: array = array .* array; % back into power domain for smoothing wolffd@0: wolffd@0: for i=1:nsegs % smooth the spectral slices wolffd@0: array(:,i) = filter([.2 1 .2],[1],array(:,i)); wolffd@0: end wolffd@0: wolffd@0: for i=1:ntrans/2*segsize % smooth the channels wolffd@0: array(i,:) = filter([.2 1 .2],[1],array(i,:)); wolffd@0: end wolffd@0: wolffd@0: % compress with square root of amplitude (fourth root of power) wolffd@0: off = 0.0001*max(max(array)); % low end stabilization offset, wolffd@0: array = (off+array).^0.25-off^0.25; % better than a threshold hack! wolffd@0: array = 255/max(max(array))*array; wolffd@0: wolffd@0: wolffd@0: