Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/spectrogram.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/spectrogram.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,57 @@ +function [array,raw] = spectrogram(wave,segsize,nlap,ntrans); +%function array = spectrogram(wave,segsize,nlap,ntrans); +% defaults spectrogram(wave,128,8,4) +% nlap is number of hamming windows overlapping a point; +% ntrans is factor by which transform is bigger than segment; +% returns a spectrogram 'array' with fourth root of power, +% filter smoothed and formatted for display. + +% Added option to return raw spectrogram.... Malcolm 5/26/95 +% Added code so that input could be any direction ... Malcolm 5/26/95 +% (c) 1998 Interval Research Corporation + +if nargin < 4; ntrans=4; end +if nargin < 3; nlap=8; end +if nargin < 2; segsize=128; end + +[r c] = size(wave); +if (r < c) + wave = filter([1 -0.95],[1],wave'); +else + wave = filter([1 -0.95],[1],wave); +end + +s = length(wave); +nsegs = floor(s/(segsize/nlap))-nlap+1; +array = zeros(ntrans/2*segsize,nsegs); +window = 0.54-0.46*cos(2*pi/(segsize+1)*(1:segsize)'); +for i = 1:nsegs + seg = zeros(ntrans*segsize,1); % leave half full of zeroes + seg(1:segsize) = ... + window.*wave(((i-1)*segsize/nlap+1):((i+nlap-1)*segsize/nlap)); + seg = abs(fft(seg)); + % reverse for image display + array(:,i) = seg(((ntrans/2*segsize)+1):(ntrans*segsize)); +end + +if nargout > 1 + raw = array; +end + +array = array .* array; % back into power domain for smoothing + +for i=1:nsegs % smooth the spectral slices + array(:,i) = filter([.2 1 .2],[1],array(:,i)); +end + +for i=1:ntrans/2*segsize % smooth the channels + array(i,:) = filter([.2 1 .2],[1],array(i,:)); +end + +% compress with square root of amplitude (fourth root of power) +off = 0.0001*max(max(array)); % low end stabilization offset, +array = (off+array).^0.25-off^0.25; % better than a threshold hack! +array = 255/max(max(array))*array; + + +